title: DVWA-命令执行
date: 2018-10-19 13:41:23
tags: [DVWA]
categories: DVWA
DVWA的第二个漏洞模块是命令注入,即我们常说的命令执行。
漏洞原理
一些web网站因为某些功能需要执行系统命令,并通过网页传送参数到后台执行,但是并没有对用户的输入进行检测,由于没有限制用户的输入,用户便可以构造一些恶意的命令或代码使后台执行。
LOW
Low Command Injection Source
{$cmd}
";
}
?>
代码分析
$target = $_REQUEST[ 'ip' ];
服务器通过 来获取用户在网页提交的输入,然后确定服务器的操作系统之后就执行ping命令。在执行用户的输入之前服务器并没有对用户的输入做一些限制,也没有对提交的值做一些过滤。以至于用户可以通过输入来执行其他命令。
判断操作系统
用户通过if( stristr( php_uname( 's' ), 'Windows NT' ) 来判断服务器的系统是Windows还是Linux。php_uname('s')会返回运行php的操作系统的名称,即Windows或Linux,stristr()函数则会搜索php_mod()函数的返回结果有没有在字符串中出现,如果出现了,那么操作系统是windows的,如果没有出现就是Linux。如果是windows直接ping,如果是Linux直接也就是发送4次ping之后停止,因为Linux下不加会一直ping
漏洞利用
在Linux系统和windows系统中,&&、||等可以执行多条命令,当然在Linux下还可以用分号(;)同时执行多条命令。在这里我们也可以执行其他命令,比如创建用户,加入管理员组等。
Medium
Medium Command Injection Source
'',
';' => '',
);
// 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}
";
}
?>
代码分析与漏洞利用
中级的源码中把逻辑与(&&)和分号(;)加入了黑名单,但我们都知道在防止攻击的时候黑名单是最不全面的,这里虽然把&&和分号;加入了黑名单,但是我们还可以用逻辑或(||)、管道符(|)或(&)来命令执行High
High Command Injection Source
'',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// 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}
";
}
?>
代码分析和漏洞利用
我们很容易看到高级的黑名单比中级的限制的字符要多,高级的黑名单把'&',';','| ','-','$','(',')','`','||'这些符号都过滤了。
但是我们注意到他过滤了逻辑或(||)和管道符+空格(| ),而并不是直接过滤的管道符,因此我们可以用管道符来命令执行。如图。Impossible
代码分析
{$cmd}
";
}
else {
// Ops. Let the user name theres a mistake
echo 'ERROR: You have entered an invalid IP.'; } } // Generate Anti-CSRF token generateSessionToken(); ?>
代码分析
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
代码中Anti-CSRF token是用来防范CSRF攻击的。客户端每次随机生成一个token,用户提交的时候会携带token到服务器端,在服务器端的对比,正确就验证通过,不正确就丢弃。
$target = stripslashes( $target );
stripslashes()函数对获取的用户的输入target字符串中的反斜杠删除,返回删除发斜杠后的字符串。
// Split the IP into 4 octects
$octet = explode( ".", $target );
explode()函数把字符串打散成数组。获取的用户输入的IP地址,通过"."进行分割,分割成数组。
// 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];
is_numeric()函数用于检测变量是否为数字或数字字符串。sizeof()函数返回数组中元素的数目。
这段代码对分割成数组的字符串进行判断,如果数组的每一个元素都是数字类型,且数组的元素个数为4,即输入的格式为点分十进制ip,就把所有的数字用“.”进行拼接然后执行ping操作,从而避免了命令执行漏洞。
下面给大家补充一下连接符的区别
连接符的区别
- “&&”逻辑与:&&符号连接的命令只有在前一条命令成功执行后才执行后面的命令,如果前一条命令执行失败,那么后一条命令不执行
mark
- “&”后台任务符号:&放在命令后标志设置此进程为后台进程,如下图echo 1和echo 2都为后台执行任务,而echo 3为前台执行任务,在前台执行任务结束后会得到一个shell提示符,前台任务可能执行完也可能未执行完。一条命令执行失败并不影响其他命令执行,而且执行的先后顺序也不一定。
mark
- “||”逻辑或:前一条命令执行失败后才执行后一条命令,只要有一条命令执行成功就不再执行后面的命令。
mark
- "|"管道符号:将前一个命令的标准输出重定向到后一个命令的标准输入如cat test.txt|grep admin。当后一个不能接受标准输入时,前一个命令的标准输出无法管道成功,如果最后一个命令能正确执行,则输出最后一个命令的执行结果,若最好一个命令执行错误则直接报错。
mark
- “;”分号:在Linux系统下分号连接的命令依次执行,前一条命令执行错误并不影响后一条命令执行。但在Windows系统下不行。
markmark