我记录了对我网站的每一个请求。我非常了解在执行包含来自查询字符串的数据的任何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 STRINGS的代码或EVAL代码
在阅读了大量评论之后,@ 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";
}