1. RCE漏洞
1.1. 漏洞原理
远程代码执行(RCE)漏洞允许攻击者远程注入并执行操作系统命令或代码,从而控制后台系统。
1.2. 漏洞产生条件
- 调用第三方组件存在代码执行漏洞。
- 用户输入内容作为系统命令参数拼接到命令中。
- 对用户输入的过滤不严格。
- 存在可控变量或漏洞函数。
1.3. 漏洞挖掘
命令执行和代码执行漏洞通常需要结合网站实际情况进行分析。如果网站只是一个简单的静态页面,通常不存在此类漏洞。如果网站包含用户输入、调用接口等功能,可能存在漏洞,特别是通过代码审计或访问源代码能够有效挖掘这些漏洞。
1.4. 漏洞分类
1.4.1. 命令执行
1.4.1.1. 漏洞原理
由于应用系统需要提供指定的远程命令操作接口(如防火墙的WEB界面中提供Ping操作),如果设计者未对这些功能进行严格控制,可能导致攻击者提交恶意命令,从而控制服务器。
1.4.1.2. 命令执行危险函数
- PHP:exec、shell、system、popen等
- ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等
- Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
1.4.1.3. 漏洞检测
- 白盒:代码审计
- 黑盒:使用漏洞扫描工具、公开漏洞信息,手工检查功能点及参数值,关注是否涉及相关漏洞函数。如参数值加密,则需进行解密。
1.4.2. 代码执行
1.4.2.1. 漏洞原理
与命令执行漏洞类似,代码执行漏洞源于应用程序需要执行用户输入的部分代码。开放的代码执行接口需要严格控制,以避免出现漏洞。
1.4.2.2. 代码执行危险函数
- PHP: eval、assert、preg_replace()、+/e模式(PHP版本 < 5.5.0)
- JavaScript: eval
- VBScript:Execute、Eval
- Python: exec
1.4.2.3. 漏洞检测
- 白盒:代码审计
- 黑盒:使用漏洞扫描工具、公开漏洞信息,手工检查功能点及参数值,关注是否涉及相关漏洞函数。如参数值加密,则需进行解密。
1.5. 命令执行和代码执行区别
命令执行调用操作系统命令进行执行,代码执行调用服务器网站的代码进行执行。
2. 命令执行
2.1. 命令执行函数介绍
参考链接
2.1.1. system函数
执行系统命令,并输出结果,返回最后一行的结果字符串,执行失败返回false。
<?php
highlight_file(__FILE__);
system('pwd');
?>
2.1.2. exec函数
执行系统命令,不输出结果,返回最后一行的结果,可结合output输出结果。
<?php
highlight_file(__FILE__);
exec('pwd', $output);
var_dump($output);
?>
2.1.3. passthru函数
调用命令并输出结果,不返回值。
<?php
highlight_file(__FILE__);
passthru('ls');
?>
2.1.4. shell_exec函数
不输出结果,返回执行结果。使用反引号(``)时调用此函数。
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>
2.1.5. 总结
还有其他命令执行函数,可以自行搜索学习。
2.2. 命令执行前置基础
在进行命令执行之前,需了解基本的Windows和Linux命令。
2.2.1. Windows基础命令
常用的cmd命令:
ping # 测试连通性
tracert # 追踪路由
telnet # 远程连接
dir # 列出目录
ipconfig # 查看IP
arp -a # 查看路由表
calc # 打开计算器
regedit # 打开注册表
netstat -ano# 查看端口信息
2.2.2. Linux命令
常用的Linux命令:
cd # 切换目录
ls # 显示当前目录下的文件
ifconfig # 查看IP地址
cat /etc/passwd # 查看password文件内容
id # 查看当前用户的id号
cat /etc/group # 查看用户组文件内容
pwd # 显示当前目录
uname -a # 查看系统版本
natstat -pantu # 查看服务器端口信息
netstat -nr # 查看网关和路由
2.2.3. 拼接符
| # 只执行|后面的语句
|| # 前面命令失败时执行后面的语句
& # 前后命令都执行
&& # 前面命令成功时执行后面的语句
; # 前后都执行
2.3. 命令执行案例
使用DVWA靶场进行演示。
2.3.1. 乱码解决
在DVWA\dvwa\includes目录下,将所有“charset=utf-8”替换为“charset=gb2312”。
2.3.2. Low级别
2.3.2.1. 介绍
Low级别接受用户输入的IP,执行ping命令,对输入内容无过滤。
2.3.2.2. 操作
- 使用拼接符“|”,输入“127.0.0.1 | net user”。
- 使用拼接符“&&”,输入“127.0.0.1 && net user”。
2.3.3. Medium级别
2.3.3.1. 介绍
Medium级别过滤“&&”和“;”,可使用其他拼接符。
2.3.3.2. 操作
使用拼接符“&”,输入“127.0.0.1 & net user”。
2.3.4. High级别
2.3.4.1. 介绍
High级别过滤“| ”。
2.3.4.2. 操作
绕过空格过滤,输入“127.0.0.1|net user”。
2.4. 命令执行总结
示例中使用“net user”命令,其他命令也可测试。确保开发过程中对参数进行严格限制,防止此类漏洞。
3. 代码执行
3.1. 代码执行函数介绍
3.1.1. ${} 执行代码
将中间的PHP代码进行解析。
<?php
${phpinfo()};
?>
3.1.2. eval函数
将字符串当作代码执行,需传入完整语句,以分号结尾。
<?php
eval('echo "hello";');
?>
3.1.3. assert函数
判断是否为字符串,如果是则执行代码。PHP7.0.29之后版本不支持动态调用。
低版本
<?php
assert($_POST['a']);
?>
7.0.29之后
<?php
$a = 'assert';
$a(phpinfo());
?>
3.1.4. array_map函数
为数组的每个元素应用回调函数。
<?php
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a, $array);
?>
构建的payload
?a=assert&b=phpinfo();
3.1.5. 总结
代码执行函数众多,可自行研究学习。
3.2. 代码执行前置基础
确保了解并掌握代码执行函数和基础代码执行技巧。
3.3. 代码执行案例
以低版本DVWA为例展示常见代码执行漏洞。
3.3.1. Low级别
3.3.1.1. 介绍
Low级别代码执行直接执行用户输入的PHP代码。
3.3.1.2. 操作
- 输入PHP代码,如
${phpinfo()}
,进行代码执行。
3.3.2. Medium级别
3.3.2.1. 介绍
Medium级别代码执行对输入代码进行一定过滤,但仍可绕过。
3.3.2.2. 操作
- 使用变种的eval函数进行代码执行。
3.3.3. High级别
3.3.3.1. 介绍
High级别代码执行对输入代码进行更严格的过滤。
3.3.3.2. 操作
- 通过调试和分析,找到未过滤的执行函数进行代码执行。
3.4. 代码执行总结
代码执行漏洞需对用户输入进行严格过滤和验证,避免直接执行用户输入的代码。
4. 防御与总结
4.1. 防御措施
- 禁用或严格控制危险函数。
- 对用户输入进行严格过滤和验证。
- 使用安全编程规范和最佳实践。
- 定期进行代码审计和安全测试。
- 及时更新和修补系统漏洞。
4.2. 总结
命令执行和代码执行漏洞是常见且危害严重的安全漏洞。通过合理的防御措施和代码审计,可以有效预防和应对此类漏洞。定期进行安全测试和漏洞修复是保障系统安全的重要措施。