zoukankan      html  css  js  c++  java
  • [转载]利用分块传输绕过WAF进行SQL注入

    原理

    客户端给服务器发送数据的时候,如果我们利用协议去制作payload,就可以绕过http协议的waf,实现SQL注入

     分块传输编码(Chunked transfer encoding)是HTTP中的一种数据传输机制,在HTTP/1.1中,服务器发送给客户端的数据可以分成多个部分,在HTTP/1.1前,数据的发送是由Content-Length去决定的,它规定了一个包的长度,服务器也是按照这个去进行处理的。但是,使用分块传输的时候,数据会被分解出一个个小块,这样服务器就不需要预先知道总数据的大概长度,接收到一个个块进行处理就行了。
    正常我们发送很小的数据是不需要用到分块技术的,而下载大文件,或者发送一些后台需要很复杂的逻辑才能处理的请求的时候,就需要实时生成消息长度,服务器一般会使用Chunked编码。在进行Chunked编码进行传输的时候,响应头会有Transfer-Encoding: Chunked,去表明是使用Chunked编码传输内容的。分块技术的具体过程就是,实体直接被分割成多个块,即是应用层的数据在TCP传输的过程中,不作任何解释,全部理解成二进制流,然后按照MSS的长度切分,然后一起压到TCP协议栈里面,剩下的对这些二进制数据的具体解释,则交由应用层解决

    复现过程

    写一个简单的SQL查询的后台

    <?php
    header('Access-Control-Allow-Origin:*');
    $mysql = new mysqli();
    $mysql->connect('localhost','db_user','db_pass','db_name');
    if (!$mysql){
        echo "error";
        exit(mysqli_connect_error());
    }
    $mysql->set_charset("utf8");
    $num = $_POST['id'];
    $sql = "select * from `student` where id='$num'";
    $result = $mysql->query($sql);
    if (gettype($result) == 'object'){
        $result = $result->fetch_all();
    }
    $number = $result[0][0];
    $username = $result[0][1];
    echo "用户名:".$username."<br>";
    echo $sql."<br>";
    

    首先我们进行正常的请求的数据包是这样的

     而如果我们进行分块传输的话

    进行分块传输的时候,请求头要加上Transfer-Encoding: Chunked,然后POST的数据规则如下

    2   #下面的数据的长度,可以在后面加个分号然后添加注释(2; hello world)
    id  #请求的参数
    2   #下面的数据的长度
    =1  #请求的值,和前面的id连起来
    0   #表明分块请求结束,一个0和两个换行
    

    最后就是大佬写出的插件,安装了一键分块Orz
    https://github.com/c0ny1/chunked-coding-converter  

      

    转载自:xi4or0uji

  • 相关阅读:
    Android(java)学习笔记68:使用proguard混淆android代码
    SGU 194 Reactor Cooling
    关于流量有上下界的网络流问题的求解
    关于最小割的求解方法
    HDU 5311 Hidden String
    POJ 3548 Restoring the digits
    POJ 2062 HDU 1528 ZOJ 2223 Card Game Cheater
    ZOJ 1967 POJ 2570 Fiber Network
    HDU 1969 Pie
    HDU 1956 POJ 1637 Sightseeing tour
  • 原文地址:https://www.cnblogs.com/BOHB-yunying/p/12205068.html
Copyright © 2011-2022 走看看