前言
当一个web
应用对上传文件的后缀名等限制严格,难以上传类似于PHP
这类可动态执行脚本的时候,可以考虑考虑比对一下中间件的版本号和尝试一下是否存在解析漏洞这个问题。
常见中间件的解析漏洞
IIS5.x-6.x解析漏洞
目前使用IIS5.x-6.x版本的服务器都是比较古老的网站,而且此处的解析漏洞只能解析asp
而不能解析aspx
。
其原理在于,服务器默认不解析;
后面的内容,理所应当的可以想到利用方式。
上传一个 shell.asp;.jpg
访问路径
www.zhhhy.com/xx.asp;.jpg
在6.x
版本中还可以使用目录解析方式,原理是IIS
会将.asp目录下的文件都解析成asp文件
www.zhhhy.com/a.asp/shell.jpg
其中,shell.jpg
包含着我们的一句话内容。
值得一提的是,还可以IIS
还可以解析.asa .cer ,cdx
这类文件类型。在测试时,不妨多试试,没准有意外惊喜。
PHP-CGI解析漏洞
由于PHP-CGI
中的一个配置项cgi.fix_pathinfo=1
默认是开启的,这导致当某个文件不存在时,会向前解析
www.zhhhy.com/shell.jpg/shell.php
当我们访问shell.php
并不存在时,则会将shell.jpg
当成php
脚本执行。
而正因这个特性,在IIS7.0,IIS 7.5
和Nginx
都存在解析漏洞。这本身并不是中间件产生的问题,而属于用户配置不当产生的问题,因此对于版本号要求不是那么大,测试时依旧多试试。
Apache解析漏洞
Apache
解析漏洞有两种方式。第一种未知后缀导致的,这是由于人为的配置不当,但凡是人为配置的问题,都和版本号无关。当
上传shell.php.zhhhy文件
访问 www.zhhhy.com/shell.php.zhhhy
由于Apache
并不认识.zhhhy
是什么文件,于是向左再取一个后缀,于是就当成了php
文件执行了。
第二种则是特殊符号(CVE-2017-15715)的助攻。影响版本在2.4.0
到2.4.29
即可。在上传文件的时,在文件名以十六进制的方式加入一个换行符%0a(0x0a)
。P神对原理进行了简单解释P神对原理进行了简单解释
Nginx解析漏洞
上文提到在PHP-CGI
的默认产生会导致Nginx
存在一个解析漏洞,这本身并不是Nginx
的锅。而在< 8.03
的版本中,如果上传文件名如shell.jpg%00.php
,则会解析成PHP
文件。
防御
网上已有很多防御方法,此处不再摘抄。自己总结了一下,配置问题则当然检查配置。而如何配置是正确,那则要有一定的积累,这就是所谓的安全基线。如果是系统本身的问题,则该升级则升级,该打补丁则打补丁。有时候会遇到说不能升级系统,希望靠waf
设备在流量层做拦截,那么就是要配置规则,因为没有做过实际开发和运维,不知道直接拦截多后缀的请求是否得当,毕竟解析漏洞多数都有多后缀的特征。
闲话
解析漏洞对于使用的中间件和中间件的版本号都有一定要求,也就证明了渗透测试第一步信息收集的重要性。当然也由于人为配置问题的因素存在,并不意味着版本号是不存在漏洞的就不会出现问题。总之,多试试,不会有啥毛病的。