在HTTP协议层面绕过WAF

huangxin0506 2024-8-5 505 8/5

在HTTP协议层面绕过WAF

1 原理 

   在HTTP协议层面绕过WAF的原理主要涉及通过发送经过特定处理的payload数据包,使WAF无法识别出其中的恶意内容,但目标服务器(如Apache或Tomcat)能够正常解析并执行。这些技术利用了WAF和服务器在处理HTTP请求和解析数据方面的差异。

在HTTP协议层面绕过WAF

2 实验环境

   使用sqli-labs靶机安全狗环境,其中以sqli-labs-less2为实例演示

   2.1 先将less2源码修改为post参数输入和接收

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-2 **Error Based- Integer**</title>
</head>

<body bgcolor="#000000">

<div style=" margin-top:60px;color:#FFF; font-size:23px; text-align:center">
    Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000">Dhakkan</font><br>
    <font size="3" color="#FFFF00">

    <form method="POST" action="">
        <label for="id">Enter ID:</label>
        <input type="text" name="id" id="id">
        <input type="submit" value="Submit">
    </form>

<?php
// including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);

// take the variables
if (isset($_POST['id'])) {
    $id = $_POST['id'];

    // logging the connection parameters to a file for analysis.
    $fp = fopen('result.txt', 'a');
    fwrite($fp, 'ID:' . $id . "\n");
    fclose($fp);

    // connectivity
    $sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);

    if ($row) {
        echo "<font size='5' color='#99FF00'>";
        echo 'Your Login name: ' . $row['username'];
        echo "<br>";
        echo 'Your Password: ' . $row['password'];
        echo "</font>";
    } else {
        echo '<font color="#FFFF00">';
        print_r(mysql_error());
        echo "</font>";
    }
} else {
    echo "Please input the ID as parameter with numeric value";
}
?>

</font>
</div></br></br></br>
<center>
    <img src="../images/Less-2.jpg" />
</center>
</body>
</html>

在HTTP协议层面绕过WAF

   2.2 waf网站防护设置中打开防止简单的and or方式注入,选择POST内容

在HTTP协议层面绕过WAF

   2.3 利用hackbar插件发送post请求,payload被拦截

在HTTP协议层面绕过WAF

3 利用pipline绕过[该方法经测试会被安全狗拦截]

   原理:

    http协议是由tcp协议封装而来,当浏览器发起一个http请求时,浏览器先和服务器建立起连接tcp连接,然后发送http数据包(即我们用burpsuite截获的数据),其中包含了一个Connection字段,一般值为close,apache等容器根据这个字段决定是保持该tcp连接或是断开。当发送的内容太大,超过一个http包容量,需要分多次发送时,值会变成keep-alive,即本次发起的http请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。

   3.1 关闭burp的Repeater的Content-Length自动更新

在HTTP协议层面绕过WAF

   3.2 使用burp suite抓包后发到重发器,提交后显示被waf拦截

id=1 and 1=1

在HTTP协议层面绕过WAF

   3.3 复制3.2的数据包将其粘贴到重发器 最后第5行 id=1+and+1%3D1 的末尾

在HTTP协议层面绕过WAF

   3.4 将第一个数据包最后第5行 id=1+and+1%3D1 修改为1,再将数据包的Content-Length的值设置为修改后的【id=1】的字符长度即4,最后将Connection字段值设为keep-alive。

在HTTP协议层面绕过WAF

   3.5发送后会返回两个响应包,分别对应两个请求。第一个正常数据包返回了正确内容,第二个包含有效载荷的数据包被某狗waf拦截,说明两数据包都能到达服务器,在面对其他waf时有可能可以绕过。

在HTTP协议层面绕过WAF

4 利用分块编码传输绕过[该方法可绕过安全狗]

   原理:

    在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,post请求报文中的数据部分需要改为用一系列分块来传输。

    每个分块包含十六进制的长度值和数据,长度值独占一行,所有的分块结束最后需要用0独占一行表示结束。

   4.1 开启上个实验中已关闭的content-length自动更新。给post请求包加入Transfer-Encoding: chunked后,将数据部分 id=1 and 1=1 进行分块编码(注意长度值必须为十六进制数),每一块里长度值独占一行,数据占一行

在HTTP协议层面绕过WAF

   4.2 将上面图八数据包的 id=1 and 1=1  改为  id=1 and 1=2 ,页面无显示,payload生效在HTTP协议层面绕过WAF

   4.3 注意

   分块编码传输需要将关键字and、or、select 、union等关键字拆开编码,不然仍然会被waf拦截。

   编码过程中长度需包括空格的长度。最后用0表示编码结束,并在0后空两行表示数据包结束,不然点击提交按钮后会看到一直处于waiting状态

5 利用协议未覆盖进行绕过[同样会被安全狗拦截]

   原理

   HTTP头里的Content-Type一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三种,其中multipart/form-data表示数据被编码为一条消息,页上的每个控件对应消息中的一个部分。所以,当waf没有规则匹配该协议传输的数据时可被绕过。

   5.1 将头部Content-Type改为multipart/form-data; boundary=69 然后设置分割符内的Content-Disposition的name为要传参数的名称,数据部分则放在分割结束符上一行。

在HTTP协议层面绕过WAF

   5.2 由于是正常数据提交,所以从图可知数据是能被apache容器正确解析的,尝试 1 and 1=1 也会被安全狗waf拦截,但如果其他waf没有规则拦截这种方式提交的数据包,那么同样能绕过

在HTTP协议层面绕过WAF

 

   5.3 一般绕waf往往需要多种方式结合使用,只需将数据部分 1 and 1=1 用一个小数点 "." 当作连接符即 1.and 1=1 就可以起到绕过作用。当然,这只是用小数点当连接符所起的作用而已

在HTTP协议层面绕过WAF

6 分块编码+协议未覆盖组合绕过

     在协议未覆盖的数据包中加入Transfer-Encoding: chunked ,然后将数据部分全部进行分块编码

在HTTP协议层面绕过WAF

   注意:第2块,第3块,第7块,和第8块。

   第2块中需要满足

长度值
空行
Content-Disposition:form-data:name="id"
空行

   这种形式,且长度值要将两个空行的长度计算在内(空行长度为2)。

   第3块,即数据开始部分需满足

长度值 
空行
数据</code>

   形式,且需将空行计算在内。

   第7块,即分割边界结束部分,需满足

长度值
空行
分割结束符
空行

   形式,且计算空行长度在内。

   第8块需满足

0 
空行
空行

   形式。如果不同时满足这四块的形式要求,payload将不会生效。

7 burp suite分块编码扩展 chunked-coding-converter

  7.1 下载后,使用IDEA——>打开解压文件——>文件——>项目结构——>工件——>添加jar包——>构建——>burp suite中Extender——>添加即可使用

   7.2 在设定中选择应用于重复器

在HTTP协议层面绕过WAF

在HTTP协议层面绕过WAF

   7.3 一键分块编码,并且还自动添加注释,成功绕过安全狗

在HTTP协议层面绕过WAF

    几乎所有可以识别Transfer-Encoding数据包的WAF,都没有处理分块数据包中长度标识处的注释,导致在分块数据包中加入注释的话,WAF就识别不出这个数据包了。

 

 

- THE END -

huangxin0506

8月05日23:45

最后修改:2024年8月5日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论