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级别的,没有任何限制没有任何过滤,所以随便玩,就当熟悉命令连接符。
”| “符号的效果:
burpsuite抓包:
”&“符号的效果:
burpsuite抓包:
”&&“符号的效果:
burpsuite抓包:
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(
‘&&’ => ”,
‘;’ => ”,
这段代码表示过滤了“&&”和“;”,但没有过滤“||”
输入127.0.0.1 &&ipconfig,但是没显示出命令执行后的内容。
输入127.0.0.1 &ipconfig,内容就出来了,继续尝试
输入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(
‘&’ => ”,
‘;’ => ”,
‘| ‘ => ”,
‘-‘ => ”,
‘$’ => ”,
‘(‘ => ”,
‘)’ => ”,
‘`’ => ”,
‘||’ => ”,
);
看操作:
输入127.0.0.1 &&ipconfig,但是没显示出命令执行后的内容。
输入127.0.0.1 &ipconfig,但也没显示出命令执行后的内容。
输入127.0.0.1 |ipconfig,有内容显示了,终于有漏网之鱼了。
输入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:
输入127.0.0.1 &ipconfig:
输入127.0.0.1 |ipconfig:
输入127.0.0.1 ||ipconfig:
全部通杀!其实看漏洞会觉得这个漏洞很厉害,这相当于拿到了一个shell,但最大的问题不是权限问题,最大的问题是这样的漏洞很难见到啊,不像sql注入,xss这样具有很强的通用性,毕竟sql查询,留言等操作,基本上是web很常见的操作,而像这样的cmd的操作,让用户输入,然后把用户输入直接cmd运行很少见。
这个命令注入实验操作,其实可以脱离DVWA进行练手的,自己在windows下cmd运行也可以的:
总之,纸上得来终觉浅,绝知此事要躬行。多操作多练习!
来源:freebuf.com 2020-10-27 22:42:11 by: fu福lin林
请登录后发表评论
注册