目录

Web安全之容器解析漏洞


1. 容器解析漏洞介绍

容器解析漏洞,也叫文件解析漏洞,是指web容器在解析文件时出现了漏洞,将其他文件在某种情况下被当做脚本文件执行。

例如,攻击者上传了一个后缀名为.jpg的图片格式文件,但在容器解析漏洞下,访问该图片文件,web容器就将该文件中的内容当做脚本代码执行,导致攻击者可以在文件内容中添加恶意代码,达到攻击服务器的目的。

容器解析漏洞产生的原因如下:

  • web容器本身的漏洞,导致其他文件被当做脚本执行
  • 配置有误:由于管理员的配置失误,导致该漏洞的产生。例如Apache.htaccess文件中,可以配置任何后缀的文件都被当做脚本文件执行

2. IIS解析漏洞

2.1 目录解析漏洞

IIS6.0中,当一个目录.asp结尾时,那么这个目录下的所有文件都会被当做ASP文件来执行。例如当一个目录为test.asp时,往此目录添加一个名为1.txt的文件,这个txt文件就会被解析为ASP文件

在这个漏洞中,攻击者上传文件时如果可以控制上传目录的路径,那么就可以绕过很多上传文件的防御手段,拿到webshell。

2.2 文件解析漏洞

IIS6.0中,当一个文件名称中有分号;时,IIS就会停止解析,将分号后的文件名忽略掉,并对分号前的文件名进行相应的解析。例如当一个文件名为test.asp;.jpg时,容器会把这个文件解析成test.asp

在这个漏洞中,如果服务端校验方式为后缀名校验,通过上传*.asp;.jpg类似这样的文件,即可绕过服务端校验。

2.3 配置错误导致解析漏洞

IIS7.0/7.5中,使用FastCGI方式调用php,并在php.ini里设置cgi.fix_pathinfo=1时,那么访问任意文件URL时,在URL后面添加/x.php字符时,该文件会被IIS当做php文件代码解析。例如一个文件名为1.png,当访问http://127.0.0.1/1.png/1.php时,就会将此文件内容当成php文件代码解析。

漏洞原理

http://127.0.0.1/1.png/1.php为例:

在这个版本的IIS中,IIS只要遇到URL中路径名以.php结尾,便不管该文件是否存在,直接交给php处理。而php接收到此请求,发现找不到1.php,这时就会去检查php的选项cgi.fix_pathinfo是否为1,如果为1,表示开启路径修复,那么php就会将/1.php去掉,再判断http://127.0.0.1/1.png是否存在,如果存在,那么就会把该路径文件中的内容当做php代码解析,导致漏洞产生。所以严格意义上来说,这不是IIS的漏洞,也不是php的漏洞,而是php配置问题。

技巧

php的选项cgi.fix_pathinfo,该值默认为1,表示开启路径修复。举个例子,当php遇到文件路径"/aaa.xxx/bbb.yyy/ccc.zzz"时,若"aaa.xxx/bbb.yyy/ccc.zzz"文件不存在,则会去掉最后的"/ccc.zzz",然后判断"/aaa.xxx/bbb.yyy"文件是否存在,若存在,则把"/aaa.xxx/bbb.yyy"当做php代码文件,若"/aaa.xxx/bbb.yyy"仍不存在,则继续去掉"/bbb.yyy",以此类推。

在某些版本的php中,由于增加了security.limit_extensions选择,未在此选项中的文件后缀都会被php拒绝执行,所以该漏洞也就不存在了。

2.4 其他


3. Nginx解析漏洞

与上面的IIS7的配置错误一样的解析漏洞。也是php的选项cgi.fix_pathinfo,设置为1,且Nginx也和IIS一样,看见URL中路径名以.php结尾,便不管该文件是否存在,直接交给php处理,导致漏洞产生。

针对该漏洞,Nginx似乎一直没打算改。经测试,在windows下,Nginx1.16.1 + php7.4.3 默认配置下依然会有这个问题。


4. Apache解析漏洞

4.1 多后缀特性

Apache的多后缀名特性,在某些情况下也会存在解析漏洞。例如一个文件为test.php.aaa,因为Apache是从右往左开始解析文件后缀的,这时Apache看见后缀名为aaa,不认识此后缀,那么继续向前解析,解析到下一个后缀为php,认识此后缀,于是将其交给php处理,导致漏洞产生。

4.2 .htaccess配置

.htaccess文件,可以定义和覆盖Apache的配置,在配置有误的情况下也可导致解析漏洞产生。当php以FASTCGI的模式工作在Apache上时,添加如下两句配置在.htaccess文件中:

1
2
AddHandler fcgid-script .aaa
FcgidWrapper "C:/tools/phpstudy_pro/Extensions/php/php7.4.3nts/php-cgi.exe" .aaa

即可让以aaa后缀结尾的文件当做php代码执行。

如下是另一种写法,这种写法即可让test.aaa被当做php代码执行:

1
2
3
4
<FilesMatch "test.aaa">
    SetHandler fcgid-script
    FcgidWrapper "C:/tools/phpstudy_pro/Extensions/php/php7.4.3nts/php-cgi.exe" .aaa
</FilesMatch>

5. 防御

  • 上传文件时使用白名单
  • 关注所使用容器的安全信息,及时升级
  • 对所使用容器的安全配置需了解清楚, 做好安全配置
  • 勿以root权限启动容器