————————————————
版权声明:本文为 CSDN 博主「_PowerShell」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51577576/article/details/128123224
转发博文:http://t.csdn.cn/bo3hT
- 什么是文件包含漏洞?
- 能讲一下文件包含漏洞的原理吗?
- 文件包含漏洞可以分为那两类,如何区分?
- 文件包含漏洞的分类
- 本地文件包含
- 远程文件包含
- 文件包含漏洞的危害
- PHP 中 Require 和 Include 函数区别
- 文件包含利用思路
- 假设攻击者已经知道某网站存在且仅存在本地文件包含漏洞,并且没有文件上传漏洞点及其他漏洞,如何 GetShell。
- php 中要实现远程文件包含则需要对 php.ini 做什么操作?
- 常见的防范措施
- SESSION 文件常见的常见的路径有哪些?
- 在 php 站点中,如果我想使用 user-agent 插入 php 代码,如何进行包含?
- Windows 特殊文件有哪些?
- linux 特殊文件有哪些?
- 文件包含漏洞的绕过方式有哪些?
什么是文件包含漏洞?
1 | 文件包含漏洞是一种最常见的漏洞类型,它会影响依赖于脚本运行时的web应用程序。当应用程序使用攻击者控制的变量构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行时执行的文件。如果一个文件包含这个漏洞,为了方便起见,经常在开发阶段就实施。由于它经常用于程序开发阶段,所以这就为后来的攻击埋下了伏笔并导致了各种基于文件的攻击。 |
能讲一下文件包含漏洞的原理吗?
1 | 1、文件包含漏洞的产生原因是在PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。 |
文件包含漏洞可以分为那两类,如何区分?
文件包含漏洞的分类
文件包含漏洞分为本地文件包含 (Loacl File Inclusion,LFI) 和远程文件包含 (Remote File Inclusion,RFI)。二者有着相同的原理,但前者只能包含服务器上存在的文件,而后者可以包含远程服务器上的文件。
本地文件包含
本地文件包含就是通过浏览器包含 web 服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行。
远程文件包含
1 | 远程文件包含就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本。 此漏洞是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码。 |
文件包含漏洞的危害
1、通过文件包含漏洞,可以读取系统中的敏感文件,源代码文件等,如密码文件,通过对密码文件进行暴力破解。
2、若破解成功则可获取操作系统的用户账户,甚至可通过开放的远程连接服务进行连接控制。
3、不管是本地文件包含还是远程文件包含,文件包含漏洞还可能导致执行任意代码。
4、简单来说就是可能造成敏感文件泄露,获取 webs hell,任意命令执行。
5、导致文件包含的函数
PHP 中的包含函数
1 | include() |
JSP/Servlet 中的包含函数
1 | ava.io.File() |
ASP 中的包含函数
1 | include file |
PHP 中 Require 和 Include 函数区别
Require ():如果里面有一些错误就会停止运行。
Include ():有错误的话会产生警告信息,同时会接着往下执行。
文件包含利用思路
利用思路
一般来说文件包含漏洞会配合文件上传漏洞进行利用,如果不存在文件上传漏洞的情况下我们可以去获取一些敏感信息,或者利用日志文件记录报错的方法,来往日志文件中 “写入” 一句话木马
配合文件上传漏洞 getshell
1. 制作一个图片木马,通过文件上传漏洞上传
2. 通过文件包含漏洞对该图片木马进行包含
3. 获取执行结果
单独使用 getshell
由于没有存在文件上传点,而我们又需要服务器本地有个文件存在一句话木马代码,这时候我们想到,日志文件记录报错的方法,来往日志文件中 “写入” 一句话木马,然后再利用文件包含来执行日志文件中的一句话木马。
假设攻击者已经知道某网站存在且仅存在本地文件包含漏洞,并且没有文件上传漏洞点及其他漏洞,如何 GetShell。
由于没有存在文件上传点,而我们又需要服务器本地有个文件存在一句话木马代码,这时候我们想到,日志文件记录报错的方法,来往日志文件中 “写入” 一句话木马,然后再利用文件包含来执行日志文件中的一句话木马。
php 中要实现远程文件包含则需要对 php.ini 做什么操作?
1、需要确认 allow_url_fopen 和 allow_url_include 的值都为 On,也就是打开状态。
2、如果不是打开状态,我们设置未打开并且完成之后需要重启才能生效。
3、allow_url_fopen:默认值是 ON。允许 url 里的封装协议访问文件。
4、allow_url_include:默认值是 OFF。不允许包含 url 里的封装协议包含文件。
常见的防范措施
任意文件包含漏洞的主要出现在能够解析处理脚本文件的函数上,没有对输入的变量进行过滤,导致任意文件包含,进而导致恶意代码执行。在开发处理这类功能函数上,一定要遵循编程规范;在代码核心处,对变量进行过滤限制,设置文件路径或者白名单,避免执行任意文件包含。
设置白名单
代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
过滤危险字符
由于 Include/Require 可以对 PHP Wrapper 形式的地址进行包含执行(需要配置 php.ini),在 Linux 环境中可以通过”…/…/” 的形式进行目录绕过,所以需要判断文件名称是否为合法的 PHP 文件。
设置文件目录
PHP 配置文件中有 open_basedir 选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP 仅仅在该目录内搜索文件。
关闭危险配置
PHP 配置中的 allow_url_include 选项如果打开,PHP 会通过 Include/Require 进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP 默认是关闭的。
SESSION 文件常见的常见的路径有哪些?
1 | /var/lib/php/sess_PHPSESSID |
在 php 站点中,如果我想使用 user-agent 插入 php 代码,如何进行包含?
包含 environ 文件即可,常见路径为 /pros/self/environ。
包含思路
proc/self/environ 中会保存 user-agent 头,如果在 user-agent 中插入 php 代码,则 php 代码会被写入到 environ 中,之后再包含它,就可以完成包含 user-agent 插入的 php 代码。
利用条件
php 以 cgi 方式运行,这样 environ 才会保持 UA 头。
environ 文件存储位置已知,且 environ 文件可读。
Windows 特殊文件有哪些?
1 | C:\boot.ini |
linux 特殊文件有哪些?
1 | /root/.ssh/authorized_keys |
文件包含漏洞的绕过方式有哪些?
文件后加入特殊字符绕过
利用工具,将访问路径后加入 %00,可以绕过后缀检查。
或者后面加一些特殊字符例如 斜杠 点之类。
省略后缀
有些程序会将传入参数指引到其他位置,或者修改后缀名,先访问文件判断,例如不需要写后缀名。
双写绕过
当写入文件时,发现删除某些特殊字符,我们可以判断是删除了其中字符,例如”php",“…/”,只需再增加一个使其删除后得到我们需要的,需要注意绝对路径与相对路径。
利用目录解析漏洞
如中间件是 nginx 时,我们可以利用 nginx 目录解析,当我们只能上传.jpg 文件时,我们无法利用,只能原文读取出来,但是发现在 shell.jpg 后加 /xxx.php, 他就能以 php 方式读取文件,这就是目录解析漏洞。
包含日志文件
当我们访问不存在目录时,例如:http://lfi.cn/LFI-1/
它会将错误路径保存在日志中。不同的中间件有不同的路径。
日志文件名字为 access_log,access.log,error.log,Logfiles 等。
伪协议包含
当不能直接访问目录下文件时,可以选择利用伪协议来访问文件,前提是 allow_url_fopen 和 allow_url_include 都是打开状态。
1 | 1.page=file://[绝对路径] |