CTF [RoarCTF 2019]Easy Calc writeup PHP字符串解析特性Bypass http请求走私(HTTP Request Smuggling)
0x00 开干
一看这种easy
的,就慌,每次被ctf
打,哪是打ctf
。。。
试了下,还真可以算。但是看网页没有动,是静态。
那这个结果肯定是前端的JS
了。JS
使用ajax
发送数据到calc.php
,然后根据返回结果来显示。比如下面这样就是计算失败的。
而且上面提示,已经设置好了waf
肯定也不是那么容易的,查看了头部和其它元素后,发现没有什么可以利用的,就去看了下calc.php
<?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.';');
}
?>
把num
参数中的特殊字符都检测了,不过还好,没有用‘
闭合。
估计是禁止界面,估计这里就是所谓的waf
了,
连a
都不行,估计只能传数字了。
估计这里应该是又有骚操作,知识盲区。
去查的writeup
,有两个方法,这些人是真的牛批,每次都有新花样。
0x01 Writeup1
利用PHP
的字符串解析特性Bypass
PHP
需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
- 删除空白符
- 将某些字符转换为下划线(包括空格)
知道这个特性后,就可以尝试过掉waf
,waf
应该是用的中间件
的检测来书写的规则 ,所以直接在变量前面加个空格即可。
这里就成功绕过了waf
,接着第二点,再来突破php
当中的正则
不知道到flag
在哪,于是想用scandir()
来查找,但是引号都被检测了,这里可以把字符串用chr()
函数通过acsii
进行传递,只有这个才不需要引号,常见的base64()
和bin2hex()
都需要引号才可以转换。
先看本目录下的内容,.
的ascii
为46
还有一个libs
。。不知道啥玩意,看一下。
啥都没,看来不在这了,这就只能顺着找了,从/
开始吧,先转成ascii
为47
。
找到个f1agg
,再读一次,MD,这么小,还先以为是flagg
,有考IE
内味了,读了半天没读出来。
参考文章:利用PHP的字符串解析特性Bypass
0x02 Writeup2
http请求走私(HTTP Request Smuggling)
HTTP
请求走私是一种干扰网站处理HTTP
请求序列方式的技术,使攻击者可以绕过安全控制,未经授权访问敏感数据并直接危害其他应用程序用户。
请求走私大多发生于前端服务器和后端服务器对客户端传入的数据理解不一致的情况。这是因为HTTP规范提供了两种不同的方法来指定请求的结束位置,即 Content-Length
和 Transfer-Encoding
标头。
大佬们真是太强了。。。
参考文章:
http请求走私(HTTP Request Smuggling)
Easy Calc(http走私 && 利用PHP的字符串解析特性Bypass)
因为主要是内容太多了,就不自己测试了,看完了就来实操一把,加深印象。
只需要改变这几个参数就成功绕过,使用的是属于CL-CL
类型的
通过使用之前payload
:?num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))