0x00 什么是文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。利用上传漏洞可以直接得到WEBSHELL,危害等级超级高。上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。文件上传检测一般有几种:javascript检测、扩展名检测、HTTP头检测、文件头检测等,除了绕过这些检测,还可以通过解析漏洞、截断绕过。
0x01 javascript检测与绕过
首先我们先进行黑盒检测,我们可以先制作PHP一句话木马,也就是把<?php @eval($_POST['xxh']);?>写进txt,后缀名改为.php。然后选择文件进行上传。
然后弹窗显示只能上传格式为gif、jpg、bmp、png的文件,随后我们查看源代码。
找到from标签,当onsubmit事件在表单中确认按钮被点击时候执行check()函数,也就是会执行红色框中的js代码。这段代码大致意思是,取表单中file的值,也就是判断刚刚上传的文件是否为空,不为空则取出扩展名,然后判断扩展名是否为gif、jpg、bmp、png,如果是(true)就提交表单,如果不是就alert弹出对话框,停止提交表单。由此可见,如果们我想办法让函数返回true,或者直接不运行这段javascript代码就可以绕过javascript对上传文件类型的判断。显然第二种方法就非常暴力了,既然你写在前端,我直接在你前端代码删了,跟我在做黑客闯关游戏中遇到的一样。下图把onsubmit事件删了,然后重新上传文件。
然后记下上传的地址,使用菜刀进行连接一句话木马,密码为:xxh
看到目录里有我们上传的小马,已经成功绕过js检测,拿下网站。
0x02 扩展名检测与绕过
同样先判断检测,该网站为asp语言,制作asp一句话小马,,文件名为1.asp,然后上传后显示不允许上传asp类型的文件
我们把文件名后缀改为.xxh,点击上传后发现可以成功上传
由此,程序在判断上传文件的类型时,可能是检测文件的扩展名来判断文件是否为可执行脚本名,如果是就不允许上传。我们只要找到程序没有进行判断的可执行文件的扩展名就可以成功上传webshell,已知IIS默认可执行扩展名为:asp、aspx、cer、cdx、ashx、htr等等。那么一个个试了之后,发现可以上传cer扩展名文件。
上传成功,找到上传地址,同样用菜刀连接。拿下网站。
0x03 HTTP头检测与绕过
该漏洞原因在于判断代码只判断http头信息里的文件类型,导致访客提交修改过的http头信息绕过判断上传,造成此漏洞。该网站采用php语言
同样制作一句话木马,<?php @eval($_POST['xxh']);?>,文件名为1.php,选择文件,点击上传。
显示请先上传jpg、gif、png格式图片,所以不能上传php脚本文件,那么我们重命名为.jpg后缀,再进行上传。
看到jpg文件上传成功,那么我们可以认为,程序在判断文件类型时,是通过检测扩展名来判断文件是否合法,或者是检测http信息头里的文件类型来判断是否合法。我们来抓包确认一下。使用burp神器。
点击上传时,burp进行拦截抓包,我们可以发现,在HTTP头里文件类型为image/jpeg,也就是图片格式,如果我们修改content-type的值为:application/octet-stream,然后放包。
显示请先上传jpg、gif、png格式文件,那么之前上传的jpg文件就上传不了了,所以我们可以确定,程序是通过Content-Type值来判断上传文件类型的。所以我们可以修改HTTP头来使得我们可以上传php脚本文件,把我们制作的一句话木马重命名为1.php,点击上传,burp拦截,把Content-Type值改为 image/jpeg,放包,我们就把一句话木马上传成功了。
然后同样菜刀连接,拿下网站。
大家可以在百度搜索一些文件扩展名的Content-Type值,方便学习。
0x04 文件头检测与绕过
该网站采用php语言,同样制作PHP一句话,<?php @eval($_POST['xxh']);?>,文件名为1.php,选择文件,点击上传。
显示只能上传以下类型文件: png,gif,jpg,rar,exe,bmp,那么文件重命名为1.jpg,再上传发现还是一样。那么我们继续用正常的图片文件上传
文件上传成功,我们可以正常打开图片
由此我们可以说明,该程序是通过是否是png,gif,jpg,rar,exe,bmp格式的文件头来判断上传的文件是否合法。
那么我们就可以使用传说中的图片马进行绕过,因为他是检测文件头,那么我们可以通过隐写术原理,图片解析到文件尾就停止解析,然后后面随便写什么内容都不会被解析。打开cmd,准备好一句话木马和正常图片,我们通过copy命令合成图片马。使用命令:copy /b anhun.jpg+1.php jpg.php,也就是把anhun.jpg和1.php合并为新的jpg.php文件。此时要注意,一句话木马开头要多几个空格,因为没有空格进行合并以后,图片的文件尾会覆盖掉木马的尖括号。当然如果做多了CTF,我们可以直接使用winhex等十六进制编辑器,编辑器打开图片,然后图片文件尾多加几个00,然后复制一句话木马,点击保存。
然后上传jpg.php,可以看到上传成功!
然后菜刀连接,拿下网站
0x05 NULL字节路径截断漏洞
用asp写入文件时,如果文件名字里插入了 NULL字节,那么NULL字节后面的字符就会被忽略。例如正常的文件路径abc/xxh.jpg ,当xxh.jpg 的名字改成abc/xxh.aspNULL.jpg 则写入的文件实际是abc/xxh.asp。如果asp程序NULL字节可以插入到文件名的参数里并且没有进行安全的过滤,就形成了NULL字节路径截断漏洞。
我们使用某论坛发帖处执行。注册用户以后发表帖子,随便上传一张图片,由下图可知
看到这两个参数和图像标签[IMG]upload/forum/2014522124458.jpg[/IMG]是有对一个关系的。一个是路径,一个是文件名。这里这两个参数我们可控,如果服务器程序没做验证的话,我们这里可以上传任意类型的问题。制作asp一句话,文件名改为1.jpg。接下来使用burp修改数据包来上传一句话,选择文件点击上传,然后burp成功拦截,可以右键发送一个reteaper,点击RAW,我们在文件名下添加.asp+空格+123,空格为了方便定下位置。
随后点击hex,查看十六进制,定位到文件名下,然后把20改为00,也就是NULL,因为空格的十六进制就是20。
修改完以后点击发送
已经上传完毕,然后使用菜刀连接,记住完整的上传路径,使用菜刀连接,拿下网站。
0x06 IIS解析漏洞
一、在网站下建立文件夹的名字为*.asp、*.asa的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。例如创建目录xxh.asp,那么/xxh.asp/1.jpg将被当作asp文件来执行。
二、网站上传图片的时候,将网页木马文件的名字改成“*.asp;.jpg”,也同样会被IIS当作asp文件来解析并执行。例如上传一个图片文件,名字叫“xxh.asp;.jpg”的木马文件,该文件可以被当作asp文件解析并执行
使用某论坛做演示,注册完论坛以后,看哪里可以进行文件上传的地方,一般是在头像设置那边。演示地址出现问题,页面布局混乱,所以习惯就好。
先上传asp一句话木马,文件名为1.asp
提示只能上传这些图片上格式,说明对asp格式文件做了限制,然后我们可以先看看iis的版本,随便输入一个不存在的地址。
这是IIS6.0特有的报错页面,因为该解析漏洞是出现在IIS6.0版本。所以我们可以使用解析漏洞,把1.asp重命名为1.asp;jpg再重新上传,发现上传成功
获取了头像地址,然后使用菜刀连接,拿下网站
0x07 NGINX解析漏洞
Nginx默认以cgi的方式支持php的运行,如以下配置
ocation ~ .php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;include fastcgi_params;}
关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
打开演示网页,发现是DZ论坛,我们可以用nmap方式查看NGINX的版本为0.7.64
怎么去探测这个漏洞呢?找到一张图片,打开图片地址,在url中在图片文件名后面加上/.php
发现并没有当做404处理,而是把这个图片当做PHP进行解析,输出乱码。所以存在nginx的解析漏洞
那么我们注册一个账号,找到能够上传文件的地方,一般在个人资料上传头像的地方就有,制作php一句话,文件名为1.jpg,上传木马。上传成功后连接菜刀,拿下网站。这里演示地址出现问题,所以就不发图了。
0x08 apache mime解析漏洞
每遇到一种后双重后缀名(如xxx.php.rar)的文件,Apache都会去conf/mime.types 文件中检查最后一个后缀, 如果最后一个后缀并没有在mime.types文件中定义, 则使用前一个后缀来解释 , 因为在默认情况下,rar并未在mime.types中定义, 故Apache会使用php后缀来解释文件。
目标服务器可以遍历目录,发现了fckeditor编辑器。从图片上的信息可以得出几个结论:能够向上传文件、Apache版本为2.0.53、支持PHP,版本为5.3.2,结合apache版本和php版本,可能目标存在apache解析漏洞。
找到可以上传的页面。然后进行一句话木马,1.php的文件上传
此时无法上传php后缀的文件,然而目标网站可能存在解析漏洞,我们可以把文件名改为1.php.rar,上传文件,发现上传成功,菜刀连接,拿下网站。
0x09 结束语
关于文件上传大概有这么几种检测和绕过检测的方法,当然还有更高级的绕过方法,比如说条件竞争上传等。那么如何防御文件上传漏洞呢?可以把文件上传的目录设置为不可执行,判断文件类型时候可以结合MIME Type、后缀检查等等方式。
本篇文章就写到这里,其实还可以写编辑器的漏洞,后面也还有一些文件上传的练习,只不过写的有点累了,就这样吧,有不对的地方欢迎指出。我是许心痕,心中有伤痕!
▼往期精彩回顾▼【web安全】简单XSS演练【web安全】sqli-lab靶场1-10关练习笔记【二进制安全】熊猫烧香病毒分析END