命令注入漏洞
因为路由器的固件漏洞里面不只有二进制漏洞,还有比较多的web方面的漏洞,所以自己还是对web方向的漏洞进行简单的了解和学习。
漏洞简介
目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。当应用程序将不安全的用户提供的数据(表单、Cookie、HTTP表头等)传递给系统shell时,可能会产生命令注入漏洞。
漏洞成因
web服务器没有对用户提交的参数进行有效的检测过滤
操作系统允许一条语句在使用连接符和管道符后执行多条命令
漏洞利用
链接命令符号
command1&command2 无论command1是否执行成功都要执行command2
command1&&command2 只有command1执行成功后才执行command2
command1||command2 只有command1执行失败后才执行command2
command1|command2 将command1的执行结果传递给command2
在终端试一下。
漏洞测试
<?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>";
}
?>
上面的代码就有命令注入的漏洞,可以看到shell_exec函数的参数就是ping命令然后拼接了后面输入的ip所以,如果在ip后面用上前面的链接符号再加其他系统命令就可以被执行。
有的代码会加双引号来影响命令注入,如下面的代码在ping后面加了双引号,这就导致如果我们直接传递刚才的攻击语句就会失效,因为在双引号里,攻击语句变成了普通字符串。
$cmd = shell_exec( 'ping "' . $target . '"');
解决的办法是,我们也可以加个双引号,那么前后两个双引号就会直接闭合,不再影响攻击语句。或者可以用一个linux的特殊符号反引号,也叫倒引号:’`’。它具有命令替换的含义,在一个命令中如果出现反引号语句,会先执行反引号里面的内容,再执行外面内容。
漏洞利用
想要更好地利用这个漏洞,我们需要确定它是一个常规命令注入还是命令盲注。两者的区别在于,命令盲注不会在响应中返回命令的输出。常规的命令注入,将返回响应中执行命令的输出。通常sleep命令就可以为我们很好的判断。当然,除此之外你还可以使用更多的命令来进行验证,如执行id,hostname或whoami。服务器的主机名可用于确定受影响的服务器数量。
常规命令注入就是和上面演示的一样,直接可以看到结果,证明已经注入成功。但命令盲注就不会显示结果,不知道是否注入正确。所以可以用sleep命令进行测试,然后通过查看时间来测试是否成功利用。
漏洞防护
黑名单防御
也就是过滤敏感词,把上面的那些链接符号全部过滤了。但这种过滤可能会影响本身命令的使用。
白名单防御
限制了输入数据的格式,只有输入的格式跟白名单的一样才能通过验证,其他的都不行。这样就基本上杜绝了命令注入。
参考链接
https://www.freebuf.com/vuls/139924.html