漏洞复现之中间件解析漏洞

中间件解析漏洞

Apache httpd多后缀文件解析漏洞(CVE-2017-15715)

漏洞描述

Apache httpd允许一个文件可以有多个以点分割的后缀,Apache会从最右边开始识别其后缀名,如遇无法识别的后缀名则依次往左进行识别,如果运维人员给.php后缀的文件添加了处理程序 AddHandler application/x-httpd-php .php 那么在有多个后缀的情况下,只要文件含有.php后缀那么该文件就会被识别为PHP文件进行解析;如果添加了AddType application/x-httpd-php .html,那么凡是.html格式的都会以php方式执行。

形成原因

该漏洞和apache版本和php版本无关,属于用户配置不当造成的解析漏洞。

漏洞复现

1、打开Linux操作系统(比如Kali、Ubuntu等都可以,以下是用Kali实验的),利用vulhub进行漏洞复现,进入vulhub中该漏洞的目录下:

cd vulhub/httpd/apache_parsing_vulnerability

image-20221028184414450

2、启动该漏洞环境,发现是一个可以文件上传的界面。

sudo docker-compose up -d

image-20221028185019582

3、利用vim编辑器编写一个php脚本,将文件命名为11.php.jpg,进行上传,发现上传成功。

image-20221028200712862

image-20221028200753913

image-20221028200813622

5、根据提示路径,访问上传的文件,发现php文件解析成功。其核心原因就是后缀jpg在白名单中,所以可以成功上传,但是由于Apache配置不当而产生的多后缀解析漏洞,导致只要后缀里有.php,就都按php解析执行,因此访问时php脚本执行成功。

image-20221028201002249

Nginx配置文件错误导致的解析漏洞

漏洞描述

php中的参数开关cgi.fix_pathinfo用于修正路径,对于接收到的文件路径(如1.jpg/2.php),php会从后往前解析,如果后面的路径2.php不存在,那么就会向上找,如果上一级文件是存在的,就会按照刚才不存在的后缀来解析这个存在的文件,从而造成解析漏洞。之所以属于Nginx的漏洞是因为Nginx接收到文件路径时从后往前解析,如果发现最后一个后缀是php,就会直接交给php处理,并不会检查是否这个路径是否存在,所以属于Nginx的解析漏洞。

形成原因

该漏洞和nginx版本和php版本无关,属于用户配置不当造成的解析漏洞。

复现过程

制作一个图片马,进行上传,上传成功后的到路径,访问路径,在后面加上一个不存在的php文件,访问后会发现图片马会被成功解析。

image-20221031142058219

image-20221031142236044

image-20221031142213536

修复方案

方案一:将php.ini文件中的cgi.fix_pathinfo的值设置为0,这样php再解析1.php/1.jpg这样的目录时,只要1.jpg不存在就会显示404页面。

方案二:php-fpm.conf中的security.limit_extensions后面的值设置为.php。意思是你只有后缀是.php,我才会承认你是一个php文件,按照php执行,如果你是.jpg,硬说自己是php,我无法按PHP执行。

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

漏洞描述

Nginx在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码,然后通过访问XXX.jpg%00.php来执行其中的代码。

详细点:

该漏洞利用了Nginx错误的解析了URL地址,导致可以绕过服务端限制,从而解析PHP文件,造成命令执行的危害。

​ 举个例子,比如,Nginx匹配到.PHP结尾的请求,就发送给fastcgi进行解析,常见的写法如下:

location ~ \.PHP$ {
    include        fastcgi_params;
 
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.PHP;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
    fastcgi_param  DOCUMENT_ROOT /var/www/html;

​ 正常情况下(关闭了pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。而存在CVE-2013-4547的情况下,我们请求1.jpg0x20.PHP,这个URI可以匹配上正则.PHP$,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.jpg[0x20](相当于截断),那么就将1.jpg当作php来解析,这样如果1.jpg是个图片马,就可以成功被解析。

形成原因

Nginx在遇到%00空字节时与后端FastCGI处理不一致

影响版本

  • Nginx 0.8.41~1.4.3
  • Nginx 1.5.0~1.5.7

复现过程

1、打开靶场环境:

cd vulhub/nginx/CVE-2013-4547
sudo docker-compose up -d

image-20230303180115849

2、上传图片马,将文件名改成611.jpg%20%00.php,然后将其进行URL解码(看成post型00截断)

image-20230303184239228

image-20230303184406365

image-20230303184448811

3、上传成功后进行访问,但是发现路径中的%20空格会被忽略,所以抓包改为刚才修改的格式后在发送,进行访问。

image-20230303185030073

image-20230303185108257

image-20230303185138405

4、访问成功,图片马被成功解析。

image-20230303185206298

IIS解析漏洞(6.X版本)

影响版本

  • IIS 6.X

基于文件名的解析漏洞

该版本的IIS在解析文件名时,如果遇到分号;会默认为结束,不会解析分号及后面的内容,因此对于*.asp;.jpg此种格式的文件名就会被当作asp解析。

611.asp;.jpg ——>  611.asp

基于文件夹名的解析漏洞

该版本的IIS默认会将*.asp/目录下的所有文件当成asp来解析。

127.0.0.1/test.asp/611.jpg ——>  611.jpg在asp/的目录下,所以被当做asp来解析

其他解析漏洞

IIS6.x除了会将扩展名为.asp的文件解析为asp之外,还默认会将扩展名为.asa,.cdx,.cer解析为asp。

修复方案

1、上传的文件进行随机数重命名。

2、限制上传目录的执行权限,不允许执行脚本。

IIS解析漏洞(7.X版本)

影响版本

  • IIS 7.X

解析漏洞

IIS7.X版本在Fast-CGI运行模式下,对于文件名加上/.php的会按照php来解析。

611.jpg/.php ——> 611.jpg按照php来解析

修复方案

cgi.fix_pathinfo=1
posted @ 2023-04-13 11:29  6小1  阅读(285)  评论(0)    收藏  举报