文中摘自微信公众平台「Bypass」,创作者Bypass。转截文中请联络Bypass微信公众号。
有一段时间一直热衷科学研究各种各样waf绕过,一般来说,云WAF可以根据寻找网址真正IP来绕过,硬件配置waf也常由于HTTP协议书分析差别造成绕过,可是,代码层的防护通常只有从代码逻辑性里找寻绕过思路。

在一些网址通常会在公共文档引进全局防护代码,因而,我搜集了互联网上多见的PHP全局防护代码开展剖析。第一次见到safe3的防注入代码,花了许多時间去科学研究怎样绕过,我还在手记里记录下来了一句话:假如正脸怼正则表达式,确实意想不到绕过的方法。
直到前几日,我还在T00LS社区论坛里见到有些人也问及了同一段防注入代码的绕过方法,在这个贴子的答复了看到了一个绕过姿态。这也恰好是安全社区较大的风采,你都会在他人的回应里寻找很好玩儿的思路或方法。
绕过思路
运用preg_match函数公式正则匹配的字符串长度限定绕过,PHP5.3以前preg_match函数公式阀值默认设置为10w,PHP5.3逐渐初始值为100w。
检测状况
(1) safe3 防注入代码
<?php//CodeBySafe3ini_set('date.timezone','Asia/Shanghai');functioncustomError($errno,$errstr,$errfile,$errline){echo"<b>Errornumber:</b>[$errno],erroronline$errlinein$errfile<br/>";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)";functionStopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){if(is_array($StrFiltValue)){$StrFiltValue=implode($StrFiltValue);}if(preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){slog("<br><br>实际操作IP:".$_SERVER["REMOTE_ADDR"]."<br>操作時间:".strftime("%Y-%m-%d%H:%M:%S")."<br>实际操作网页页面:".$_SERVER["PHP_SELF"]."<br>递交方法:".$_SERVER["REQUEST_METHOD"]."<br>递交主要参数:".$StrFiltKey."<br>递交数据信息:".$StrFiltValue);@header("http/1.1404notfound");print"<html><title>404:NotFound</title>";//slog("<br><br>实际操作IP:".$_SERVER["REMOTE_ADDR"]."<br>操作時间:".strftime("%Y-%m-%d%H:%M:%S")."<br>实际操作网页页面:".$_SERVER["PHP_SELF"]."<br>递交方法:".$_SERVER["REQUEST_METHOD"]."<br>递交主要参数:".$StrFiltKey."<br>递交数据信息:".$StrFiltValue);print"<body>Url里带有不法字符串数组,归属于有操作失误!... <ahref='/'>您还能够回到首页</a></body></html>";;exit();}}//$ArrPGC=array_merge($_GET,$_POST,$_COOKIE);foreach($_GETas$key=>$value){StopAttack($key,$value,$getfilter);}foreach($_POSTas$key=>$value){StopAttack($key,$value,$postfilter);}foreach($_COOKIEas$key=>$value){StopAttack($key,$value,$cookiefilter);}functionslog($logs){$toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm";$Ts=fopen($toppath,"a ");fputs($Ts,$logs."\r\n");fclose($Ts);}?>
(2) 搭建一个sql注入点
在网页中引进防引入编码:
require_once('360_safe3.php');
当主要参数中拼凑sql语句时,开启关键词正则匹配造成阻拦。

(3) 绕开姿态
PHP检测版本号:5.2.17
当添充字符串数组超出10w的情况下,可以绕开防引入编码,获得数据库查询信息内容。

PHP检测版本号:5.3.29
当添充字符串数组超出100w的情况下,可以绕开防引入编码,获得数据库查询信息内容。
