一、文件解析漏洞简介
文件解析漏洞是Web安全领域中的一种常见漏洞,主要发生在应用程序解析文件时,未能正确处理文件内容或格式,从而导致安全问题。这种漏洞可能被攻击者利用,通过上传或处理恶意构造的文件,来执行未授权的操作,例如远程代码执行、信息泄露、拒绝服务攻击等。
文件解析漏洞可以为文件上传漏洞提供漏洞利用的可能,两者关系紧密,相辅相成。结合文件上传漏洞,上传的是一张图片木马的话,利用解析漏洞可以使服务器将png等图片文件当作php等脚本文件执行。
二、.htaccess攻击(.htaccess 文件解析)
2.1 .htaccess配置简介
如果网站允许.htaccess
配置覆盖全局配置文件,并且.htaccess
文件用户可以上传或编辑修改,那么网站存在巨大的安全漏洞,导致任意文件解析,网站沦陷。
.htaccess是Apache服务器的分布式配置文件,该配置文件会覆盖Apache服务器的全局配置,作用域是当前目录及其子目录。
如果一个Web应用允许上传.htaccess文件,那就意味着攻击者可以更改Apache的配置,这是十分危险的。. htaccess 攻击想象空间非常大。
首先看Apache的配置,允许.htaccess文件覆盖掉Apache的配置。
EX:Apache 允许.htaccess 文件覆盖掉Apache的配置
httpd.conf
![]()
![]()
AllowOverride All
如何利用.htaccess 攻击:
2.2 将.png文件当作PHP文件解析
将以下代码写入文件,并保存成.htaccess名字, 放到测试目录下
AddType application/x-httpd-php .png
在同一目录下创建一个文件[info.png],文件内容如下
<?php
phpinfo();
?>
当我们访问该文件时,[ info.png]内的PHP代码将会被执行。
EX:利用.htaccess文件使得.png文件可以被解析执行
1、准备.htaccess文件,win系统没法创建。
mac 创建,并上传到相应目录。mac上创建的话会隐藏起来。可以在BP抓包的时候再修改文件名。
![]()
mac 如何显示隐藏文件和.点开头文件?
如果想在Finder中就能直观看到隐藏文件,那么在终端中输入以下下命令:
defaults write com.apple.Finder AppleShowAllFiles YES killall Finder
win 用notepad++穿件新文件,保存的时候选择*.*格式即可创建.htaccess文件。
![]()
2、准备后缀名为.png的php脚本。
![]()
3、访问解析执行。
![]()
注释掉.htaccess中的配置,.png不可解析执行。
![]()
![]()
利用思路: 利用文件上传漏洞上传.htaccess文件,其中配置相关条目使得jpg,png等文件可以被当作php等可执行脚本解析。
2.3 文件名字中包含.php关键字即可执行
当文件名[info.php.png]中包含关键字[.php],并且.htaccess文件内容如下,info.php.png中的代码会被执行。
AddHandler php5-script php
EX:.htaccess 解析任意包含.php.关键字的文件
.htaccess 文件的内容
AddHandler php5-script php
准备相关测试文件:
haha.phpinfo.png 【❌,这种文件名不行,前后都有点才行】
haha.php.info.png 【✅,这种文件名可以,前后都有点才行】
![]()
2.4 匹配文件名解析
以下配置是匹配文件名[hack],找到该文件,并执行其中的PHP代码
<FilesMatch "hack">
SetHandler application/x-httpd-php
</FilesMatch>
EX:匹配文件名解析执行任意文件
1、.htaccess 文件的内容:
<FilesMatch "hack"> SetHandler application/x-httpd-php </FilesMatch>
2、准备测试文件:
hack【✅可以解析执行】
sxkhack【✅ 可以解析执行】
3、结论,只需要文件名中包含关键词就行。
EX:upload-labs-pass-4
1、准备.htaccess文件和待解析的目标文件 sxkhack
.htaccess
<FilesMatch "sxk"> SetHandler application/x-httpd-php </FilesMatch>
sxkhack
<?php phpinfo();?>
2、上传两者进行测试
![]()
.htaccess 和目标文件均上传成功,目标文件可以解析。
三、Web容器文件解析漏洞
3.1 Apache解析漏洞
Apache从后往前解析文件名,直到碰到它认识的文件名后缀时开始解析,这个过程中黑名单被绕过,目标可执行文件被成功解析执行。
⚠️:Apache新版版已经修复了从后往前的这样一个文件解析漏洞。常出现在CTF中。
EX:apache文件解析漏洞 upload-labs-pass-4
1、创建目标文件
后缀名:
.php.xxx.xx.x
内容:
<?php phpinfo();?>
2、上传进行漏洞验证
![]()
3.2 IIS6.0 解析漏洞
3.2.1 .asp;1.jpg
eg: time.asp;1.jpg
EX:IIS6.0文件解析漏洞之一 -.asp;1.jpg
windows 2003
1、创建合法目标文件
后缀名:time.asp
<%=time()%>
![]()
正常访问执行。
2、更改后缀名进行漏洞验证。
后缀名:time.asp;1.jpg
![]()
图像文件被解析执行。
![]()
3、结论
针对IIS6.0的解析漏洞,可以将恶意asp代码伪装成jpg图像等合法文件,绕过检测,服务器仍可以解析执行恶意代码。
3.2.2 1.asp/time.jpg
以.asp结尾的目录下的文件被解析为asp脚本执行。
EX:IIS6.0文件解析漏洞之二 -1.asp/time.jpg
1、创建 1.asp目录,下面的time.asp脚本改名为time.jpg
time.jpg的内容
<%=time()%>
2、访问测试
![]()
3、结论
以.asp结尾的目录下面的合法文件会被解析成脚本执行。
利用?设法创建1.asp这样的文件夹,下面放文件名合法但是内容是恶意代码的文件,恶意代码可以解析执行。
3.3 PHP CGI解析漏洞
3.3.1 原理
cgi.fix_pathinfo参数在默认开启的情况下会造成文件解析漏洞。
[info.png/.php ] png图片中的php代码解析执行。
平台:IIS7.5/7.0 + PHP 5.4.45/5.2.17 、 ngix + PHP
⚠️:这个漏洞跟IIS和nginx没关系,和PHP 参数 cgi.fix_pathinfo的设置有关系。
3.3.2 防御
F1、找到处理映射程序-请求限制-映射-勾上
F2、将PHP cgi.fix_pathinfo 设置为0
3.3.3 IIS7.0/7.5 + PHP环境测试和防御
一般来说php和apache配合。
EX:IIS7.0/7.5 + PHP CGI解析漏洞
step1:让IIS7.5/7.0支持PHP环境
1、安装IIS
![]()
IIS搭建成功。
删掉默认网站重新建一个网站。
2、新建站点。
test 80端口 指定物理路径 wwwroot
其实和默认站点配置一样。
3、IIS7调用PHP环境
使用phpstudy环境:C:\phpstudy\php\php-5.4.45
创建处理映射程序。
![]()
双击-添加模块映射-
![]()
名称随便起。点击确定,是。
![]()
配置FastCGI监视PHP配置文件
![]()
![]()
编辑-选择php.ini.
4、测试IIS是否支持PHP脚本解析
C:\inetpub\wwwroot\info.php
<?php phpinfo()?>
访问:
![]()
尝试解决:
请求限制设置成执行。
![]()
![]()
不行。改回脚本。
换5.2.17 ✅。可以了
![]()
step2:解析漏洞验证
将php脚本后缀改为 .png
访问的时候后面+ /.php
![]()
php脚本执行。
![]()
原因:cgi.fix_pathinfo默认开启。
step3:防御
防御:
找到处理映射程序-请求限制-映射-勾上
![]()
![]()
3.4 nginx解析漏洞
3.4.1 CGI解析漏洞
原理同IIS + PHP CGI解析漏洞
EX:nginx + PHP CGI解析漏洞
1、漏洞平台
ubuntu 20.04 192.168.33.6
vulhub-master/
2、漏洞测试
启动docker 环境
进入vulhub-master目录:
cd nginx/nginx_parsing_vulnerability/ sudo docker-compose build sudo docker-compose up -d
继续:
sudo docker-compose up -d ✅
访问:
![]()
漏洞测试:
![]()
![]()
http://192.168.33.6/uploadfiles/nginx.png/.php
漏洞成因。
![]()
3.4.2 nginx空字节漏洞
将info.php 重命名为info.html
访问后者,不能执行。但是后面 +%00.php 之后却可以解析执行。
原理:
读取整个URL之后,发现结尾是.php,移交给PHP解释进程来解析。
PHP解析进程从前往后看,到html为止,后面相当于null,解析执行。
3.4.3 nginx文件名逻辑漏洞(CVE**-2013-4547**)
EX:nginx 文件名逻辑漏洞
1、启动环境
先关闭之前启动的环境:
sudo docker-compose down
进入相应目录:
cd CVE-2013-4547 sudo docker-compose build
2、访问8080端口测试
上传info.php,抓包。
传info.php 上传失败:Unsupported filetype uploaded.
文件名后缀改成 png 上传成功:File uploaded successfully: /var/www/html/uploadfiles/phpinfo.png
关键步骤一:逻辑漏洞 文件名后面+一个空格
访问的时候抓包。
【新方法:将请求的URL复制到剪贴板 repeater模块,开一个标签,右键,粘贴URL作为请求】
![]()
![]()
关键步骤二:访问的请求中URL info.php ..php
![]()
关键步骤三:打开 请求的十六进制形式,
![]()
![]()
请求之后,目标PHP代码被解析执行。
![]()
总结
文件解析漏洞是Web安全中的一种漏洞,当应用程序在处理文件时,未能正确解析文件内容或格式,攻击者可利用此漏洞上传或提交恶意构造的文件,导致应用程序执行未授权操作,如远程代码执行、信息泄露或拒绝服务攻击。这种漏洞通常源于对文件扩展名、内容类型验证不足,或文件名路径过滤不严,以及文件内容解析逻辑存在缺陷。