攻防世界 Web PHP Include 解题指南:文件包含与命令注入实战
本文针对攻防世界的"Web PHP Include"题目进行深度解析。该实验旨在演示如何通过PHP本地文件包含(LFI)漏洞,结合php://input伪协议与大小写绕过技巧,在服务器端执行恶意命令以获取Flag。文章逐步拆解代码逻辑,提供从参数分析到Payload构造的完整操作指南。
实验目标与核心原理
本挑战的目标是读取并展示位于服务器上的秘密文件(Flag)。通过分析题目提供的源代码,我们可以识别出两个关键的安全隐患:
- 文件包含漏洞:通过
page参数可控地引入外部文件。 - OS命令注入:虽然包含的文件本身无法直接执行代码,但通过特定的伪协议,可以将POST请求体中的内容当作可执行代码运行。
首先,让我们观察题目给出的源码界面:
源代码逻辑分析
在开始攻击之前,我们需要准确理解脚本中涉及的参数和函数行为。
第1步:理解页面参数
代码中存在两个主要参数:hello 和 page。
hello:其传入的内容会直接在页面上输出。page:其传入的内容会被用于文件包含操作。然而,源码中包含了对敏感协议字符串php://的过滤机制。
第2步:掌握过滤逻辑与函数
作者使用了strstr()函数来检查page参数中是否包含php://。
strstr(string,search[,before_search])
strstr()用于在字符串中搜索特定子串。如果找到,返回从第一次出现开始到结尾的子串;否则返回false。该函数区分大小写。
同时,代码中可能涉及str_replace()或类似的替换处理,但本题的关键在于strstr()的大小写敏感性。这意味着如果我们使用全小写的php://会被拦截,但如果改变大小写组合,如PhP://,则可以通过检测。
漏洞利用步骤
第1步:构造伪协议绕过
既然标准的php://input被过滤,我们利用strstr()不区分变体的特性,采用大小写混写的方式绕过:phP://input。
php://input是一个只读流,允许在POST请求体中读取原始数据。当它与文件包含结合时,上传的代码将在服务器端被执行。
第2步:准备Payload
为了读取服务器的Flag,我们需要利用OS命令注入。在php://input中,我们不直接写入PHP代码,而是写入带有反引号的系统命令。在Linux系统中,反引号`可以包裹命令并让其结果作为字符串的一部分。
我们的目标是查看flag文件(通常为当前目录下的index.php或相关配置文件,具体视题目环境而定),因此构造如下Payload:
<?=`cat index.php`;
或者更通用的思路是尝试列出目录或直接读取可疑文件。在本例中,直接尝试通过包含日志或临时文件来获取信息,或者直接查看index.php。
第3步:发送HTTP POST请求
我们需要构建一个POST请求。URL参数部分指定我们要包含的入口:?page=phP://input。请求体(Body)部分填入上述PHP代码。
第4步:处理结果与二次查找
发送请求后,你可能会发现返回的页面并不直接显示Flag,或者看起来像是空白/错误页面。这通常是因为:
- 代码执行成功,但输出未被正确渲染。
- Flag隐藏在某个具体的文件中,而不是
index.php根目录中。
此时,我们可以观察到一些中间产物或文件列表,但直接浏览某些生成的文件可能无法打开(因为权限或格式问题):
如果遇到这种情况,不要放弃。可以尝试修改命令参数,例如使用ls -la查看所有隐藏文件或扩展排查范围,或者直接针对特定路径执行cat命令。最终,通过正确的文件路径查看(如发现Flag存在于第一个测试文件或特定配置中),即可得到最终的Flag字符串。
知识点总结
- PHP本地文件包含 (LFI):攻击者能够包含服务器上任意文件,若配合伪协议可导致RCE。
- php://input 伪协议:通过POST提交原始数据供PHP解释器执行,常用于无文件上传场景的代码执行。
- 大小写绕过:针对不区分大小写的黑名单或区分大小写的白名单/过滤机制,灵活调整参数大小写是常见防御规避手段。
- 命令注入:通过反引号或管道符将系统命令注入到应用程序逻辑中。
以上就是web php include攻防世界解决示例的详细内容,更多关于web php include攻防世界的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









