当前位置: 首页 > news >正文

初步学习http请求走私

前言

最先开始接触到http请求走私是在今年的iscc线上赛的一道题目,当时因为没有题目环境等种种原因没有复现这道题目,所以这次通过这篇文章了解什么是http请求走私攻击。

漏洞成因

先解释一下什么是长连接以及content-length和transfer-encoding这三个名词。

什么是长连接

学过计算机网络原理都知道,http是无状态的,什么是无状态,http请求是建立在tcp连接之上的,每一个http请求发出响应后就会断开tcp连接,而在下一个http请求发出前又重新三次握手建立连接。这么做很明显很明显导致了http请求效率低下,所以发明者们就引入了长连接的概念。在http请求头部添加Connection: keep-alive这个字段,在客户端或者服务器使用这个字段后,在以后对相同服务器发出的请求后,会重用上次的tcp连接,不需要再次握手,这么做大大节约了服务器资源,这个特性在http1.1默认开启。

CL(Content-Length)

在建立长连接的基础上,服务器并不清楚一个http请求是否已经发送完毕,所以就引入了Content-Length字段,这个内容就表示了请求体的长度,就比如一个简单的http请求。

POST / HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length:8

a\r\n
abc\r\n
b

这个Content-Length设置为8,这里的\r\n是一个换行,代表两个字节,在这个http请求发出后,经过服务器处理,在服务器识别了CL后,它会认为abc以上的内容是一个完整的http请求,而这个b就是非法的,就被滞留到缓存区内。

TE(transfer-encoding)

Transfer-Encoding是指定用于传输请求主体的编码方式。我们不需要具体知道它是什么,当我们的TE设置为chunk的时候,就会把0当作终止块结束本次的http请求。看一个http请求。

POST / HTTP/1.1
Host: your-lab-id.web-security-academy.net
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
Transfer-Encoding: chunked

0

G

我的burpsuite官方靶场抓不了包,我也没有深究是什么问题。用靶场例子说一下,在后端服务器接收到请求时,它会优先处理TE,也就是0以上的部分是一个正常的http请求,也就把G丢在了缓存区。

漏洞原理

在如今的web架构中,客户端-服务端这种一对一的模式已经很少见了,服务端被分为了前端服务器和后端服务器。前端服务器主要做的事情就是限制一些错误的以及非法访问的http请求,而后端服务器就没必要做安全检测,直接处理http请求。那么,如果前后端服务器判断请求包边界的规则不一致的话,攻击者可能会精心构造一个数据包来绕过前端的服务器而去访问禁止访问的服务或者端口。

还是看上一个的例子,当CL和TE字段同时存在,前端服务器优先处理CL字段。

0\r\n
\r\n
G

加上换行正好是六个字节,也就是说在前端服务器看来,这就是一个正常的http请求。而后端服务器处理时,它会忽略掉CL,优先处理TE字段,那么0就是http请求的结束标志,这个G丢在缓存区,待下一次请求来临,就拼接上去。

GPOST / HTTP/1.1
Host: your-lab-id.web-security-academy.net
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

这就导致了请求方式成了GPOST了。这就是前后端处理数据包边界不一致所带来的问题。也就是http请求走私漏洞。

当然,前端服务器还可能优先级处理TE,而后端服务器优先级处理CL,要根据前后端服务器处理字段的优先级构造恶意数据包。

CTF实战

[RoarCTF 2019]Easy Calc

我们直接查看源码。

<?php
error_reporting(0);
if(!isset($_GET['num'])){
    show_source(__FILE__);
}else{
        $str = $_GET['num'];
        $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
        foreach ($blacklist as $blackitem) {
                if (preg_match('/' . $blackitem . '/m', $str)) {
                        die("what are you want to do?");
                }
        }
        eval('echo '.$str.';');
}
?> 

这里直接上payload,

calc.php? num=1;
var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

当然,这里前端服务器存在waf,而预期解是在num变量前加上空格,从而使服务器无法解析绕过waf。然而我们还可以利用http请求走私来直接绕过前端服务器。

我们在数据包中添加两个CL字段,返回400的同时还把flag给带出来了。

这是为什么呢? 如果服务器不严格按照规范,当数据包中存在两个CL,那么前端服务器就会按照第一个CL字段处理,而后端服务器就会按照第二个CL处理,虽然会返回400,但是请求也交给了后端服务器处理,所以也就将flag的值一并返回给了客户端。

而这种CL-TE的走私类型也是可以得出flag的。

 结语

通过此篇文章只是基础的认识到什么是http请求走私,而在今后会通过相关ctf题目更加深入理解http请求走私的攻击方式以及思路。

相关文章:协议层安全相关《http请求走私与CTF利用》_合天网安实验室的博客-CSDN博客

相关文章:

  • DeviceIoControl获取硬盘信息
  • 47.全排列II | 90.子集II
  • 快鲸智慧楼宇系统在楼宇管理中发挥了哪些积极作用?
  • vsftp配置多用户
  • Self-supervised Video Transformer 阅读
  • ArcGisRuntime100.14绘制曲线
  • 榜一的蔑视!阿里专家手写Spring全家桶笔记,整2000页
  • 置业小技能:按揭相关事项
  • 存储更弹性,详解 Fluid “ECI 环境数据访问” 新功能
  • 高精度随流检测技术助力金融行业实现智能运维
  • windows上Qt5.15+openssl1.1.1+msvs2022静态编译32位版本的笔记
  • CentOS系统下,配制nginx访问favicon.ico
  • 1-十四烷基-3-甲基咪唑六氟磷酸盐([C14MIm][PF6])修饰纳米SiO2二氧化硅(mg级瓶装)
  • stm32f4xx-定时器
  • (过滤器)Filter和(监听器)listener
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 《Java编程思想》读书笔记-对象导论
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • C++入门教程(10):for 语句
  • CentOS从零开始部署Nodejs项目
  • Debian下无root权限使用Python访问Oracle
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • input的行数自动增减
  • JavaScript-Array类型
  • JavaScript类型识别
  • js 实现textarea输入字数提示
  • node入门
  • Python学习之路16-使用API
  • React16时代,该用什么姿势写 React ?
  • Tornado学习笔记(1)
  • Zsh 开发指南(第十四篇 文件读写)
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 简析gRPC client 连接管理
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 入口文件开始,分析Vue源码实现
  • 用jquery写贪吃蛇
  • 正则表达式-基础知识Review
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #前后端分离# 头条发布系统
  • #微信小程序:微信小程序常见的配置传旨
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (4)STL算法之比较
  • (day 12)JavaScript学习笔记(数组3)
  • (Java数据结构)ArrayList
  • (js)循环条件满足时终止循环
  • (二)hibernate配置管理
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)大型网站架构演变和知识体系
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .FileZilla的使用和主动模式被动模式介绍
  • .libPaths()设置包加载目录
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net core开源商城系统源码,支持可视化布局小程序