文件包含漏洞

Posted by Tattoo on 2019-07-09
Estimated Reading Time 3 Minutes
Words 811 In Total
Viewed Times

原理介绍

程序开发人员一般 把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程被称为文件包含。将被包含的文件设置为变量,用来进行动态调用。在URL中,变量名一般表现为file或page参数名。通过函数引入文件时,由于传入的文件名没有经过合理的校验,从而包含了预想之外的文件,可能是敏感信息,也可能是恶意文件。

文件包含漏洞主要分为本地文件包含(LFI)远程文件包含(RFI)
(以PHP为例)

常用文件包含函数

require()

找不到被包含的文件时会产生致命错误,并停止脚本

include()

找不到被包含的文件时只会产生警告,脚本继续执行

require_once()、include_once()

这两个函数只包含文件一次,如果该文件中的代码已经被包含,则不会再次包含。
适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,如想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

本地文件包含

顾名思义,就是包含本身存在于网站服务器的文件

本地文件包含多数是包含本地敏感信息文件,比如网站服务器的配置文件,系统版本以及账号密码等等

包含本地文件需要知道被包含文件的准确路径

常见的敏感信息路径:

Windows系统

c:\boot.ini     // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml     // IIS配置文件
c:\windows\repair\sam     // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini     // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD     // MySQL root密码
c:\windows\php.ini     // php 配置信息
......

Linux/Unix系统

/etc/passwd         // 账户信息
/etc/shadow         // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf         // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf         // 虚拟网站配置
/usr/local/app/php5/lib/php.ini         // PHP相关配置
/etc/httpd/conf/httpd.conf         // Apache配置文件
/etc/my.conf         // mysql 配置文件
......

LFI示例

假设已知存在敏感文件data.txt

通过更改URL中的page参数可以包含data.txt文件

成功读取文件信息

远程文件包含

远程文件包含就是包含的文件不在本地而在第三方服务器上,调用其他网站的恶意文件进行打开

要实现远程文件包含功能,需要确保php.ini配置中
allow_url_fopen和allow_url_include为打开状态

RFI与LFI相差无几,只是把包含文件的URL的换成外网链接

RFI示例

假设已知存在敏感文件admin.php

与LFI相似,更改URL中的page参数为外网地址加文件路径,成功包含了admin.php文件
如果admin.php文件内容是一句话木马,可以get shell,危害较大

漏洞防御

1 .严格判断包含中的参数是否外部可控
2 .限制路径,禁止目录跳转字符,如:”../“
3 .不使用动态包含


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !