360 php防注入代码绕过思路利用函数正则匹配导致拦截绕过姿势(组图) php mysql pdo 防注入
2022-01-03
一段时间以来,我一直热衷于研究各种 waf 旁路。一般来说,通过查找网站的真实IP可以绕过云WAF。由于 HTTP 协议解析的差异,硬件 waf 经常被绕过。然而360 php防注入代码小程序开发,代码层保护往往只能想方设法绕过代码逻辑。
在某些网站上,公共文件中通常会引入全局保护代码。因此,我收集并分析了互联网上常见的PHP全局保护代码。第一次看到的反注入代码,花了很多时间研究如何绕过。我在笔记里写了一句话:如果是肯定的,我想不出绕过它的方法。
直到前几天看到论坛里也有人问了同样的反注入代码的绕过方法,在这个帖子的回复里看到了绕过手势。这也是安全界最大的魅力所在。你总能从别人的回答中找到有趣的想法或技巧。
绕过想法
使用函数正则匹配绕过字符串长度限制。 PHP5.3之前默认函数阈值为10w360 php防注入代码,PHP5.3开始时默认值为100w。
测试情况
反注入代码
//Code By Safe3
ini_set('date.timezone','Asia/Shanghai');
function customError($errno, $errstr, $errfile, $errline)
{
echo "Error number: [$errno],error on line $errline in $errfile
";
die();
}
set_error_handler("customError",E_ERROR);
$getfilter="'|select|from|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
$postfilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
$cookiefilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){
if(is_array($StrFiltValue))
{
$StrFiltValue=implode($StrFiltValue);
}
if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){
slog("
操作IP: ".$_SERVER["REMOTE_ADDR"]."
操作时间: ".strftime("%Y-%m-%d %H:%M:%S")."
操作页面:".$_SERVER["PHP_SELF"]."
提交方式: ".$_SERVER["REQUEST_METHOD"]."
提交参数: ".$StrFiltKey."
提交数据: ".$StrFiltValue);
@header("http/1.1 404 not found");
print "";
//slog("
操作IP: ".$_SERVER["REMOTE_ADDR"]."
操作时间: ".strftime("%Y-%m-%d %H:%M:%S")."
操作页面:".$_SERVER["PHP_SELF"]."
提交方式: ".$_SERVER["REQUEST_METHOD"]."
提交参数: ".$StrFiltKey."
提交数据: ".$StrFiltValue);
print "Url里含有非法字符串,属于有误操作!... 您还可以返回首页";
;exit();
}
}
//$ArrPGC=array_merge($_GET,$_POST,$_COOKIE);
foreach($_GET as $key=>$value){
StopAttack($key,$value,$getfilter);
}
foreach($_POST as $key=>$value){
StopAttack($key,$value,$postfilter);
}
foreach($_COOKIE as $key=>$value){
StopAttack($key,$value,$cookiefilter);
}
function slog($logs)
{
$toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm";
$Ts=fopen($toppath,"a+");
fputs($Ts,$logs."\r\n");
fclose($Ts);
}
构建SQL注入点
在页面中引入反注入代码:
require_once('360_safe3.php');
参数中拼接SQL语句时,关键字正则匹配导致拦截
绕过姿势
PHP 测试版:5.2.17
当填充的字符串超过10w时,可以绕过反注入码获取数据库信息。
当填充的字符串超过100w时网站制作,可以绕过反注入码获取数据库信息。