文件包含漏洞

文件包含

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接用此文件,而无需
再次编写,这种调用文件的过程一般被称为包含。

一、原理和定义

为什么会产生文件包含漏洞?

程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用,但正
是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
以php,webapplication 中居多。
jsp,asp,很少
这与程序开发人员的水平无关,而问题在于语言设计的弊端。
文件包含常用函数

在php中提供了四种包含文件的函数

1.incudec() //找不到被包含的文件时只会产生警告(E_WARNING),脚本将继续执行;
2.incudec_once() //此语句和incudec()语句类似,唯一区别是如果该文件中的代码已经被包含,
则不会再次包含;
3.require() //找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本。
4.require_once() //此行语句和require()语句类似,唯一区别是如果该文件中的代码已经被包
含,则不会再次包含。
include_once() 和 require_once() 这两个函数只包含一次,适用于在脚本执行期想确保它只被包括
一次以避免函数重定义,变量重新赋值等问题。
当使用这四个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核并不会在意该包含的文
件是什么类型。(无论是txt、图片文件,远程URL,全都作为PHP代码执行)
文件包含利用:
不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容为php则会正常执行并返回结
果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令
执行;

1. 测试非php文件是否打印内容

2. 测试php文件是否解析成功并执行

3. 文件包含的特征

URL中出现以下参数时,联想到文件包含
?page=
?file= .
?home=

4. 要想成功利漏洞,需的条件

1 included等函数通过动态变量的方式引入需要包含的文件;
2 用户能够控制该动态变量.
3. 被包含的文件可被访问

5. 本地文件包含

能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞( Local file inclusion,简称LFI)

test test

6. 远程文件包含

如果PHP的配置选项 allow url include为ON的话,则 include/require函数是可以加载远程文件的,这种漏
洞被称为远程文件包含漏洞( Remote File Inclusion,简称RFⅠ)。
如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞
允许远程文件包含的配置文件修改内容 allow_url_fopen = On(是否允许打开远程文件) allow_url_include = On(是否允许include/require远程文件)

二,常用的本地文件绝对路径

这些路径不是绝对的!!!

Windows系统

c:\boot.ini // 查看系统版本
C:\Windows\System32\config\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默认配置文件
/etc/resolv.conf
/root/.ssh/known_hosts
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
可以写入字典,爆破可返回包的长度来爆破站点的路径

三,漏洞利用方式

(1) 日志文件包含

【前提】 知道日志文件的绝对路径(可以通过文件包含漏洞对路径爆破)
【exp】
①构造含有php代码的URL(将php代码上传到日志文件)
文件包含漏洞_第1张图片
由于浏览器会自动转码,导致上传到日志文件的内容不是正规的php代码
②修改为php代码格式发送
文件包含漏洞_第2张图片
③包含日志
文件包含漏洞_第3张图片

四,利用PHP伪协议

PHP 带有很多内置 URL 风格的封装协议,可以利用http协议(GET,POST传数据)
File:// 访问本地文件系统
http:// 访问 HTTPs 网址
ftp:// 访 问 ftp URL php:// 访问输入输出流
Zlib:// 压缩流 data:// 控制输入流数据
input:// 利用POST方式传数据
filter:// 用于本地磁盘文件进行读取

(1)file:// -----读取文件内容

使用条件
①PHP版本大于等于5.2
②allow_url_fopen: off/on && allow_url_include: off/on
exp时的作用
①读取文件内容 ②可以读取非网页根目录的内容
文件包含漏洞_第4张图片

(2)php://input伪协议

使用条件
①PHP版本大于等于5.2
②allow_url_fopen: off/on && allow_url_include: on
exp时的作用
①可以POST方式传参数
②可以写入木马文件
③可以在目标上完成命令执行
【实列】
【实验环境:php版本为5.4.45,开启include,apache,Windows】
①通过burp suite抓包修改请求方式,传入探针
文件包含漏洞_第5张图片
②通过php函数执行系统命令
文件包含漏洞_第6张图片
③写入木马文件

');?>

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

(3)data://

使用条件
①PHP版本大于等于5.2
②allow_url_fopen: on && allow_url_include: on
exp时的作用
将原本的包含文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了
你的输入流,通过你输入payload来实现目的
重定向显示探针等作用
协议介绍
数据流封装器

text/html和text/plain的区别

①text/html的意思是将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自 动调用html的解析器对文件进行相应的处理。
②text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理。
文件包含漏洞_第9张图片
文件包含漏洞_第10张图片

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