0x01漏洞原理

网站WEB应用的一些文件上传功能,比如文档、图片、头像、视频上传。

上传功能的实现代码没有严格校验上传文件的后缀和文件类型时,就可以上传任意文件甚至是可执行文件后门。

0x02漏洞成因

造成文件上传漏洞的原因有:

开源编辑器的上传漏洞

服务器配置不当

本地文件上传限制被绕过

过滤不严或被绕过

文件解析漏洞导致文件执行

文件路径截断

0x03文件上传过程

文件检测

首先先来了解一下文件上传的过程,一个文件上传需要经过哪些检测流程
通常一个文件以HTTP协议进行上传时,将以POST请求发送至web服务器,web服务器接收到请求后并同意后,用户与web 服务器将建立连接,并传输数据
而一般一个文件上传过程中的检测如下图红色标记部分:

A 客户端 javascript 检测 (通常为检测文件扩展名)
B 服务端 MIME 类型检测 (检测 Content-Type 内容)
C 服务端目录路径检测 (检测跟 path 参数相关的内容)
D 服务端文件扩展名检测 (检测跟文件 extension 相关的内容)
E 服务端文件内容检测 (检测内容是否合法或含有恶意代码)

0x04webshell

webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

WebShell后门隐蔽较性高,可以轻松穿越防火墙,访问WebShell时不会留下系统日志,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员不容易发现入侵痕迹。攻击者可以将WebShell隐藏在正常文件中并修改文件时间增强隐蔽性,也可以采用一些函数对WebShell进行编码或者拼接以规避检测。除此之外,通过一句话木马的小马来提交功能更强大的大马可以更容易通过应用本身的检测。

 

 

0x05常见解析漏洞


Windows操作系统文件命名规则

Windows操作系统中,文件名不能以空格或“.”开头,也不能以空格或“.”结尾。当把一个文件命名为以空格或“.”开头或结尾时,会自动地去掉开头和结尾处的空格和“.”。利用此特性,也可能造成“文件解析漏洞”。
此外,Windows操作系统中的文件名是不区分大小写的,xxx.asp和xxx.Asp、xxx.php和xxx.PHp具有同样的效果。

Apache未知后缀名解析漏洞

影响版本Apache 1.x和Apache 2.x
Apache在解析文件时有一个原则:当碰到不认识的扩展名时,将会从后面向前解析,直到碰到认识的扩展名为止。

例如feng.php.QWE.ABC
Apache在处理时,先读取最后一个后缀,为ABC不认识,继续往左读取QWE不认识,读到php能识别这个后缀,于是就把feng.php.QWE.ABC当成是feng.php文件来解析,若是所有后缀都看完了没有一个认识怎么办?此时就会把该文件当做默认类型进行处理了,一般来说,默认类型是text/plain。

 

IIS 6.0解析漏洞

目录解析

若文件夹的名字后缀为 .asp、.asa,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。
例如创建目录 abc.asp,那么
/abc.asp/1.jpg
1.jpg将被当作1.asp文件来执行。不管你上传后你的图片改不改名都能拿shell了。

文件解析

 

原理是IIS 5.x/6.0在从文件路径中读取文件后缀时,遇到一个“.”后,便进入了一种截断状态,在该状态下遇到特殊符号 “/”和“;”,都会进行截断,只保留特殊符号前的部分,即“.asp”,从而认为文件后缀为“.asp”。

 

默认解析

IIS6.0 默认的可执行文件除了asp还包含这三种默认解析:/xx.asa /xx.cer /xx.cdx
原因:由于在 IIS 默认配置中,这几个后缀默认由 asp.dll 来解析,所以执行权限和 .asp 一摸一样,你可在配置中自行删除该后缀,以防止安全隐患
此处可联系利用目录解析漏洞 /xx.asa/xx.jpg 或 /xx.cer/xx.jpg 或 xx.asa;.jpg

 

Nginx (8.03版本以下) 空字节代码执行漏洞

原理:

该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
Nginx默认是以Fast-CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了

 

 

0x06常见绕过手法

客户端 javascript 检测 (通常为检测文件扩展名)

这类检测通常在上传页面里含有专门检测文件上传的 javascript 代码,最常见的就是检测扩展名是否合法

绕过方式:

1. 前端修改允许的类型

2 .burp抓包修改

3. 禁用javascript(火狐浏览器有禁用JS功能)

 

服务端检测绕过(MIME 类型检测)

主要是检测Content-Type: 字段

绕过方法:

burp抓包修改Content-Type: 为允许的字段

Content-Type: image/gif

Content-Type: image/png

Content-Type: image/jpeg

 

服务端检测绕过(文件扩展名检测)

黑名单检测,黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多

绕过方法:

1 .文件名大小写绕过

用 AsP,pHp 之类的文件名绕过黑名单检测

2. 名单列表绕过

用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类

3. 特殊文件名绕过

比如发送的 http 包里把文件名改成 test.asp. 或 test.asp空格,这种命名方式

在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性。

4 .htaccess 文件

配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测

 

(代码含义将检测文件名含有xxx的,自动解析为php形式)

5 .写入方法

首先名字为1.php:jpg,会写入一个1.php空文件,然后再上传一个文件,然后修改名字为3.<<<,这样就会把这个文件的内容写入到上传的1.php空文件中

6 .00截断绕过上传

1.php .jpg 空格二进制20改为00

 

 

0x07大马小马的区别

文件上传漏洞检测培训靶机项目python 文件上传漏洞测试过程_文件上传

 

 

 

 

0x08哪些地方存在文件上传漏洞

任何存在文件上传的地方都有可能存在文件上传漏洞,特别是在网站后台。特别的在用户界面上传头像、博客或者论坛上传图片,上传附件这些地方更易出现。

 

 

0x09防御

系统运行时的防御

1、文件上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。

2、判断文件类型。在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

3、使用随机数改写文件名和文件路径。文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

4、单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。

5、使用安全设备防御。文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。

 

系统开发阶段的防御

对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00截断符进行检测,对HTTP包头的content-type也和上传文件的大小也需要进行检查。

 

系统维护阶段的防御

1、系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。

2、定时查看系统日志,web服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。

3、对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自身的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。

 

 0x010提权

文件上传漏洞检测培训靶机项目python 文件上传漏洞测试过程_文件上传_02

其中比较常见而且利用较多的有

  1. 内核提权
  2. 数据库提权
  3. 应用提权
  4. 中间人劫持等

Windows基础提权命令

查询系统信息
systeminfo 
主机名
Hostname
环境变量
Set
查看用户信息
Net user
查看服务pid号
Tasklist /svc|find "TermService"
netstat -ano|find "3389"
查看系统名
wmic os get caption
查看补丁信息
wmic qfe get Description,HotFixID,InstalledOn
如果要定位到特定的补丁可以使用如下命令
wmic qfe get Description,HotFixID,InstalledOn | findstr /C:"KB4346084" /C:"KB4509094"(pr提权适用)
查看当前安装程序
wmic product get name,version

需要注意环境变量,因为有的软件环境变量可能设置在其它路径中,而在该路径下的文件是具有写权限的,就可以通过替换文件来达到提权操作

常见所处的权限

通常拿到webshell,获得的权限如下:

ASP/PHP 匿名权限
ASPX user权限
jsp 通常是系统权限

提权的前提条件

最重要的就是收集信息了,根据收集到的信息再进行响应的攻击。

服务器系统和版本位数
  服务器的补丁情况
  服务器的安装软件情况
  服务器的防护软件情况
  端口情况

收集好信息,就可以先从这几个方面入手:

确定是否能执行命令,如果不能调用系统cmd执行命令。 要上传一个cmd.exe

溢出漏洞提权

溢出漏洞提权是利用操作系统层漏洞进行权限提升,通常步骤是拿到shell后获取目标机器的补丁信息,通过目标的补丁情况获取相对应的漏洞,进行提权