当前位置:主页 > 查看内容

一段困扰许久的防注入代码

发布时间:2021-05-29 00:00| 位朋友查看

简介:本文转载自微信公众号「Bypass」,作者Bypass。转载本文请联系Bypass公众号。 有段时间一直热衷于研究各种waf绕过,一般来说,云WAF可以通过找到网站真实IP来绕过,硬件waf也常因为HTTP协议解析差异导致绕过,但是,代码层的防护往往只能从代码逻辑里寻找绕……

本文转载自微信公众号「Bypass」,作者Bypass。转载本文请联系Bypass公众号

有段时间一直热衷于研究各种waf绕过,一般来说,云WAF可以通过找到网站真实IP来绕过,硬件waf也常因为HTTP协议解析差异导致绕过,但是,代码层的防护往往只能从代码逻辑里寻找绕过思路。

在一些网站通常会在公用文件引入全局防护代码,因此,我收集了网络上常见的PHP全局防护代码进行分析。第一次看到safe3的防注入代码,花了不少时间去研究如何绕过,我在笔记里记下了一句话:如果正面怼正则,实在想不到绕过的方式。

直到前几天,我在T00LS论坛里看到有人也问起了同一段防注入代码的绕过方式,在这个帖子的回复了看到了一个绕过姿势。这也正是安全社区最大的魅力,你总会在别人的回复里找到很有意思的思路或技巧。

绕过思路

利用preg_match函数正则匹配的字符串长度限制绕过,PHP5.3之前preg_match函数阈值默认为10w,PHP5.3开始默认值为100w。

测试情况

(1) safe3 防注入代码

  1. <?php 
  2. //Code By Safe3  
  3. ini_set('date.timezone','Asia/Shanghai'); 
  4. function customError($errno, $errstr, $errfile, $errline) 
  5.     echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />"; 
  6.     die(); 
  7. set_error_handler("customError",E_ERROR); 
  8. $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)"
  9. $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)"
  10. $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)"
  11. function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){ 
  12.  
  13.     if(is_array($StrFiltValue)) 
  14.     { 
  15.         $StrFiltValue=implode($StrFiltValue); 
  16.     } 
  17.     if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){ 
  18.         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); 
  19.         @header("http/1.1 404 not found");  
  20.         print "<html><title>404: Not Found</title>"; 
  21.         //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); 
  22.         print "<body>Url里含有非法字符串,属于有误操作!... <a href='/'>您还可以返回首页</a></body></html>"; 
  23.   ;exit(); 
  24.     } 
  25. //$ArrPGC=array_merge($_GET,$_POST,$_COOKIE); 
  26. foreach($_GET as $key=>$value){ 
  27.     StopAttack($key,$value,$getfilter); 
  28. foreach($_POST as $key=>$value){ 
  29.     StopAttack($key,$value,$postfilter); 
  30. foreach($_COOKIE as $key=>$value){ 
  31.     StopAttack($key,$value,$cookiefilter); 
  32. function slog($logs) 
  33.     $toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm"; 
  34.     $Ts=fopen($toppath,"a+"); 
  35.     fputs($Ts,$logs."\r\n"); 
  36.     fclose($Ts); 
  37. ?> 

(2) 构建一个sql注入点

在页面中引入防注入代码:

  1. require_once('360_safe3.php'); 

当参数中拼接sql语句时,触发关键字正则匹配导致拦截。

(3) 绕过姿势

PHP测试版本:5.2.17

当填充字符串超过10w的时候,可以绕过防注入代码,获取数据库信息。

PHP测试版本:5.3.29

当填充字符串超过100w的时候,可以绕过防注入代码,获取数据库信息。


本文转载自网络,原文链接:http://mp.weixin.qq.com/s?__biz=MzA3NzE2MjgwMg==&mid=2448906511&idx=1&sn=3f700f710470ea52cbef8ac525b3e6bd&chksm=8b55c952bc22404491b6ab40e2cf940bda059fbda3c4bc3c2484a875bae24b91fff1806f50df&mpshare=1&s
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐