代码审计是发现路径遍历漏洞的关键手段,但很多开发者对绕过方式认识不足,导致修复不彻底。路径遍历漏洞的核心在于未对用户输入的文件路径进行严格校验,攻击者可通过../序列、编码混淆或绝对路径拼接等方式读取系统敏感文件。据OWASP的长期统计数据显示,路径遍历漏洞在Web应用安全漏洞中占比约8%,且多与文件操作函数相关联。
路径遍历漏洞的绕过方式主要分为三类:../序列遍历、编码绕过和绝对路径拼接,检测时需针对性处理。第一种是传统的../序列,攻击者通过输入"../../../etc/passwd"直接跳出限制目录。第二种是编码绕过,包括URL编码(%2e%2e%2f)、双编码(%252e%252e%252f)甚至Unicode编码(%c0%ae%c0%ae%2f),这些编码在服务器端解码后仍能形成../序列。第三种是绝对路径绕过,当程序只检查相对路径是否包含../时,攻击者直接输入"/etc/passwd"即可绕过,因为绝对路径本身不包含../。
这三种绕过方式在实际攻击中常组合使用。例如,对URL参数进行双重编码后配合绝对路径,可以同时绕过简单的关键词过滤和路径拼接检查。代码审计人员在审查文件操作函数(如PHP的file_get_contents、Java的FileInputStream)时,必须逐一检查上游是否存在路径拼接逻辑,并验证所有输入来源。
检测路径遍历漏洞的关键在于追踪用户输入流经文件操作函数时的完整路径处理过程。静态代码审计时,应优先关注以下模式:将用户提交的参数直接拼接到文件路径中且未做白名单校验。例如,以下PHP代码存在典型漏洞:
$file = $_GET['file'];
$content = file_get_contents('/var/www/private/' . $file);
攻击者通过传入"../../etc/passwd"即可读取服务器密码文件。静态分析工具如SonarQube、RIPS可以标记此类模式,但开发者仍需人工确认是否存在上游过滤。动态审计时,可构造多种绕过paypload进行模糊测试,观察响应是否包含敏感文件内容。
对比三种绕过方式的检测难度,如下表所示:
| 绕过方式 | 检测难度 | 典型检测方法 |
|---|---|---|
| ../序列遍历 | 低 | 正则匹配../ |
| 编码绕过 | 中 | 解码后再匹配 |
| 绝对路径绕过 | 高 | 检查是否以白名单目录开头 |
从表中可见,绝对路径绕过的检测难度最高,因为它不依赖../,只需路径以白名单目录开头即可绕过检查。代码审计时需额外检查:程序是否对文件路径执行了realpath()或规范化处理,以及是否将绝对路径与白名单目录进行精确比较。
修复路径遍历漏洞的核心是使用白名单机制限制文件访问范围,辅以规范化路径处理。首先,应定义允许访问的目录白名单,例如只允许访问"/var/www/uploads"。然后,对用户输入的文件路径执行以下步骤:
以下是一个安全的PHP代码示例:
$whitelist = '/var/www/uploads';
$file = $_GET['file'];
$fullPath = realpath($whitelist . '/' . $file);
if ($fullPath === false || strpos($fullPath, $whitelist) !== 0) {
die('Invalid file');
}
$content = file_get_contents($fullPath);
注意,使用realpath()可自动处理../和编码问题,但需注意realpath()在路径不存在时返回false,因此需要先检查文件是否存在或使用其他方式。另外,对于Java环境,可以使用File.getCanonicalPath()进行规范化,然后检查是否以白名单路径为前缀。
代码审计中还应关注文件上传功能中的路径遍历风险。当用户上传文件并保存到服务器时,如果文件名被直接拼接为路径,攻击者可能通过文件名包含../将文件保存到webroot之外,甚至覆盖系统文件。应对上传文件名进行严格的过滤,只允许字母数字和下划线,并重新生成随机文件名。
综上,代码审计对路径遍历漏洞的检测需要一个系统化的方法:理解三种绕过方式,掌握静态与动态检测技巧,并实施白名单加规范化的修复策略。只有将安全贯穿于开发全生命周期,才能有效降低路径遍历漏洞带来的风险。
评论
加载中...