ping ping ping
打开题目发现页面只有一个?ip=,我们可以得知这是让我们使用GET方式传入ip地址,我们先传一个本地ip地址进去发现没有什么用
此处我们可以想到一起执行其他命令,利用命令分隔符,共有三种:";" "|" "&"
通过尝试发现只有|和;可以,而|又是直接执行后面语句的管道符,我们就直接使用|,发现有两个文件,一个是flag.php另一个是index.php,我们先看一看index.php中的源码
页面回显f**k your space,我们猜测可能过滤了空格,我们使用$IFS$1 (随机数字)替换空格
可以看到过滤了命令连接符&,\,空格,*,bash,<>,flag,? ,因此我们需要一些方式进行绕过
1.内联执行
我们可以看到并未过滤掉 `,因此我们使用内联执行
内联执行是将反引号内命令的返回值(即输出值)作为整条命令的输入值
例如当命令为:cat `ls`
实际等于:cat flag.php ; cat index.php,再加上空格绕过,payload:?ip=127.0.0.1|cat$IFS$1`ls`
查看源码就能拿到flag
2.拼接法
因为源码中通过正则表达式匹配ip的值中是否顺序出现了f、l、a、g四个字母,这样我们可以通过不同方式的拼接构造payload可以拼接f;lag fl;ag fla;g 但是这里需要注意:flag的字母顺序要不同
y=g;x=fla;$x$y
y=ag;x=fl;$x$y
y=lag;x=f;$x$y
这三种只需要保证顺序不同,就可以进行拼接绕过,因为我们这里使用的拼接中有;,而|直接执行的是后面的语句,因此我们这里使用|进行拼接回显不出任何东西,我们可以使用 ;
payload:?ip=127.0.0.1;y=ag;x=fl;cat$IFS$9$x$y.php
再次查看源代码可以得到flag
3.sh编码绕过法(base64编码)
echo (命令编码)|base64 -d|sh
sh可以换成bash,但是题目过滤掉了,base64也可以换成其他的编码形式,空格用$IFS$1替换掉 cat flag.php 的base64编码为Y2F0IGZsYWcucGhw
payload:/?ip=127.0.0.1|echo$IFS$6Y2F0IGZsYWcucGhw|base64$IFS$6-d|sh,相当于执行命令cat flag.php,查看源码
此次分享结束