共计 1708 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | 有段时间一直热衷于研究各种 waf 绕过,一般来说,云 WAF 可以通过找到网站真实 IP 来绕过,硬件 waf 也常因为 HTTP 协议解析差异导致绕过,但是,代码层的防护往往只能从代码逻辑里寻找绕过思路。 |
在一些网站通常会在公用文件引入全局防护代码,因此,我收集了网络上常见的 PHP 全局防护代码进行分析。第一次看到 safe3 的防注入代码,花了不少时间去研究如何绕过,我在笔记里记下了一句话:如果正面怼正则,实在想不到绕过的方式。
直到前几天,我在 T00LS 论坛里看到有人也问起了同一段防注入代码的绕过方式,在这个帖子的回复了看到了一个绕过姿势。这也正是安全社区最大的魅力,你总会在别人的回复里找到很有意思的思路或技巧。
绕过思路
利用 preg_match 函数正则匹配的字符串长度限制绕过,PHP5.3 之前 preg_match 函数阈值默认为 10w,PHP5.3 开始默认值为 100w。
测试情况
safe3 防注入代码
//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.+?(>||| 操作 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 "404: Not Found"; | |
//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 的时候,可以绕过防注入代码,获取数据库信息。
正文完
星哥玩云-微信公众号
