漏洞重温之文件上传(上)
文件上传
漏洞简介
文件上传漏洞是web安全中经常用到的一种漏洞形式,是对服务器危害最大的漏洞之一,攻击者可以直接通过文件上传漏洞获取服务器权限。文件上传漏洞是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,而已脚本,webshell等到服务器执行,并最终获得网站控制权限的高危漏洞。
文件上传漏洞危害
上传漏洞与sql注入或xss相比,其风险更大,如果web应用程序存在上传漏洞,攻击者上传的文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行。如果上传的文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为。如果上传的文件是病毒,木马文件,黑客用以诱骗用户或者管理员下载执行。如果上传的文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。甚至攻击者可以直接上传一个webshell到服务器上,完全控制系统或致使系统瘫痪,影响正常工作。
文件上传漏洞原理
大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者只是在前段通过js进行后缀检验。这时攻击者可以上传一个与网站脚本语言相对应的而已代码动态脚本,例如:jsp/asp/php/aspx文件后缀 到服务器上,从而访问这些恶意脚本中包含的而已代码,进行动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。
upload-labs 闯关纪实(pass-01 ~ pass-10)
Pass-01
进入关卡,先看一下页面内容,可以很明显看到,在页面中间有一个上传点,另外,还有一个查看源码按钮,所以我先查看一下源码,看看该关卡,对于文件上传是怎么防御的。
根据代码,我们可以看出,该关卡对于文件上传的防御,只是在于前段js代码对于文件后缀的检验,在这个位置,我们可以利用抓包工具,在前端先使用网页允许的后缀名进行绕过,随后利用抓包工具修改后缀,完成目的。
PS:文件上传最重要一点,我们需要文件被上传到什么地方,有了路径,我们才可以在网页访问我们上传的脚本,所以,一般文件上传漏洞,都是抓包之后,再抓取返回包,以此查看路径。
有了路径,我们可以直接访问,以确认上传文件是否成功,以及上传的文件是否已经被网站执行。
第一关,通关。
Pass-02
第二关破关思路一致,先查看源码,查看网页对于文件上传漏洞的防御机制。
从代码可以看出,网页对于文件上传漏洞的防御,在于检测文件类型是否是图片,如果是图片就可以上传,所以我们根本不需要对文件名做任何修改,只需要在上传文件的时候抓取请求包,修改文件类型就可以完成绕过。
抓取返回包,查看文件路径。
第二关,通关。
Pass-03
第三关思路一致,开始进行文件上传之前,先查看源码,明白网站对于文件上传的防御思路,从中找到破绽,找寻绕过方式。
这里的代码很多,但是有一般的内容是我们不需要关心的。我们需要去思考和关注的,只有下面这一段内容。
这段代码,明确的写出了网站对于文件上传的防御思路。但是从另外一种角度来说,如果之前对于文件上传绕过防御不了解的话,详细的防御思路对于个人来说,同样是一种提升。(这个在后面会明确提到。)我就是那种对文件上传绕过不太了解的一个人,但是在看到这个防御机制之后,我清楚的知道了三种绕过方式。
1.在文件名末尾加个点
2.大小写绕过
3.通过字符串“::$DATA”绕过
通过下图,我们可以清楚,该处防御使用的为黑名单过滤。所以,我们需要使用名单上不存在,但是又可以执行的文件名来进行上传。
这个我是不太懂,在查看了某个大佬博客之后,知道如果apache的httpd.conf中如果有配置的话,使用.phtml .phps .php5等都会被当成php解析。
这里我们使用.php5后缀。
老规矩,抓取返回包,如果文件上传成功,那么网站会返回路径,如果失败,则会返回报错信息。
第三关,通关。
Pass-04
保持一致的思路,先看源码。
从源码中可以看出,网站对于文件上传坐了很多限制,常用的后缀几乎都无法使用。
这个时候,我突然想到了解析漏洞和文件上传漏洞的联合使用,所以我直接尝试在文件名后面加上一个完全不存在的后缀,以此来绕过防御。
抓取返回包,查找文件路径。
第四关,通关。
PS:
常见解析漏洞集合
1、IIS5.x-6.x解析漏洞
使用 IIS5.x-6.x 版本的服务器,大多为Windows server 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,不能解析aspx文件。
目录解析漏洞
IIS6.0中的目录解析漏洞,如果网站目录中有一个 *.asp/ 的文件夹,那么该文件夹下面的一切内容都会被 IIS 当作 asp 脚本来执行,如/xx.asp/xx.jpg
文件解析漏洞
IIS6.0中的分号(;)漏洞,IIS在解析文件名的时候会将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.asp;jpg
解析文件类型
IIS6.0 默认的可执行文件除了asp还包含这三种 :
/test.asa /test.cer /test.cdx
2、IIS 7.0/IIS 7.5/Nginx < 8.03
IIS 7.0/7.5,默认 Fast-CGI 开启。如果直接在 url 中图片地址(*.jpg)后面输入/*.php,会把正常图片解析为 php 文件。 在某些使用Nginx的网站中,访问http://www.xxser.com/1.jpg/1.php,1.jpg会被当作PHP脚本来解析,此时1.php是不存在的。这就意味着攻击者可以上传合法的“图片”(图片木马),然后在URL后面加上“/xxx.php”,就可以获得网站的WebShell。 这不是Nginx特有的漏洞,在IIS7.0、IIS7.5、Lighttpd等Web容器中也经常会出现这样的解析漏洞。这个解析漏洞其实是PHP CGI的漏洞,在PHP的配置文件中有一个关键的选项cgi.fix_pathinfo在本机中位于C:wampbinphpphp5.3.10php.ini,默认是开启的,当URL中有不存在的文件,PHP就会向前递归解析。
3、Nginx空字节漏洞
影响版本:0.5、0.6、0.7<=0.7.65、0.8<= 0.8.37
Nginx默认是以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文件来解析了
也就是当Fast-CGI执行php时,http://127.0.0.1/1.jpg%00.php 会把1.jpg文件(木马文件)当做php文件来执行。
4、Apache(1.x、2.x)解析漏洞
Apache(1.x,2.x)解析文件的原则:Apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar、gif等扩展名是Apache不能识别的,因此就会直接将类型识别为php,从而达到了注入php代码的目的。 假如上传文件1.php.bb.rar,后缀名rar不认识,向前解析;1.php.bb,后缀名bb不认识,向前解析;1.php 最终解析结果为php文件。如果解析完还没有碰到可以解析的扩展名,就会暴露源文件。 这种方法可以绕过基于黑名单的检查。(如网站限制,不允许上传后缀名为php的文件)
5、其他
在Windows环境下,xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的,若这样命名,Windows会默认除去空格或点。黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单,若上传成功,空格和点都会被Windows自动消除,这样就可以getshell。
Pass-05
进入第五关,按照同样的步骤,先查看源码。
这里,就可以结合上我第三关时候说过的一句话来绕过防御。
这里的防御里面,没有将所有文件后缀都改为小写这一条,所以,在这里,我们可以通过大小写来绕过防御。
抓返回包,看文件路径。
Pass-06
废话不说,直接看源码。
上一关缺少了将所有后缀都改为小写的那一条,那这边就是缺少了首尾去空这一条,所以可以通过这一条来进行绕过防御。
抓返回包,看文件路径。
第六关,通关。
Pass-07
第七关的源码缺少了去掉末尾“.”的一条,所以,可以通过这个来进行绕过。
抓返回包,看文件路径。
第七关,通关。
Pass-08
第八关少掉的过滤条件为 去除字符串 “::$DATA”,所以我们就要通过这个字符串来进行绕过。
抓返回包,看路径。
PS:这里注意一点,虽然还不明白原理,但是在上传成功后,如果要访问,路径中要去掉“::$data”字符串,否则上传文件无法被解析。
查明原理之后,我会在这里写出。
第八关,通关。
Pass-09
在看到这个代码的时候,说实话,我是有些束手无策,因为该做的防御,第九关几乎都做了。所以我去翻查了一下大佬的做法,发现可以使用点+空格+点来进行绕过。
代码先是去除文件名前后的空格,再去除文件名最后所有的
.
,再通过strrchar函数来寻找.
来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用1.php. .(点+空格+点)来绕过。
抓返回包,看路径。
第九关,通关。
Pass-10
从第十关的代码可以看出,该关依然采用的是黑名单过滤。
第一行的过滤代码,是去空,第二行则是如果上传后缀有黑名单中的一个,就会被替换为空。这防御本身无懈可击,但他的过滤只进行一次,所以我很容易就可以想明白,这里可以通过单词的双写来进行绕过。
抓返回包,看路径。
第十关,通关。