DVWA下的命令注入通关 – 作者:fu福lin林

Command Injection命令注入

命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。在命令注入的漏洞中,最为常见的是PHP的命令注入。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施下一步渗透攻击。

常见的命令连接符:

命令连接符:

command1 && command2   先执行command1后执行command2

command1 | command2     只执行command2

command1 & command2    先执行command2后执行command1

以上三种连接符在windows和linux环境下都支持

如果程序没有进行过滤,那么我们就可以通过连接符执行多条系统命令。

1、Low Command Injection Source(低级别的)

<?php
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 “<pre>{$cmd}</pre>”;
}
?>

low级别的,没有任何限制没有任何过滤,所以随便玩,就当熟悉命令连接符。

”| “符号的效果:

1603807485_5f9828fda420f2d3a2c26.png!small?1603807449024

burpsuite抓包:

1603807792_5f982a300d6e159427453.png!small?1603807755539

”&“符号的效果:

1603807611_5f98297b263b114f360f5.png!small?1603807574702

burpsuite抓包:

1603807837_5f982a5d4d76da317c65f.png!small?1603807800776

”&&“符号的效果:

1603807734_5f9829f6bfa1eda0e7f3c.png!small?1603807698238

burpsuite抓包:

1603807920_5f982ab00f0551a314ee7.png!small?1603807883423

2、Medium Command Injection Source(中难度的)

<?php
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 “<pre>{$cmd}</pre>”;
}
?>

$substitutions = array(
‘&&’ => ”,
‘;’  => ”,

这段代码表示过滤了“&&”和“;”,但没有过滤“||”

1603808134_5f982b86d895a01871f6c.png!small?1603808098491

输入127.0.0.1 &&ipconfig,但是没显示出命令执行后的内容。

1603808231_5f982be7c6d8e370610e0.png!small?1603808195342

输入127.0.0.1 &ipconfig,内容就出来了,继续尝试

1603808305_5f982c31ae7d94aa5218c.png!small?1603808269198

输入127.0.0.1 |ipconfig,也可以,说明medium级别的源代码真的把”&&“字符过滤了,效果还很好,我们继续下一关。

3、High Command Injection Source(高难度的)

<?php

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 “<pre>{$cmd}</pre>”;
}
?>

high级别主要是完善了黑名单:

$substitutions = array(
‘&’  => ”,
‘;’  => ”,
‘| ‘ => ”,
‘-‘  => ”,
‘$’  => ”,
‘(‘  => ”,
‘)’  => ”,
‘`’  => ”,
‘||’ => ”,
);

看操作:

1603808595_5f982d534b38754b30dfe.png!small?1603808558910

输入127.0.0.1 &&ipconfig,但是没显示出命令执行后的内容。

1603808652_5f982d8cc4d2fcc087211.png!small?1603808616188

输入127.0.0.1 &ipconfig,但也没显示出命令执行后的内容。

1603808698_5f982dba4af66f6f8ee49.png!small?1603808661709

输入127.0.0.1 |ipconfig,有内容显示了,终于有漏网之鱼了。

1603808770_5f982e0257e1e0a19e803.png!small?1603808733786

输入127.0.0.1 ||ipconfig,也没有显示内容。以上说明high级别的依旧可以命令注入成功。最后来试试

Impossible级别的。

4、Impossible Command Injection Source(不可能的)

<?php

if( isset( $_POST[ ‘Submit’ ]  ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ ‘user_token’ ], $_SESSION[ ‘session_token’ ], ‘index.php’ );

// Get input
$target = $_REQUEST[ ‘ip’ ];
$target = stripslashes( $target );

// Split the IP into 4 octects
$octet = explode( “.”, $target );

// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int’s put the IP back together.
$target = $octet[0] . ‘.’ . $octet[1] . ‘.’ . $octet[2] . ‘.’ . $octet[3];

// 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 “<pre>{$cmd}</pre>”;
}
else {
// Ops. Let the user name theres a mistake
echo ‘<pre>ERROR: You have entered an invalid IP.</pre>’;
}
}

// Generate Anti-CSRF token
generateSessionToken();
?>

以上源码对输入进行了严格限制,只有数字才行!那我们试试

输入127.0.0.1 &&ipconfig:

1603809077_5f982f3525e193f79b703.png!small?1603809040693

输入127.0.0.1 &ipconfig:

1603809153_5f982f81a2474e8e13535.png!small?1603809117181

输入127.0.0.1 |ipconfig:

1603809183_5f982f9f779b6e3fd00c7.png!small?1603809146909

输入127.0.0.1 ||ipconfig:

1603809206_5f982fb63fa1700f1673a.png!small?1603809169737

全部通杀!其实看漏洞会觉得这个漏洞很厉害,这相当于拿到了一个shell,但最大的问题不是权限问题,最大的问题是这样的漏洞很难见到啊,不像sql注入,xss这样具有很强的通用性,毕竟sql查询,留言等操作,基本上是web很常见的操作,而像这样的cmd的操作,让用户输入,然后把用户输入直接cmd运行很少见。

这个命令注入实验操作,其实可以脱离DVWA进行练手的,自己在windows下cmd运行也可以的:

1603809360_5f983050498693bfaa71d.png!small?1603809323662

1603809413_5f983085a8283cbace64e.png!small?1603809377004

1603809460_5f9830b474c24bb26f823.png!small?1603809423788

1603809506_5f9830e2b461dbfb51936.png!small?1603809470130

总之,纸上得来终觉浅,绝知此事要躬行。多操作多练习!

来源:freebuf.com 2020-10-27 22:42:11 by: fu福lin林

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论