文件包含漏洞小结

1. 原理

在通过服务器脚本的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露、恶意代码的注入等。

开发过程中,多个文件都会用到的代码,通常会放到一个单独的文件中,用到时再包含进来。当把包含的文件写死在程序中时,该漏洞是不存在的,但很多情况都会动态的去包含所需的文件,这时候则会产生文件包含漏洞。

实例代码


$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。


2. 函数

include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。
include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。

require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。
require_once:和 require 类似,不同处在于 require_once 只导入一次。



3. 本地文件包含

本地文件包含php.ini配置文件中开启allow_url_include


3.1 常见得敏感信息漏洞

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:

/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 配置文件

3.2 session文件包含漏洞

  1. 通过phpinfo的信息可以获取到session的存储位置。
    文件包含漏洞小结_第1张图片

  2. 通过猜测默认的session存放位置进行尝试。
    文件包含漏洞小结_第2张图片

  3. session中的内容可以被控制,传入恶意代码。

    
    

漏洞分析

此php会将获取到的GET型ctfs变量的值存入到session中。

当访问http://www.ctfs-wiki/session.php?ctfs=ctfs 后,会在/var/lib/php/session目录下存储session的值。

session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取。

文件包含漏洞小结_第3张图片

所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6。

到服务器的/var/lib/php/session目录下查看果然存在此文件,内容为:

username|s:4:"ctfs";
[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6
username|s:4:"ctfs"

漏洞利用

通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。

当访问http://www.ctfs-wiki/session.php?ctfs=后,会在/var/lib/php/session目录下存储session的值。

[root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1a
username|s:18:"";

攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。
文件包含漏洞小结_第4张图片


3.3 本地文件包含漏洞绕过

%00截断

条件:magic_quotes_gpc = Off php版本<5.3.4

测试代码:



路径长度截断

条件:windows OS,点号需要长于256;linux OS 长于4096
原理:

Windows下目录最大长度为256字节,超出的部分会被丢弃;
Linux下目录最大长度为4096字节,超出的部分会被丢弃。

测试代码:



点号截断

条件:windows OS,点号需要长于256
测试代码:



4. 远程文件包含漏洞

PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。

allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)

4.1 无限制远程文件包含

测试代码:


文件包含漏洞小结_第5张图片
文件包含漏洞小结_第6张图片


4.2 有限制远程文件包含绕过

测试代码:


代码中多添加了html后缀,导致远程包含的文件也会多一个html后缀。

文件包含漏洞小结_第7张图片


问号绕过

文件包含漏洞小结_第8张图片

#号绕过

文件包含漏洞小结_第9张图片

空格绕过

文件包含漏洞小结_第10张图片

你可能感兴趣的:(文件包含漏洞小结)