一、介绍
原因是服务器配置不当或者没有进行足够的过滤,用户可以上传任意文件,包括恶意脚本文件、exe程序等,这就造成了文件的上传漏洞。
其中一种引起文件上传漏洞的原因是:变量覆盖(需要代码审计)。
危害:如果web服务器所保存上传文件的可写目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。如果攻击者通过其它漏洞进行提权操作,拿到系统管理权限,那么直接导致服务器沦陷。同服务器下的其他网站无一幸免,均被攻击控制。
通过上传漏洞获得的网站后门,就是webshell。
漏洞利用条件:1.web服务器要开启文件上传功能,并且上传api(接口)对外开放(web用户可访问);
2.Web用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,web目录都有执行权限。
3.上传文件可执行,web可以解析上传的脚本。
4.无视以上条件的情况就是服务器配置不当,开启了put方法。
二、webshell
shell俗称“壳”,指为“使用者提供操作界面”的软件(命令解释器)。类似于windows的cmd.exe或者Linux下bash等。
Webshell是一个网站的后门,也是命令解释器,以web方式(Http协议)传递命令信息。本质上是在服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp等,也就是说webshell接收来自web用户的命令,然后在服务器端执行。
大马:Webshell可以是大马,也是网站木马。代码量比较大。
小马:一句话木马。代码量比较小。
利用中国菜刀与一句话木马配合实现三大功能:
1.文件管理
在中国菜刀页面继承了Web用户权限可以实现文件管理,包括文件查看、上传、下载、修改、删除、甚至运行exe程序等。
2.虚拟终端
在菜刀命令下可以获得类似cmd和bash的命令行接口,可以执行相关命令。
3.数据库管理
需要知道连接数据库的账密。
getshell:就是获取Web的过程和结果。文件上传是Getshell的主要方式之一。
三、中间件解析漏洞
1. Apache的解析原理是根据文件的扩展名从后往前找,遇见不认识的就往前。如文件
info.php.xxx.xx.x 最后解析为info.php
2. IIS6.0解析漏洞
方法一:time.asp;2.jpg 文件是图片文件,但是在浏览器中打开可解析其中的代码,表示当做.asp文件解析。
方法二:先建立一个文件夹1.asp,在文件夹中建立图片文件time.jpg。在浏览器中依然可以顺利解析time.jpg中的代码。也是当成.asp文件解析。
3. PHP CGI解析漏洞
需要IIS7.0/7.5 + php环境,即使用IIS中间件支持php脚本,此步骤不具体解释。
配置好环境好,漏洞复现:在URL打开一个info.png图片文件,该文件无法执行其中的php代码。
但是在路径后面加,php即可执行。此时路径为 localhost:8000/info.png/.php
防御方法很简单,只需修改一个配置。
nginx中也存在上述问题:以上内容本质上与中间件无关,而是与php的一个配置选项有关:在php.ini中cgi.fix_pathinfo默认为1,如果将改为0即可。
4.Nginx空字节漏洞
类似于00截断,在文件路径后面加%00.php
例:localhost/info.html无法解析,但是localhost/info.html%00.php可以把.html文件当做.php解析
5.Nginx文件名逻辑漏洞
本质上也是00截断。用BP抓包,在十六进制里边改00。
四、防御与绕过
1.黑白名单策略。
2.前端限制与绕过。如,在前段用JS脚本做检测,检测文件后缀名等。
3.apache开启put方法上传文件。(具体方法略过)
4.用BP抓包改包(前端绕过)。例如:前端浏览器只允许上传.jpg文件,但目前的webshell是.php,如何绕过?
先将文件改扩展名,由.php改为.jpg,上传并抓包。此时已经绕过浏览器的前端了,离开了浏览器端。在BP包中再将.jpg改为.php,然后放包,此时.php文件成功到达服务器上,并绕过前端过滤。
5.服务器端绕过:
(1)服务器端检查content-type类型:只需要BP抓包,直接修改此类型里的内容即可。
(2)服务器端检测文件内容:函数getimagesize(),检测文件大小。很容易被图片木马绕过。如上传一个图片木马.gif。图片木马上传成功表示该上传漏洞存在。但要让服务器端执行该木马,需要结合其它漏洞,如文件包含漏洞、文件解析漏洞、数据库备份漏洞。服务器端最有效的防御图片木马的方法为二次渲染。
图片包含小马的方法:
(3)文件幻术方法制作图片木马(略过)。
(4)服务器检测文件后缀名。
黑白名单方式。
五、00截断+htaccess
(1)00就是Null(空)字符,URL中为%00,会导致文件上传路径截断。
举例:
原理:php的函数move_uploaded_file函数记录上传文件的原目录与上传目录,改变上传目录的路径,在save_path的原路径后面加(test.php),就把文件夹变为了具体的文件(相当于木马文件),但是这样后面接上传的文件会报错,所以在(test.php)后面加%00截断该路径,文件依然能上传成功,并且能显示info.php。
(2).htaccess 是Apache服务器的分布式配置文件,该配置文件会覆盖Apache服务器的全局配置,作用于是当前目录及其子目录。如果一个Web应用允许上传.htaccess 文件,那就意味着攻击者可以更改Apache的配置,相当危险。(全局配置文件为httpd.conf)
举例:
1)将.png文件当做php文件解析
在.htaccess文件中写入: AddType application/x-httpd-php .png
当访问info.png文件时,info.png文件里的php代码将被执行。
情景:如果一个网站不允许上传.php文件,但是允许修改.htaccess文件。
2)文件名包含php关键字
在.htaccess文件中写入: AddHandler php5-script php
当访问info.php.png文件时,info.php.png文件里的php代码将被执行。
3)匹配文件名
(将文件名当做php文件解析)
例文件名为ajest,在.htaccess文件中写入:
<FilesMatch "ajest">
SetHandler application/x-httpd-php
</FilesMatch>
当访问ajest文件时,ajest文件里的php代码将被执行。
六、常见编辑器上传
编辑器就是网站后台编辑网页的在线编辑器,会自动集成文件上传功能,这些编辑器的某些版本也存在文件上传漏洞。
ewebeditor
fckeditor