文件解析漏洞

接上一篇文件上传漏洞
(主要以apache+php环境为例 因为只用过这个组合

0x00 概述,什么是文件解析漏洞

从上一篇我们知道了如何绕过服务器的过滤,把不合法的文件上传到服务器上。但是现在还没有结束,上传的文件还没有被执行,没有实现它应有的功能。

如果我们知道上传的文件放在哪里,就可以通过url请求这个脚本文件,同时如果服务器正好支持了PHP的解析,这样上传的文件将会通过apache激活PHP处理器,执行php代码。显而易见的是,apache应该至少支持一种脚本文件用以正常的网站访问,所以总会有脚本文件被解析执行,所以不能通过禁止解析所有种类的脚本文件来确保安全。

但是由于文件在上传的时候进行了过滤且假设过滤成功,那么所有以.php结尾的脚本文件都无法上传,使得服务器内部的php文件全部来自网站,是可信的,可以正常解析执行。然而我们设法绕过了上传的检测,使得一些异形的php脚本文件上传到了服务器上,类似于.php .pht .phtml .php5 .php3 .php4 .php7 .pHp .PhP之类,同时服务器由于不安全的配置使得这些异形php文件可以被执行。

这样一来,几个要素:上传的恶意脚本、脚本存放的位置、可以执行脚本的不安全配置,齐活,接下来使用一些菜刀类的webshell管理工具或者直接以浏览器打开url并以get/post方式发送命令就可以远程控制服务器。

0x01 关于web服务器(以apache为例)

web服务器用来处理客户端发来的请求。

个人的理解是一个平台一样的应用程序,由系统赋予权限执行。

在这个应用平台之上,有若干容器,apache的各个模块通过相应的配置文件,形成了web应用运行所必须的环境同时,apache也是由这些模块组织起来运行的,而配置文件由apache进行管理和解读。

而在容器中,维护着若干树形的文件结构,组织成了web应用即动态网站

当接到客户端发来的请求时,apache进行解析,若是请求一个静态文件,则直接返回给浏览器;而当请求一个动态页面譬如一个php脚本文件时,如果apache通过配置文件发现这个文件是可执行的,便将请求转发给php引擎,php引擎解析并执行了相应的脚本文件,形成了一个“临时的、动态生成的”HTML文件,交回给apache,apache再将其返回给浏览器渲染展示。而如果apache通过配置文件发现不允许执行php文件,便会认为它只是一个静态的文档,将会直接返回代码显示在浏览器上。

以下为运行于kali上的apache,可以看到很多配置文件,看名字就知道作用。apache运作时,通过这些配置文件才能正确安全的运行,不安全的配置带来可能的漏洞。

root@kali:~# cd /etc/apache2/
root@kali:/etc/apache2# ls
apache2.conf    conf-enabled  magic           mods-enabled  sites-available
conf-available  envvars       mods-available  ports.conf    sites-enabled

至于什么样的php脚本可以生成这类动态HTML文件,为什么可以生成HTML文件,这牵涉到cgi编程、中间件(?)和其他的一些东西,不做展开

前方灵魂画手高能,非战斗人员迅速撤离

image

不同的web容器用于执行不同的网站后台文件。常见的有:IIS执行asp,apache、nginx执行php,tomcat执行Java等


那么什么是IIS、apache、nginx、tomcat呢?

以下来源于百度百科,反正没有人会看这些介绍,抄百度百科一点凑个字数(笑),也可以跳过介绍或者自行百度

IIS:基于windows的互联网基本服务,包括ftp/ftps、nntp、HTTP/HTTPs、smtp等服务,其使用.net flameworks类库作为底层运行框架,ASP.NET作为开发工具

apache:Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中

nginx:Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

tomcat:Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目。Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

0x02 常用的web容器的解析漏洞

  • apache

apache解析文件有一个原则,当碰到不认识的扩展名时,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识则暴露其源代码。

例如:apache接到请求访问一个shell.php.aaa.bbb 文件。很明显,apache不认识.bbb扩展名,向前找到.aaa扩展名,也不认识,再向前找到.php扩展名,发现是php文件,便交给php解析器去执行。

那么apache如何认识各种类型的扩展名呢?如下所示是apache的配置文件,有一个默认的配置文件,bbs.conf是我们另行添加的。内容很简单:指示apache碰到扩展名中含有php的,就把它当作php文件发给php解释器执行。作用之后会体现出来,暂且按下不表。

root@kali:/etc/apache2/sites-enabled# ls
000-default.conf bbs.conf
root@kali:/etc/apache2/sites-enabled# cat bbs.conf
AddHandler application/x-httpd-php .php

/var/www/html(apache的默认网站文件存放目录)之下,手动添加一个1.php.aaa文件和一个正常的1.php文件,如下所示

root@kali:/etc/apache2/sites-enabled# cd /var/www/html
root@kali:/var/www/html# ls
1.php    1.php.aaa   _create_admin_pwd.php  index.php    Model      readme_tech.txt  Template  View
1.php.1  Controller  Engine                 LICENSE.txt  README.md  static           Upload
root@kali:/var/www/html# 

二者的内容均为

root@kali:/var/www/html# cat 1.php
<?php
phpinfo();
?>
root@kali:/var/www/html# cat 1.php.aaa
<?php
phpinfo();
?>

//phpinfo();是一个简单的测试函数,用于输出php的一些配置

使用浏览器访问1.php文件,看到正常解析执行,输出了php配置信息。
image
这个时候,apache进行的是正常的逻辑。

但如果我们去访问1.php.aaa,会发现没有被执行
image
这个时候apache执行的逻辑中,确实把1.php.aaa发送给了php解释器去执行,但是php解释器拿到这个文件,也不认识扩展名,那咋办呢?那就只能发回原来的代码本身了。但是在我这里浏览器无法显示源代码,所以使用wget 127.0.0.1/1.php.aaa命令,访问服务器。

root@kali:/var/www/html# wget 127.0.0.1/1.php.aaa
--2018-12-25 05:57:53--  http://127.0.0.1/1.php.aaa
正在连接 127.0.0.1:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:20
正在保存至: “1.php.aaa.2”

1.php.aaa.2               100%[=====================================>]      20  --.-KB/s  用时 0s      

2018-12-25 05:57:53 (1.76 MB/s) - 已保存 “1.php.aaa.2” [20/20])

root@kali:/var/www/html# cat 1.php.aaa.2
<?php
phpinfo();
?>

可以看到服务器返回给我的是源代码。

如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:
SetHandler application/x-httpd-php
然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件

  • IIS6.0

1、当建立*.asa、*.asp格式的文件夹时,其目录下的所有文件将被IIS当作asp文件解析
2、当文件名为 *.asp;1.jpg 时,IIS6.0将以asp脚本执行
3、//WebDav扩展协议漏洞

  • nginx

访问http://www.xxxx.com/1.jpg/1.php,此时1.jpg将被当作PHP脚本来解析。这导致攻击者可以上传图片马,并在访问时url后加/xxx.php,就可以执行php脚本.

  • IIS7.0/nginx<8.03:

传一个名字为wooyun.jpg,内容为');?>的文件,然后访问wooyun.jpg/x.php,在这个目录下就会生成一句话木马 shell.php

  • nginx<8.03

影响版:0.5.,0.6, 0.7 <= 0.7.65, 0.8 <= 0.8.37 Nginx在图片中嵌入PHP代码然后通过访问 xxx.jpg%00.php 来执行其中的代码

  • windows

    test.asp.
    test.asp(空格)
  test.php:1.jpg
  test.php::$DATA
  shell.php::$DATA…….

会被windows系统自动去掉不符合规则符号后面的内容。

在windows环境下,xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单.若上传成功,空格和点都会被windows自动消除,这样也可以getshell。

posted @ 2018-12-25 20:29  柏凝  阅读(374)  评论(0编辑  收藏  举报