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

  • 相关阅读:
    PostgreSQL中的partition-wise join
    Partition-wise join
    外观模式 门面模式 Facade 结构型 设计模式(十三)
    桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
    组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
    创建型设计模式对比总结 设计模式(八)
    原型模式 prototype 创建型 设计模式(七)
    单例模式 创建型 设计模式(六)
    建造者模式 生成器模式 创建型 设计模式(五)
    抽象工厂模式 创建型 设计模式(四)
  • 原文地址:https://www.cnblogs.com/BOHB-yunying/p/12205068.html
Copyright © 2011-2022 走看看