栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 网络安全 > Web安全

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

Web安全 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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



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

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

绕过思路

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

测试情况

(1) 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.+?(>|<|=|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 "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."rn");     fclose($Ts); 
  • } ?> 
  • (2) 构建一个sql注入点

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

    require_once('360_safe3.php'); 

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



     

    (3) 绕过姿势

    PHP测试版本:5.2.17

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



    PHP测试版本:5.3.29

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



     

    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/823991.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号