Как определить, содержит ли строка код PHP? PHP - PullRequest
2 голосов
/ 16 апреля 2019

Я веду учет каждого запроса на мой сайт.Мне хорошо известны измерения безопасности, которые необходимо выполнить перед выполнением любого запроса MySQL, который содержит данные, поступающие из строк запроса.Я максимально очищаю его от инъекций, и до сих пор все тесты были успешными, используя:

htmlspecialchars, strip_tags, mysqli_real_escape_string.

Но в журналах посещенных страниц я нахожу строки запросов неудачных попыток взлома, которые содержат много php-кода:

?1=%40ini_set%28"display_errors"%2C"0"%29%3B%40set_time_limit%280%29%3B%40set_magic_quotes_runtime%280%29%3Becho%20%27->%7C%27%3Bfile_put_contents%28%24_SERVER%5B%27DOCUMENT_ROOT%27%5D.%27/webconfig.txt.php%27%2Cbase64_decode%28%27PD9waHAgZXZhb

В предыдущем примере мы видим:

display_errors, set_time_limit, set_magic_quotes_runtime, file_put_contents

Другой пример:

/?s=/index/%5Cthink%5Capp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=ctlpy.php&vars[1][]=<?php @assert($_REQUEST["ysy"]);?>ysydjsjxbei37$

Это худший вариант, там есть даже некоторые вещи <?php и $_REQUEST["ysy"].Несмотря на то, что я могу его очистить, убрать теги и кодировать < или >, когда я декодирую строку, я вижу тип запросов, которые отправляются.

Есть ли способ обнаружить строкукоторый содержит код php:

filter_var($var, FILTER_SANITIZE_PHP); 

К вашему сведению: это не настоящая функция, я пытаюсь дать представление о том, что я ищу.

или какая-то функция:

function findCode($var){
   return ($var contains PHP) ? true : false
}

Опять же, не реально

Нет необходимости очищать, что было сделано, просто для обнаружения кода PHP встрока.Мне это нужно, потому что я хочу их обнаружить и сохранить в других журналах.

ПРИМЕЧАНИЕ. НИКОГДА НЕ ВЫПОЛНЯЙТЕ И НЕ ИСПОЛЬЗУЙТЕ КОД, ПОЛУЧЕННЫЙ ИЗ СТРОК QUERY

1 Ответ

0 голосов
/ 21 апреля 2019

После прочтения большого количества комментариев @KIKO Software предложила гениальную идею с использованием PHP-токенизатора, но в итоге это оказалось чрезвычайно сложным, потому что строка, которую нужно проанализировать, должна была иметь почти префектный синтаксис, иначе она потерпит неудачу.

Итак, лучшее решение, которое я придумал, - это простая функция, которая пытается найти часто используемые операторы PHP. В моем случае, особенно для строк запроса с внедрением кода.Еще одним преимуществом этого решения является то, что мы можем изменять и добавлять в список столько операторов PHP, сколько захотим. Имейте в виду, что увеличение списка значительно замедлит ваш скрипт. эта функция использует strpos вместо preg_match (regex), так как доказано, что он работает быстрее.

Это не будетнайти 100% PHP-код внутри строки, но вы можете настроить его, чтобы найти столько, сколько требуется, никогда не включайте термины, которые можно использовать на обычном английском языке, такие как 'echo' или 'if'

function findInStr($string, $findarray){
    $found=false;   
    for($i=0;$i<sizeof($findarray);$i++){
        $res=strpos($string,$findarray[$i]);
        if($res !== false){
            $found=true;
            break;
        }
    }
    return $found;
}

Просто используйте:

$search_line=array(
            'file_put_contents',
            '<?=',
            '<?php',
            '?>',
            'eval(',
            '$_REQUEST',
            '$_POST',
            '$_GET',
            '$_SESSION',
            '$_SERVER',
            'exec(',
            'shell_exec(',
            'invokefunction',
            'call_user_func_array',
            'display_errors',
            'ini_set',
            'set_time_limit',
            'set_magic_quotes_runtime',
            'DOCUMENT_ROOT',
            'include(',
            'include_once(',
            'require(',
            'require_once(',
            'base64_decode',
            'file_get_contents',
            'sizeof',
            'array('
        );

if(findInStr("this has some <?php echo 'PHP CODE' ?>",$search_line)){
  echo "PHP found";
}
...