`

【转】PHP的两个特性导致waf绕过注入

    博客分类:
  • PHP
waf 
阅读更多

1、HPP HTTP参数污染

HTTP参数污染指的是,在URL中提交相同键值的两个参数时,服务器端一般会进行一些处理。比如Apache就要以最后一个参数为准,比如:

user.php?id=111&id=222

如果输出$_GET数组,则id的值只会取222,即URL上提交的多余值覆盖了前一个值。

2、一个CTF题目

http://drops.wooyun.org/tips/17248

关于注入的waf绕过,注入点为:

$sql="select * from user where id=".$_REQUEST["id"].";

可以看到了REQUEST进行传递,并且存在如下的waf代码:

functionwaf($str) {  
        if(stripos($str,"select")!==false)  
            die("Be a good person!");  
        if(stripos($str,"union")!==false)  
            die("Be a good person!");  
        ......  
    }    
      
    functionwafArr($arr) {  
        foreach($arras$k=> $v) {  
            waf($k);  
            waf($v);  
        }  
    }    
      
    wafArr($_GET);  
    wafArr($_POST);  
    wafArr($_COOKIE);  
    wafArr($_SESSION);  
      
    functionstripStr($str) {  
        if(get_magic_quotes_gpc())  
            $str= stripslashes($str);  
        returnaddslashes(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));  
    }    
      
    $uri= explode("?",$_SERVER['REQUEST_URI']);  
    if(isset($uri[1])) {  
        $parameter= explode("&",$uri[1]);  
        foreach($parameteras$k=> $v) {  
            $v1= explode("=",$v);  
            if(isset($v1[1])) {  
                $_REQUEST[$v1[0]] = stripStr($v1[1]);  
            }  
        }  
    }    
      
    functionstripArr($arr) {  
        $new_arr= array();  
        foreach($arras$k=> $v) {  
            $new_arr[stripStr($k)] = stripStr($v);  
        }  
        return$new_arr;  
    }    
      
    $_GET=stripArr($_GET);  
    $_POST=stripArr($_POST);  
    $_COOKIE=stripArr($_COOKIE);  
    $_SESSION=stripArr($_SESSION);

    这里使用了waf函数分别对GET POST SESSION COOKIE数据进行过滤,并且对这些全局数组进行转义。

 

值得注意的是,这里的$_REQUEST是代码中重新根据$_SERVER[‘REQUEST_URI’]进行拼接,在拼接过程中将参数值进行转义操作。

(1)思路1  使用HPP特性

看似不太可能存在注入,但是使用HPP可以实现。

示例代码:

user.php?id=0 or 1&id%00=1  
user.php?id=0 or 1&%20id=1  
user.php?id=0 or 1?&id=1
    测试代码:
<?php  
      
    function stripArr($arr) {  
        $new_arr = array();  
        foreach ($arr as $k => $v) {  
            $new_arr[stripStr($k)] = stripStr($v);  
        }  
        return $new_arr;  
    }  
      
    function stripStr($str) {  
        if (get_magic_quotes_gpc())  
            $str = stripslashes($str);  
        return addslashes(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));  
    }  
      
    $uri = explode("?",$_SERVER['REQUEST_URI']);  
    if(isset($uri[1])) {  
        $parameter = explode("&",$uri[1]);  
        foreach ($parameter as $k => $v) {  
            $v1 = explode("=",$v);  
            if (isset($v1[1])) {  
                $_REQUEST[$v1[0]] = stripStr($v1[1]);  
            }  
        }  
    }  
    var_dump($_GET) ;  
      
    var_dump($_REQUEST) ;  
      
    ?>

输出结果:

可以看到,这里的GET数组取到了最后一个值,不会触发waf,而REQUEST数据中,id则为我们的注入语句,这样

利用这两者之间的差异,我们可以绕过waf函数的检测,并且利用之前的注入点来实现注入。

(2)思路2: 利用#特性($_SERVER[‘REQUEST_URI’])

在浏览器中,是不会将#号之后的hash内容发送给服务器的,这里利用burp发包,可以将hash的内容发送至服务器,比如发送:

/#?id=1

这里GET数组为空,REQUEST则输出为/#?id=1,这样,就可以绕过waf函数对GET数组的判断,

并且在REQUEST(这里主要因为REQUEST数组是使用了REQUEST_URI进行了重组)中携带注入的语句,绕过了waf检测。


 

3、总结

这种特性导致的漏洞场景比较特殊,首先,CTF中模拟的场景是waf函数 只对GET,POST,SESSION,COOKIES全局数组进行的处理,注入点为REQUEST,在场景中,代码对REQUEST数组通 过$_SERVER[‘REQUEST_URI’],使用&分割重新组装的,这种代码处理可能是由于程序员想对REQUEST数组进行转义或者一 些净化处理才加进来的。

利用:

(1)HPP特性,提交重复参数内容,PHP处理参数时会覆盖,但是程序拼接时会出现差异,

比如提交:http://127.0.0.1/shell.php?id=0 or 1&id%00=1

GET为id=1,REQUEST为:

'id' =><small>string</small>'0%20or%201'(length=10)
  'id%00' =><small>string</small>'1'(length=1)
  可以看到,成功将注入内容引入到REQUEST数组中。

(2)利用#符号,#后面的内容不会带入至GET数组中,但是会出现在REQUEST_URI中,所以可以利用这个特性将注入语句带入到REQUEST对象中。

总之,这种特性导致的漏洞场景比较特殊,但是确实比较有趣。

  • 大小: 71.4 KB
  • 大小: 20.2 KB
分享到:
评论

相关推荐

    WAF绕过检测技术

    - Content-Length问题:过大长度的数据包可能导致WAF绕过。 - 解码较弱:对于复杂的编码格式,WAF可能无法有效识别。 - **代理模式**: - 高并发流量:通过发送大量并发请求,可能会迫使WAF进入旁路模式。 #### ...

    过waf免杀大马最新版.zip

    "过waf免杀大马最新版.zip"这个压缩包文件的标题暗示了它包含了一些可能被用于绕过WAF的Web后门程序,即所谓的"大马"(Webshell)。 1. **Webshell**:Webshell是黑客入侵服务器后留下的一个后门,通常是一个小的...

    SQL注入攻击的种类和防范手段,代码教程

    3. **堆叠注入**:在一次请求中注入多条SQL语句,通常用于批量执行操作或绕过某些安全措施。 4. **联合查询注入**:利用已知的两个表之间的联合查询,获取未授权的数据。 5. **自定义函数注入**:如果应用程序允许...

    SQL注入 SQL Injection

    应对SQL注入的解决方案分为两个方面:检测与防御。在检测方面,需要了解如何发现和确认SQL注入点,以及如何自动化地发现注入点。在防御方面,则需要掌握代码层面和平台层面的防御措施。 自动化发现SQL注入点的方法...

    php SQL防注入代码集合

    这种方法有一定的局限性,因为它依赖于关键字的匹配,高级的SQL注入技术可能绕过这种简单的检测方式。 ### 总结 总结来说,PHP SQL防注入代码集合提供了几种防御手段,从对输入的预处理转义到使用正则表达式进行...

    sqli-labs.zip

    9. **Web应用防火墙(WAF)绕过**:了解如何识别和绕过Web应用防火墙,这些防火墙通常用于阻止SQL注入攻击。 10. **自动化工具**:熟悉使用自动化工具,如Burp Suite或SQLMap,它们可以帮助检测和利用SQL注入漏洞。...

    SQL注入攻击.pdf

    5. **UNION查询注入**:利用UNION操作符合并两个或多个SELECT语句的结果集。 三、防御SQL注入的策略 1. **参数化查询/预编译语句**:使用参数化查询,将用户输入的数据与SQL命令分开,避免了直接拼接。 2. **输入...

    第十一节 Sqlmap注入参数2-01

    Sqlmap 通过 Tamper 脚本来绕过 WAF 等防御措施,可以在 tamper 文件夹下找到所有 Sqlmap 自带的 Tamper 脚本。例如,使用以下命令可以设置 Tamper 脚本: `sqlmap.py -u ...

    送强力打狗棒,文末领取

    网上关于安全狗的sql绕过研究,大多数是fuzz绕过的帖子,fuzz方法常常使用注释绕过,涉及到数据库特性,而且广泛用于注释语法的星号(*)可能会被网站自带的防恶意代码模块拦截了,在实践中体验不好。太多fuzz过waf...

    记一次有趣的tp5代码执行1

    总结,这个事件展示了如何在面临WAF和函数禁用的情况下,通过编码和`php://filter`伪协议绕过防护措施,执行恶意代码。对于开发者和运维人员来说,了解这些技巧有助于增强系统的安全性,及时发现并修复安全漏洞。

    php检测 Phpmyadmin提权漏洞演示

    【标签】:“php检测”和“Phpmyadmin”这两个标签共同强调了该主题的重点,即在PHP环境中,特别关注于Phpmyadmin的安全性。PHP是一种流行的服务器端脚本语言,常用于开发Web应用程序,而Phpmyadmin则是一个用PHP...

    这是一个webshell收集项目

    分析这个文件可以让我们了解Webshell的各种技巧和手法,例如如何隐蔽地植入Webshell,如何通过HTTP请求触发执行命令,以及如何绕过安全防护措施等。 为了防御Webshell攻击,我们需要掌握以下几点: 1. **代码审计*...

    MySQL在不知道列名情况下的注入详解

    5. **绕过WAF策略**: 面对WAF过滤,可以尝试使用各种编码方式(如URL编码、十六进制编码等)或者特殊字符来规避规则。同时,可以尝试不同版本的SQL语法,因为不同版本的MySQL可能对某些函数或关键字有不同的处理...

    深信服新版AF高级A卷-68分.pdf

    - 系统命令注入攻击是指攻击者通过输入特殊字符或系统命令,绕过应用过滤,导致操作系统执行恶意命令。 7. Debian镜像文件: - Debian镜像文件包含了特定的账户信息和系统配置。 - 镜像文件中的Linux系统账户...

    web渗透测试洞察安全教程

    比如SQLmap的tamper脚本编写,可以在自动化SQL注入中绕过WAF(Web应用防火墙)。 11. 安全奇淫怪招:这部分可能包括一些非主流或者高级的渗透技巧和思维,用于提高挖掘和利用漏洞的能力。 教程中还包括了下载链接...

    XXE漏洞详解【内含vulnhub靶场XXE Lab:1详解】

    XXE(XML External Entity)漏洞,全称为XML外部实体注入,是针对使用XML解析器的应用程序的一种安全漏洞。XML是一种标记语言,常用于数据交换,而外部实体是XML文档的一部分,允许引用外部资源,如文件系统、网络...

    信息安全工程师面试题(8).docx

    - **原理**:利用MySQL的GBK编码特性,构造特殊字符序列绕过WAF检测。 - **利用方法**:通过构造包含特定ASCII码值的字符串,使其被视为有效的宽字符,从而实现注入攻击。 #### 九、CRLF注入 - **原理**:通过向...

Global site tag (gtag.js) - Google Analytics