文件包含漏洞
前言
本次将从一下几点学习文件包含漏洞。
漏洞描述
攻击者可以利用任意文件包含漏洞,读取文件,执行代码,对服务器造成危害。
程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成“封装”。在使用某个功能的时候,直接调用此文件,无需再次编写,提高代码重用性,减少代码量。这种调用文件的过程通常称为包含。
程序开发人员都希望代码更加灵活,所以会把被包含的文件的路径设置为变量,来进行动态调用(包含),但正是由于这种灵活性,如果被包含文件的路径客户端可控,造成任意文件包含漏洞。
几乎所有的脚本都会提供文件包含的功能,文件包含漏洞在PHP 的Web 应用中居多,在JSP/ASP/http://ASP.NET 程序中比较少。
漏洞原理
文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用PHP文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,web 应用没有进行严格的校验,浏览器客户端用户可以影响控制被包含文件的路径,就会产生任意文件包含漏洞。
漏洞场景
程序开发人员都希望代码更加灵活,所以会把被包含的文件的路径设置为变量,来进行动态调用(包含),但正是由于这种灵活性,如果被包含文件的路径客户端可控,造成任意文件包含漏洞。
几乎所有的脚本都会提供文件包含的功能,文件包含漏洞在 PHP 的 web 应用中居多在 JSP、ASP、ASP、NET 程序中比较少。
漏洞评级
高危
漏洞危害
-
web服务器的文件被外界浏览导致信息泄露;
-
脚本被任意执行,典型影响如下:
-
篡改网站;
-
执行非法操作;
-
攻击其他网站;
漏洞验证
metinfo 5.0.4 文件包含漏洞复现
PHP文件包含语句
语句 | 区别 |
---|---|
include | 多次包含,多次执行;如果包含失败,脚本产生警告,继续运行 |
include_once() | 多次包含,一次执行;如果包含失败,脚本产生警告,继续运行 |
require() | 多次包含,多次执行;如果包含失败,脚本产生错误,结束执行 |
require_once() | 多次包含,一次执行;如果包含失败,脚本产生错误,结束执行 |
相关配置
//php.ini
allow_url_fopen = On/Off //通过远程方式打开软件
allow_url_include = On/Off //通过远程方式包含文件
源码文件
这两个文件中可以看出存在文件包含漏洞,图一中的require_once $module
存在动态调用,进入到图二查看,这里给了一个值7,如果等于7的话就不会进入别的if语句中执行,我们这里直接赋值?fmodule=7
验证
?fmodule=7&module=../../phpinfo.php
漏洞利用
- 根据会无视拓展名的作用上传包含木马的图片
- 猜测路径读取 敏感文件
- 利用PHP防伪协议读取PHP源码
- 修改数据宝为POST请求利用I/O流的input方法执行PHP恶意代码
漏洞防御
- 建议开发人员尽量少使用动态包含
- 过滤被包含的文件路径
- 将php.ini中的allow_url_include参数设置为Off
- 限定文件的访问范围
典型案例
metinfo 5.0.4