命令注入(Command Injection),是指在某些需要输入数据的位置,还构造了恶意的代码破坏了原先的语句结构。而系统缺少有效的过滤,最终达到破坏数据、信息泄露甚至掌控电脑的目的。许多内容管理系统CMS存在命令注入漏洞。
命令执行定义:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
形成原因:脚本语言优点是简洁,方便,但也伴随着一些问题,如速度慢,无法解除系统底层,如果我们开发的应用需要一些除去web的特殊功能时,就需要调用一些外部程序。带来方便的同时也存在威胁。
漏洞危害:继承Web服务程序的权限去执行系统命令或读写文件
反弹shell
控制整个网站甚至控制服务器
进一步内网渗透
代码执行与命令执行的区别:
命令执行漏洞:
直接调用操作系统命令(相当于在cmd下敲命令)
命令执行漏洞的原理:在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令(如添加一个名为admin 密码为admin的用户 net user admin admin/add net localgroup administrators admin /add 加入管理员组(赋予管理员权限))
命令执行常用函数:system()、Exex()、Passthru()、Shel_exec()。
代码执行漏洞:
应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。
很难通过黑盒查找漏洞,大部分都是根据源代码判断代码执行漏洞。
代码执行相关函数:
PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)
{$cmd}
";
}
?>
stristr() 函数搜索字符串在另一字符串中的第一次出现。
php的代码的含义为接收了用户输入的ip,然后根据服务器是否是Windows NT系统,对目标ip进行不同的ping测试。但是这里对用户输入的ip并没有进行任何过滤,所以我们可以进行命令执行漏洞。
ping ip地址后,出现一堆乱码的情况,解决方法:在DVWA-master\dvwa\includes目录下找到dvwaPage.inc.php文件中所有的”charset=utf-8”,修改”charset=gb2312”,即可。
(1)正常输入百度的ip地址:14.215.177.38,可以正常ping通。
(2)利用命令连接符,执行命令注入漏洞。
14.215.177.38&ipconfig
ipconfig命令可以换成其他系统命令。
这里可以引入命令行的几种操作方式:
A && B: 先执行A,如果成功,执行B;
A || B :先执行A,如果失败,执行B;
A | B:管道,先执行A后,将A的结果作为B的输入,打印的是B的结果;
A & B:先执行A,然后不管成功与否,执行B;
(3)
'',
';' => '',
);
// 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}
";
}
?>
从set blacklist相关代码可以看出,网页会对&&和;进行过滤。
(1)验证过滤形式,注入命令:127.0.0.1&&ipconfig
网页回显错误,即网页对&&和;有明显过滤,需要想办法绕过这两个符号。
(2)在php中,知道网页是将&&和;直接过滤掉,因此可以构造&;&相当于&&。
注入命令:127.0.0.1&;& ipconfig
'',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// 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}
";
}
?>
在该level下,发现网页过滤的字符更多,如&、;、|、-、$、(、)......
现存问题:网页在dir和ipconfig命令注入时均可正常回显,而net user以及ls命令则没有回显。
只在网上找到一种方法,并没有解决现存的问题,该方法为将安装PHP的版本为5.5.38,配置环境变量后也无法解决。