文件包含

原理

什么是文件包含

文件包含就是为了将写好的代码功能更好的重复使用,用文件包含函数,将写好的功能代码直接引入到另一个代码页中,这样另一个代码页就不需要在写一遍重复的功能性代码。

什么是动态包含

在使用文件包含的时候,为了更灵活的包含文件,将文件包含的名字处设置为变量,而这个变量是通过GET方式来获取的值,这样既可通过前端所输入的文件名进行包含对应的文件。

远程包含和本地包含

本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行。

远程文件包含就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本。 此漏洞是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码。

本地文件包含与远程文件有着相同的原理,但前者只能包含服务器上存在的文件,而后者可以包含远程服务器上的文件。

原理

如动态包含所说,如果为了方便,采取动态包含的方式,那么恶意用户就有可能通过将值改变为恶意的文件,这样就会让后端执行恶意的文件。

若恶意用户构造文件名为本地的敏感信息,而后端并没有对敏感信息限制读取权限限制,则可能造成文件包含漏洞,导致任意文件读取。

若恶意用户构造文件名为远程的文件包含,那么这个被包含的文件为hack构造的恶意代码,而后端没有对这个代码进行检测,则可能造成恶意代码执行。

利用

1.配合文件上传进行getshell

图片带有脚本后门代码,包含这个图片,脚本代码就会被触发

2.配合日志文件进行getshell (过滤.)

日志会记录访问的UA信息,修改UA信息为后门代码,包含日志文件即可执行后门代码

3.配合会话文件进行getshell

session修改为后门代码

4.伪协议进行getshell (代码部分过滤 /协议开关)

利用方法 伪协议 读写文件编码转码

利用data协议 编码转码 convert.iconv等绕过符号等过滤

采用链接 PHP伪协议总结 - 个人文章 - SegmentFault 思否

协议全部过滤

日志文件

1.通过f12 network 查看中间件 搜集中间件日志文件路径

2.日志文件中会记录访问者的UA信息 通过抓包修改UA信息为 php代码

3.直接读取.log日志文件 include() 里面的东西都以php代码执行 就直接执行了php代码

session文件

1.通过信息收集找到session路径

2.因为session文件名写入服务器是随机的 我们需要抓包修改cookie中的PHPSESSIONID=xxx 即可修改文件名后id(中间件服务器不同前id不一样)

3.通过post传递PHP_SESSION_UPLOAD_PROGRESS的值为PHP代码 文件包含访问session路径

漏洞发现

黑盒

flie?=xxx.php

主要观察参数传递的数据和文件名是否对应

白盒

1、可通过应用功能追踪代码定位审计

2、可通过脚本特定函数搜索定位审计

3、可通过伪协议玩法绕过相关修复等