干货文件包含复现过程

极客

我是怎么一步步把漏洞“打”出来的,看完你也能上手!

说实话,写这篇文章之前我犹豫了好久——毕竟“文件包含”这个话题,网上一搜一大把,讲原理的多,讲复现过程的少,但最近好几个粉丝私信我:“哥,道理我都懂,可就是复现不出来啊!”唉,这不就是我当年踩坑的样子吗?所以今天,我决定把自己压箱底的干货文件包含复现过程完完整整地分享出来,不藏私,纯干货,跟着我的思路走,保证你也能跑通。

干货文件包含复现过程

先别急着开打,环境得先搭明白

我见过太多人,上来就找靶场、扔payload,结果报错一大堆,直接心态崩了,听我一句劝,复现文件包含漏洞,环境是根基,我当时用的是PHPStudy搭的本地环境(Windows下真的省心),PHP版本选的7.3——为啥不选8.x?嘿嘿,因为某些伪协议在8.x里被默认禁用了,新手用7.x练手最合适,别一上来就给自己上难度嘛。

搭好环境后,我新建了一个目录叫fileinclude_demo,里面放了三个文件:index.php(主页面)、header.php、footer.php,哎对,就是那种最经典的“模块化开发”写法,很多老项目都这么干,也正是这种写法,给了文件包含漏洞可乘之机。

index.php的代码大概是这样的:

<?php
$page = $_GET['page'];
if (isset($page)) {
    include($page);
} else {
    include('header.php');
}
?>

你看,include($page)这行代码,完全没有对$page做任何过滤——这就是漏洞的根源,哎呀,当时我看到这段代码,心里那个激动啊,感觉就像发现了一道没锁的后门,嘿嘿。

干货文件包含复现过程:从本地包含到伪协议

第一步:本地文件包含(LFI)验证

我先访问 http://localhost/fileinclude_demo/index.php?page=header.php,页面正常显示头部内容,这说明包含功能是通的,接着我构造了一个不存在的文件路径:?page=aaa.php,果不其然,页面报错并暴露了绝对路径(比如D:\phpstudy_pro\WWW\fileinclude_demo\aaa.php)。这一步特别关键——报错信息不仅确认了漏洞存在,还告诉了我服务器的物理路径,后面读文件就靠它了。

第二步:读取敏感文件

有了路径信息,我直接尝试读取系统文件:?page=../../../../windows/win.ini,哇,页面真的把win.ini吐出来了!那一刻我坐在椅子上忍不住“嚯”了一声——这说明目录穿越也没被限制,如果是Linux环境,那就是?page=../../../../etc/passwd,原理一样,这里就不啰嗦了。

第三步:伪协议登场,php://filter 读出源码

读普通文件不过瘾,我想看看index.php的源码(毕竟黑盒测试时源码就是宝藏啊),可直接?page=index.php,PHP会执行代码而不是显示代码,怎么办?这时候php://filter伪协议就派上用场了!我构造了:

?page=php://filter/read=convert.base64-encode/resource=index.php

页面输出了一串Base64字符串,我复制下来丢进解码网站,源码瞬间到手!说真的,第一次成功的时候我反复确认了三遍,生怕是自己眼花,哈哈。

第四步:php://input 与 data:// 的尝试

接下来我又试了php://input伪协议——构造POST请求,body里写<?php phpinfo();?>,URL填?page=php://input,不过这玩意儿受allow_url_include配置影响,我本地默认是关闭的,所以第一次没成功,差点以为是自己写错了……后来去php.ini里把allow_url_include=On打开,重启服务,再试——成了!页面直接渲染出了phpinfo,那种成就感,你懂的!

同样地,data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+这种方式也能用,前提也是allow_url_include开启,这里提醒一句:真实攻防环境里这些配置基本都是关的,所以练手归练手,别拿靶场的经验去套生产环境,容易翻车啊兄弟。

第五步:日志包含——进阶玩法

最后我还试了个进阶的:日志文件包含,Apache的access.log会记录我请求的URL,那我先在URL里注入PHP代码(比如<?php @eval($_POST['cmd']);?>),URL编码后发请求,日志里就会留下这段代码的原文,然后用?page=../../../../phpstudy_pro/Extensions/Apache2.4.39/logs/access.log包含日志文件——代码执行成功!这一步稍微绕一点,但复现成功那一刻,我感觉自己像个真正的黑客(虽然只是在自己电脑上自娱自乐,嘿嘿)。

踩过的坑,你大概率也会遇到

说实话,整个干货文件包含复现过程也不是一帆风顺的,我第一次试php://filter的时候,路径写错了一个斜杠,页面一直报“failed to open stream”,我盯着屏幕看了十分钟才发现……还有一次,伪协议没生效,折腾半天才想起来是PHP版本问题,所以啊,复现的时候一定要有耐心,报错信息就是最好的老师,别一看到红字就关页面。

另外啰嗦一句:所有复现务必在自己搭建的本地环境或合法授权的靶场里进行,未经授权对他人网站做文件包含测试,那是违法的,这可不是开玩笑的哦!

写在最后

好了,这篇关于干货文件包含复现过程的文章就到这儿了,从环境搭建、LFI验证、敏感文件读取,到伪协议利用、日志包含,整套流程我都是亲手跑过的,每一步的坑和惊喜都写进去了,希望你看完能少走点弯路,直接上手开练,有什么卡住的地方,评论区喊我,我看到就回!下次打算聊聊文件上传的绕过姿势,感兴趣的记得蹲一波~

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]