热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

from: https://www.zhihuifly.com/t/topic/1090 讲得非常清晰

分块传输编码在WEB安全中的应用

0x01 分块传输编码概念

***对分块传输编码的描述:

分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。(使用HTTP 1.0协议,服务器会主动放弃chunked编码。)

《HTTP权威指南》P373对分块传输编码的解释:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

0x02 分块传输编码格式

标准的分块传输编码格式如下:

php [chunk size][\r\n][chunk data][\r\n][chunk size][\r\n][chunk data][\r\n][chunk size = 0][\r\n][\r\n]
chunk size是以十六进制的ASCII码表示,chunk数据以0长度的chunk块结束,也就是(30 0d 0a 0d 0a)。

以下格式也可被识别:

php [chunk size;other data][\r\n][chunk data]
其中的分号之后的other data是无关数据。

0x03 分块传输例子

一个简单的分块传输HTTP请求如下:

POST /inject.php HTTP/1.1
Accept-Encoding: gzip,deflate
Transfer-Encoding: chunked
Connection: close
Accept: */*
Host: 172.20.10.2:8011
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 48

6;kxebH
id=123
b;pAo6m
12345678911
0

我们传输的数据主体id=123+12345678911分块后分别是6位和11位,上面的6和b就是块数据长度的16进制数,

>>> hex(6)
'0x6'
>>> hex(11)
'0xb'
>>>

我们在服务器输出参数id的值:

HTTP/1.1 200 OK
Date: Fri, 24 May 2019 02:17:07 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.17
Content-Length: 14
Connection: close
Content-Type: text/html

12312345678911

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

可见块数据被服务器自动解码合并输出。

0x04 分块传输应用

根据分块传输原理,这种发包方式用于Bypass基于流量特征检测的WAF应该会很有作用。
以SQL注入攻击为例,我们来分析下sqlmap最新版(2019.5.24下载的)如何利用分块传输绕过WAF进行SQL注入。

lib/core/common.py行5160的chunkSplitPostData()函数实现对数据主体进行分块传输编码:

def chunkSplitPostData(data):
    """
    Convert POST data to chunked transfer-encoded data (Note: splitting done by SQL keywords)

    >>> random.seed(0)
    >>> chunkSplitPostData("SELECT username,password FROM users")
    '5;4Xe90\\r\\nSELEC\\r\\n3;irWlc\\r\\nT u\\r\\n1;eT4zO\\r\\ns\\r\\n5;YB4hM\\r\\nernam\\r\\n9;2pUD8\\r\\ne,passwor\\r\\n3;mp07y\\r\\nd F\\r\\n5;8RKXi\\r\\nROM u\\r\\n4;MvMhO\\r\\nsers\\r\\n0\\r\\n\\r\\n'
    """

    length = len(data)
    retVal = ""
    index = 0

    while index = length:
            chunkSize = length - index

        salt = randomStr(5, alphabet=string.ascii_letters + string.digits)

        while chunkSize:
            candidate = data[index:index + chunkSize]

            if re.search(r"\b%s\b" % '|'.join(HTTP_CHUNKED_SPLIT_KEYWORDS), candidate, re.I):
                chunkSize -= 1
            else:
                break

        index += chunkSize
        retVal += "%x;%s\r\n" % (chunkSize, salt)
        retVal += "%s\r\n" % candidate

    retVal += "0\r\n\r\n"

    return retVal

  

如上可见,这里严格按照分块传输编码的规范,并对敏感关键词进行分割,敏感关键词在这里定义:

lib/core/settings.py行808:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

这几个关键词明显不够,我们可以根据自己的需要添加一下。

对了,还需要添加chunked的请求头,在lib/request/connect.py中:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

尝试利用他的--chunked参数进行分块传输注入:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

可见完美注入,再查看TCP流量:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

SQLMAP实现得很优雅。已经不需要自己来写tamper。

0x05 分块传输应用场景拓展

基于HTTP的攻击方式怎么能只局限于SQL注入呢,其实绕过WAF进行XSS、CSRF、s-s-rF、命令注入等攻击都可以通过分块传输来实现。

1. 代理实现

以XSS为例:
使用代理实现请求体更改,已有人实现(https://github.com/4rat/sqlmap\_chunked\_proxy):

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

运行脚本即监听9999端口,浏览器配置代理127.0.0.1:9999 。

进行XSS:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

数据包情况:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

服务器解析情况:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

2. burp插件

https://github.com/c0ny1/chunked-coding-converter

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

下图是一个最原始的XSS攻击数据包,这里尝试进行一次最原生的XSS攻击,流量特征非常明显了:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

使用插件进行分块传输:‘

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

完美X进去:

分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原

0x06 参考

  1. ***:《分块传输编码》
  2. 《HTTP权威指南》
  3. SQL注入利用分块编码传输绕过[该方法可绕某狗]

    原理:
    在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,post请求报文中的数据部分需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。
    1. 开启上个实验中已关闭的content-length自动更新。给post请求包加入Transfer-Encoding: chunked后,将数据部分id=1 and 1=1进行分块编码(注意长度值必须为十六进制数),每一块里长度值独占一行,数据占一行如图八所示。
    分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原
    2.将上面图八数据包的
    id=1 and 1=1
    改为
    id=1 and 1=2
     即将图八中所标的第4块的1改为2。如图九所示没有返回数据,payload生效。
    分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原
     
    注意:分块编码传输需要将关键字and,or,select ,union等关键字拆开编码,不然仍然会被waf拦截。编码过程中长度需包括空格的长度。最后用0表示编码结束,并在0后空两行表示数据包结束,不然点击提交按钮后会看到一直处于waiting状态。

推荐阅读
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 本文介绍了在Ubuntu系统中清理残余配置文件和无用内容的方法,包括清理残余配置文件、清理下载缓存包、清理不再需要的包、清理无用的语言文件和清理无用的翻译内容。通过这些清理操作可以节省硬盘空间,提高系统的运行效率。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
author-avatar
玉临风居士
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有