PHP安全---文件包含漏洞

原理就是注入一段用户能控制的脚本或代码,并在服务器端执行。
常见的导致文件包含的函数如下:
PHP: include(), include—once(),require(), require_once(), fopen(), readfile(),…
当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核并不会在意该被包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程URL,也都将作为PHP代码执行。
要想成功利用文件包含漏洞,需要满足下面两个条件:
(1)include()等函数通过动态变量的方式引入需要包含的文件;
(2)用户能够控制该动态变量。
**

本地文件包含

**
能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞(Local File Inclusion,简称 LFI)。
PHP内核是由C语言实现的,因此使用了 C语言中的一些字符串处理函数。在连接字符 串时,0字节(\x00)将作为字符串结束符。所以在这个地方,攻击者只要在最后加入一个0 字节,就能截断变量之后的字符串,即:
…/etc/passwd\0
UrlEncode下是:%00
但在一般的Web应用中,0字节用户其实是不需要使用的,因此完全可以禁用0字节,比 如:

<?php
function getVar($name)
{
$value = isset ($_GET [$name]) ?$__GET[$name] :null;
if (is_string($value))
$value =str_replace(”\0”,	“ ”, $value);  //
?>

这样并没冇解决所打问题,Web内的安全研究者cloie发现了 一个技巧——利用操作系统对目录最大长度的限制,可以不需要(0字节而达到截断的目的。目录字符串,在Windows下 256字节、Linux下400字节时会达到最大值,最大值长度之后的字符将被丢弃。如何构造出 这么长的目录呢?通过的方式即可,比如:
/abc
或者
…/abc/…/abc/…/…/abc/…/…/abc

常见的目录遍历漏洞,还可以通过不同的编码方式来绕过一些服务器端逻辑。比如CVE-2008-2938,就是一个Tomcat的目录遍历漏洞。
如果 context.xml 或 server.xml 允许’allowLinking1 和’URIencoding’为’UTF-8’,攻击者就可以以Web权限获得重要的系统文件内容。
目录遍历漏洞是一种跨越目录读取文件的方法,但当PHP配置了 open_basedir时,将很好地保护服务器使得这种攻击无效。
要解决文件包含漏洞,应该尽量避免包含动态的变量,尤其是用户可以控制的变量。一种 变通方式,则是使用枚举,比如:

<?php
$file = $_GET[,file,];// Whitelisting possible values
 switch ($file) { 
 case :'main‘; 
 case :'foo';
 case :'bar';
			include ' /home/www/run/include/ '.$file.'.php';
			break; 
default:
			include '/home/www/run/include/main.php';
?>

**

远程文件包含

**
如果PHP的配置选项allow_url」nclude为ON的话,则include/require函数是可以加载远程 文件的,这种漏洞被称为远程文件包含漏洞(Remote File Inclusion,简称RFI)。
**

本地文件包含的利用技巧:

**
(1)包含用户上传的文件。
(2)包含 data:// 或 php://input 等伪协议。
(3)包含Session文件。
(4)包含曰志文件,比如Web Server的access log。
(5)包含/proc/self/environ 文件。
(6)包含上传的临时文件(RFC1867)。
(7)包含其他应用创建的文件,比如数据库文件、缓存文件、应用日志等,需要具体情况具体分析。
1.包含用户上传文件能否攻击成功,取决于文件上传功能的设计,比如要求知道用户上传 后文件所在的物理路径,有时这个路径很难猜到。(上传文件的目录不一定是上传文件所在的目录)。
2.伪协议如php://input等需要服务器支持,同时要求allowurl_include设置为ON。在PHP5.2.0之后的版本中支持data:伪协议,可以很方便地执行代码,它同样要求allowurl_ include 为ON。
3.包含Session文件
关于session文件的漏洞请看:
session文件的漏洞
4.包含日志文件是一种比较通用的技巧。因为服务器一般都会往Web Server的access_log里 记录客户端的请求信息,在errorlog里记录出错清求。因此攻击者可以间接地将PHP代码写 入到日志文件中,在文件包含时,只需要包含日志文件即可。
但需要注意的是,如果网站访问量大的话,日志文件有可能会很大(比如一个日志文件有 2GB),当包含一个这么大的文件时,PHP进程可能会僵死。但Web Server往往会滚动曰志, 或每天生成一个新的日志文件。因此在凌晨时包含日志文件,将提高攻击的成功性,因为此时 的曰志文件可能非常小。以Apache为例,一般的攻击步骤是,先通过读取httpd的配置文件httpd.conf,找到日志 文件所在的目录。httpd.conf—般会存在Apache的安装目录下,在Redhat系列里默认安装的可 能为/etc/httpd/ conf/httpd.conf,而自定义安装的可能在 /usr/local/apache/conf/httpd.conf 为。
如果httpd的配置文件和日志目录完全猜不到怎么办?如果PHP的错误回显没有关闭,那 么构造一些异常也许能够暴露出Web g录所在位置。
5.包含/proc/self/environ是一种更为通用的方法,因为它根本不需要猜测被包含文件的路径, 同时用户也能控制它的内容。这个文件用来验证访问权限,看是否有权限读取该文件内容。如果我们访问此文件,看到如下信息:
如果看到类似如下信息:

DOCUMENT_ROOT=/home/sirgod/public_html GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, /;q=0.1 HTTP_COOKIE=PHPSESSID=134cc7261b341231b9594844ac2ad7ac HTTP_HOST=www.website.com HTTP_REFERER=http://www.website.com/index.php?view=…/…/…/…/…/…/etc/passwd HTTP_USER_AGENT=Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.00 PATH=/bin:/usr/bin QUERY_STRING=view=…%2F…%2F…%2F…%2F…%2F…%2Fproc%2Fself%2Fenviron REDIRECT_STATUS=200 REMOTE_ADDR=6x.1xx.4x.1xx REMOTE_PORT=35665 REQUEST_METHOD=GET REQUEST_URI=/index.php?view=…%2F…%2F…%2F…%2F…%2F…%2Fproc%2Fself%2Fenviron SCRIPT_FILENAME=/home/sirgod/public_html/index.php SCRIPT_NAME=/index.php SERVER_ADDR=1xx.1xx.1xx.6x SERVER_ADMIN=webmaster@website.com SERVER_NAME=www.website.com SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SIGNATURE=
Apache/1.3.37 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at www.website.com Port 80
说明文件是可以访问,但是如果出现一个空白的页面说明文件不可以访问。
6.以上这些方法,都要求PHP能够包含这些文件,而这些文件往往都处于Web目录之外, 如果PHP配置了 open basedir,则很可能会使得攻击失效。PHP创建的上传临时文件,往往处于PHP允许访问的目录范围内。包含这个临时文件 的方法,其理论意义大于实际意义。PHP会为上传文件创建临时文件,其目录在php.ini的upload tmp dir中定义。但该值默 认为空,此时在Linux下会使用/tmp目录,在Windows下会使用C:\windows\temp目录。该临时文件的文件名是随机的,攻击者必须准确猜测出该文件名才能成功利用漏洞。PHP 在此处并没有使用安全的随机函数,因此使得暴力猜解文件名成为可能。在Windows下,仅有 65535种不同的文件名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值