DVWA笔记系列-Command Injection

0x01 Command Injection 简介

命令执行是指攻击者通过浏览器或者其他客户端软件提交一些cmd命令(或者bash命令)至服务器程序,服务器程序通过system、eval、exec等函数直接或者间接地调用cmd.exe执行攻击者提交的命令。

0x02 Windows下逻辑符号简介

我们这篇文章上面需要的逻辑符号都在下面那个链接上,想要深入了解的同学可以参考一下这位同学的文章,写的很详细,这里我们就不多说了!

0x03 LOW

直接看代码吧,LOW级别的代码很简单,没什么防护机制

if( isset($_POST['Submit'] ) ) {

// Get input

$target=$_REQUEST['ip'];

// Determine OS and execute the ping command.

if(stristr(php_uname('s'),'Windows NT') ) {

// Windows

$cmd=shell_exec('ping '.$target);

}

else {

// *nix

$cmd=shell_exec('ping -c 4 '.$target);

}

// Feedback for the end user

echo"

{$cmd}";

}

?>

LOW级别的代码是在获取用户POST提交上来的值之后,在不为空的情况下,就直接调用shell_exec函数执行系统的ping命令。我们可以利用这个shell_exec函数在加上windows下的一些逻辑符,让其执行其他的系统命令

&逻辑符号:127.0.0.1 & net user

| 逻辑符号:127.0.0.1 | net user

&&逻辑符号:127.0.0.1&&net user

||逻辑符号: || net user

low级别的很简单,如果各位师傅有什么好的姿势,也可以在评论区留言,虽然知道看的人比较少,哈哈哈!

0x03 Medium

我们直接看代码吧,Medium级别的代码也挺简单的,简洁明了,这个命令注入的代码都好简单。

if( isset($_POST['Submit'] ) ) {

// Get input

$target=$_REQUEST['ip'];

// Set blacklist

$substitutions= array(

'&&'=>'',

';'=>'',

);

// Remove any of the charactars in the array (blacklist).

$target=str_replace(array_keys($substitutions),$substitutions,$target);

// Determine OS and execute the ping command.

if(stristr(php_uname('s'),'Windows NT') ) {

// Windows

$cmd=shell_exec('ping '.$target);

}

else {

// *nix

$cmd=shell_exec('ping -c 4 '.$target);

}

// Feedback for the end user

echo"

{$cmd}"; }?>

Medium级别的代码主要是新建了一个黑名单数组$substitutions,对用户输入的内容中的‘&&’与分号‘;’,用PHP的str_replace进行过滤,将他们转化为空格,以达到过滤用户输入,防止命令注入的目的,代码片段如下:

$substitutions= array(

'&&'=>'',

';'=>'',

);

// Remove any of the charactars in the array (blacklist).

$target=str_replace(array_keys($substitutions),$substitutions,$target);

绕过这个防护就很简单了,他只过滤了&&符号,和分号,那我们可以用其他的逻辑符号,比如&,||,|等。这里的具体效果跟Low级别的一样,我就不再重复截图了。下面我们直接看High级别的代码。

0x03 High

个人来说High级别的代码也很简单,只是在Medium的基础上加了更多的黑名单符号,我们来看下具体的代码。

if( isset($_POST['Submit'] ) ) {

// Get input

$target=trim($_REQUEST['ip']);

// Set blacklist

$substitutions= array(

'&'=>'',

';'=>'',

'| '=>'',

'-'=>'',

'$'=>'',

'('=>'',

')'=>'',

'`'=>'',

'||'=>'',

);

// Remove any of the charactars in the array (blacklist).

$target=str_replace(array_keys($substitutions),$substitutions,$target);

// Determine OS and execute the ping command.

if(stristr(php_uname('s'),'Windows NT') ) {

// Windows

$cmd=shell_exec('ping '.$target); }

else {

// *nix

$cmd=shell_exec('ping -c 4 '.$target);

}

// Feedback for the end user

echo"

{$cmd}";

}

?>

好家伙,这货几乎把所有window下的逻辑功能符都禁了,但看认真看代码,你会发现,这代码没有把&&给禁掉,只是把&给进了黑名单。

$substitutions= array(

'&'=>'',

';'=>'',

'| '=>'',

'-'=>'',

'$'=>'',

'('=>'',

')'=>'',

'`'=>'',

'||'=>'',

);

一直以为他过滤的是‘|’符号,没想到他过滤的是‘| ’,记住是‘|’后面加空格,问了好久,要是不团队老哥的提醒还有CTF群里pcat师傅的提醒,我都没注意到。真的是。。。。。,既然他过滤的是‘|’后面加空格,那我们直接构造个命令:

command1|command2.就可以直接绕过了。

0x04 总结

代码审计要细心,自己还是太浮躁了,真的,人一浮躁什么事都干不了。

平常心,平常心!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180421G0H0FL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券