前言
尽管该模块是HTB平台上的免费内容,但其讲解质量较高,深入浅出地剖析了文件包含漏洞的核心机制。不仅涵盖了参数处理中的简单绕过技巧,还涉及PHP封装器、远程代码执行、文件上传等多个关联知识点。此外,模块末尾还简要介绍了ffuf工具的使用策略以及针对文件包含漏洞的防御措施,充分体现了国外在计算机安全教育方面的系统性与专业性。
整体来看,虽然内容较为丰富,但主要可归纳为两大方向:一是由本地文件包含引发的敏感信息泄露;二是结合其他漏洞或技术实现的远程代码执行。
一、文件包含漏洞原理
文件包含漏洞(File Inclusion Vulnerability)属于Web应用中常见的安全问题,多出现在支持动态加载脚本文件的系统中。当后端未对用户输入的文件路径进行严格校验时,攻击者便可能通过构造恶意路径,使服务器加载并执行非预期的文件。
这类问题通常源于编程语言中用于引入外部资源的函数,如PHP中的include()、Node.js中的fs.readFile()等。不同语言和函数在处理文件引用时行为各异,具体细节可参考官方提供的对比表格。
二、敏感文件信息泄露
若目标存在本地文件包含(Local File Inclusion, LFI)漏洞,攻击者可通过使用“../”等方式遍历目录,读取系统中的敏感文件。然而,在实际利用过程中常会遇到以下两种典型限制情况:
情况一:路径前缀固定
例如源码为:
include("lang_" . $_GET['language']);
此时文件路径被添加了固定前缀,若直接使用“../”,最终拼接路径将变为“lang_../../xxx”,指向错误位置。解决方法是在路径前加上“/”,形成“/../../”结构,从而正确跳出前缀限制。
情况二:路径后缀强制附加
如代码为:
include($_GET['language'] . ".php");
该情况下无论输入什么都将自动附加“.php”后缀。若PHP版本低于5.3或5.4,可尝试利用长度截断(超长字符串)或空字节截断(%00)来绕过限制。
针对过滤机制,也可采取相应绕过策略:
- 若采用字符串替换方式过滤“../”,例如:
$language = str_replace('../', '', $_GET['language']);
可使用“…//”替代“../”,经替换后仍可保留有效跳转路径。 - 若直接禁止“.”或“/”字符,则可尝试URL编码或其他编码形式绕过检测(本模块评估环节即包含此类场景)。
- 若使用正则表达式限定路径范围,如官网示例:
if(preg_match('/^\.\/languages\/.+$/', $_GET['language'])) { include($_GET['language']); }
可先探测可访问目录,再结合“../”跳出指定路径,实现越权读取。
值得注意的是,某些被包含的文件(如PHP脚本)会被直接解析执行,返回的是运行结果而非原始代码。此时可借助PHP Filters获取未执行的源码内容:
php://filter/read=convert.base64-encode/resource=目标路径
该方法可将指定文件以Base64编码形式输出,便于后续分析。
三、远程代码执行
由于部分包含函数在加载文件的同时会对其内容进行解释执行,因此一旦控制输入路径,即可实现代码执行。常见的利用方式包括:
1. 结合文件上传漏洞
上传WebShell后,通过LFI调用该文件触发执行,是最直接的组合利用方式。
2. 利用PHP封装器
首先需确认allow_url_include在php.ini中是否启用。若已开启,可使用如下封装协议:
- data:// 封装器:
data://text/plain;base64,PHP代码的Base64编码
可将一句话木马进行Base64编码后注入执行。 - php://input 封装器:
使用POST请求传入代码体,例如:
curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://<SERVER_IP>:<PORT>/index.php?language=php://input&cmd=id" - expect:// 封装器:
若php.ini中启用了extension=expect,则可直接执行系统命令:
curl -s "http://<SERVER_IP>:<PORT>/index.php?language=expect://id"
3. 远程文件包含(RFI)
与PHP封装器类似,当allow_url_include开启时,可通过LFI加载远程服务器上的文件。支持协议包括HTTP、FTP、SMB等,攻击者可在自身控制的主机上部署WebShell供目标包含执行。
4. 日志污染技术
若系统记录用户行为日志(如访问日志、Cookie信息),可尝试构造恶意请求,使一句话木马写入日志文件。随后通过LFI加载该日志文件,触发WebShell执行。
四、QUESTIONS 部分说明
本部分内容围绕上述知识点设计实践题目,重点考察对LFI绕过技巧、编码利用、封装器使用及综合渗透思路的理解与应用能力。建议结合实验环境逐步验证各类技术手段的有效性。
总的来说,利用文件包含漏洞成功执行一个webshell即可达成目标。

关于QUESTIONS模块的分析
该部分的题目整体难度不高,但仍有几个问题耗费了较长时间才解决。
在“Automated Scanning”这一章节中,遇到的主要问题是seclists中的burp-parameter-names.txt文件缺少了“view”这一参数名称,导致扫描始终未能发现关键点。最终通过查阅官方Discord中module频道的相关讨论,才得知需要添加“view”作为检测参数。
另一个具有挑战性的环节是Skills Assessment。起初发现了/api/image.php接口中存在LFI漏洞,其p参数可读取文件内容,但无法实现代码执行。在此过程中,我一度将注意力转向系统其他敏感路径的探测,忽略了对当前应用本身的深入分析。正确的思路应当是对网站前端相关的PHP文件进行逐一审计,例如index.php、contact.php和apply.php等。通过代码审查可以发现,contact.php中存在region参数,并对该参数进行了过滤处理。此外,/api/application.php在处理文件上传时,采用的是对文件内容进行MD5哈希,而非基于文件名加密,这一点也值得注意。
最后,在构造针对region参数的payload时,无需添加任何文件后缀名。另外,尝试使用Kali中提供的PHP反弹shell未能成功,推测是由于防火墙拦截所致。实际应采用一句话木马的方式直接获取flag更为有效。


雷达卡


京公网安备 11010802022788号







