文件上传一、原理:应用程序未对用户上传文件的类型、内容、大小进行严格的校验,或校验存在逻辑缺陷,导致攻击者可将恶意脚本(如:PHP、JSP木马)伪装后上传到服务器,并通过URL直接访问或配合包含漏洞执行,从而控制服务器。直接危害:获取WebShell,完全控制服务器,数据库。篡改网页、植入黑链、发布违法信息。横向渗透内网,窃取敏感数据。间接危害:上传HTML/SVG造成存储型XSS上传大文件消耗磁盘资源(拒绝服务)覆盖系统配置文件二、常见上传触发点头像、相册、附件上传文章编辑中的图片/视频插入后台管理中的模板、压缩包导入文件管理器、备份还原接口API接口,如上传Excel导入数据三、常见的检测及绕过方式3.1 客户端JavaScript检测通常为检测文件扩展名表现:仅浏览器端校验后缀或大小,弹框提示。绕过:上传一个允许的文件,通过抓包修改文件后缀绕过。如:禁用JS、用BurpSuite拦截修改请求,直接发送.php文件3.2 服务端MIME类型检测3.2.1 MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动指定应用程序来打开,多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。比如浏览器的MIME Sniff功能就是通过读取文件的前256个字节,来判断文件的类型的。每个MIME类型由两部分组成,前面是数据的大类别,例如:声音audio、图像image等,后面定义具体的种类。3.2.2 常见MIME类型名称文件后缀类型超文本标记语言文本.htmltext/htmlxml文档.xmltext/xmlXHTML文档.xhtmlapplication/xhtml+xml普通文本.txttext/plainPDF文档.pdfapplication/pdfMicrosoft Word文档.wordapplication/mswordPNG图像.pngimage/pngGIF图像.gifimage/gifJPEG图像.jpeg .jpgimage/jpegMPEG文件.mpg .mpegvideo/mpeg任意二进制数据application/octet-stream表现:只检查Content-Type,如果手动修改为image/jpeg,文件内容仍为PHP绕过手法:上传一个允许的类型,修改filename为脚本名称,将WebShell写入请求体绕过方法一:直接伪造头部GIF89A方法二:CMD方法,copy /b test.png+1.php muma.png方法三:直接使用工具增加备注写入一句话木马3.3 服务端文件扩展名检测黑名单:文件名大小写绕过或使用黑名单里没有的名称,如cer。白名单:利用解析漏洞或使用长文件名进行检测绕过0x00截断:原理:在C、PHP等语言的常用字符处理函数中,0x00通常被认为是终止符。十六进制表示:0x00,URL编码为%00Payload:受此影响的Web应用和一些服务器,可以通过构造文件名为test.php[\0].jpg(POST包中修改,其中[\0]为16进制的0x00字符).jpg绕过了应用的上传文件类型判断,但对于服务器来说,此文件因为0字节的截断,最终变成了test.php。代码解析:name = getname(http request) // 假如这时候获取到的文件名是test.asp.jpg(asp后面为0x00)type=gettype(name) // 而在gettype()函数里处理方式是从后往前扫描扩展名,所以判断为jpg if (type==jpg) SaveFileToPath(UploadPath.name,name) //但在这里却是以0x00作为文件名截断,最后以test.asp存入了路径。.htaccess文件:修改该配置文件内容可设定指定目录下的文件解析成指定的格式该文件解析漏洞需要拿到服务器权限之后才能更改,一般常用于留后门使用。如果说在Apache中“.htaccess”可被执行,且可被上传,那么就可以尝试在“.htaccess”中写入:<FilesMatch "xxx.jpx"> SetHandler application/x-httpd-php </FilesMatch>然后再上传shell.jpg的木马,这样shell.jpg就会被解析为php文件。把文件名改为test.asp.或test.asp_(这个下划线我指的是空格)这种命名方式在windows系统里是不被允许的,所以需要在burp之类的工具中进行修改,然后绕过验证后,会被Windows系统自动去掉后面的空格,但要注意Unix/Linux系统没有这个特性。:$DATA绕过是Windows下NTFS文件系统的一个特性,即请求NTFS文件系统的存储数据流的一个属性DATA时。a.asp::$DATA 就是直接获取a.asp本身的原始数据(如:源代码)如果a.asp中包含一个名为lake2.asp的备用数据流,那请求a.asp.lake2.asp::$DATA就能获取这个隐藏流中的数据。3.4 服务端文件内容检测检测内容是否合法或含有恶意代码将恶意代码加密上传绕过3.5 Web应用程序解析3.5.1 Apache解析漏洞原因:在Apache 1.x 2.x中存在文件解析问题,Apache 对于文件名的解析是从后往前解析的,直到遇到一个Apache认识的文件类型为止。例:test.php.rar.rarApache 不认识.rar 这个文件类型,所以它会一直遍历到.php 然后认为这是一个php文件,从而导致脚本文件被执行。3.5.2 IIS解析漏洞(Internet Information Services)解析问题:分号截断原因:IIS 6 和 Windwos 环境下在处理文件解析时,也出过类似00截断的问题,只不过截断的字符变成了分号 ;例(Payload):adc.asp;xx.jpgIIS 6会将此文件解析为 adc.asp,后边的xx.jpg被截断了,从而导致脚本被执行。*.asp目录解析原因:因为处理文件扩展名出错,导致将/*.asp/目录下的所有文件都当做asp文件进行解析。例(Payload):http://www.test.com/path/app.asp/abc.jpg这里的abc.jpg虽然是jpg文件,但却会被当做asp文件进行解析。注意:这两个IIS 解析漏洞。都需要在服务器本地硬盘上确实存在这样的文件或文件夹,如果只是通过Web应用映射出来的URL,则无法触发。配置问题:简介:在跟多Web Server中,默认都禁用了PUT方法,或者能够对上传的文件类型做了严格限制。但在 IIS 中,如果目录支持写权限,同时开启了WebDAV,则会支持PUT方法,在结合MOVE方法,就能将原本只允许上传文本文件改写成脚本文件,从而执行WebShell。前提:IIS 中目录支持写权限开启了WebDAVIIS 服务器勾选了“脚本资源访问”复选框。利用方法:同通过OPTIONS探测服务器支持的方法PUT /test.txt HTTP 1.1HOST:www.test.com<%eval(request("cmd"))%>// 上传包含恶意脚本的文本文件MOVE /test.txt HTTP 1.1HOST:www.test.comDestination:http://www.test.com/path/shell.php//通过MOVE改文件名3.5.3 Nginx解析漏洞原因:Nginx配置fastcgi使用php时,会存在文件解析问题。出现这个漏洞的原因与“在fastcgi方式下,PHP获取环境变量的方式有关”PHP的配置文件中有一个关键选项:cgi.fix_pathinfo = 1,默认开启。在映射URL时,将递归查询路径确认文件的合法性,notexist.php不存在时,将往前递归查询路径,这个功能原本是想解决/info.php/test 这种URL能够正常解析到info.php上,此时SCRIPT_FILENAME需要检查文件是否存在,所以会是/path/test.jpg;而PATH_INFO此时还是notexist.php,在最终执行的时候,test.jpg会被当做PHP进行解析payload:http://www.test.com/path/test.jpg/notexist.php其中notexist.php并不存在,如果在任何配置为fastcgi的PHP应用里上传一张图片,其图片内容是PHP文件,则会导致代码执行。其他可以上传的合法文件如文本文件、压缩文件等情况类似。四、不回显文件保存路径的利用思路尝试爆破敏感文件,看是否存在信息泄露,如果可以找到源码,就直接进行代码审计,查看是否可以找到文件上传的路径。爆破目录,看是否存在类似 /uploads 或者 /image之类的目录,然后根据一些已知的信息,如:html页面的名字,构造路径进行爆破没如果爆破发现是403错误,那可能这个目录是存在的。之后尝试猜解上传后的文件名(一般文件上传之后都会修改文件名,如果没改那更省事儿,如果原文件名返回404那多半是重命名了。)通过程序报错,把路径爆出来union select 1,2,hex(load_file("D:\\phpstudy_pro\\WWW\\sqli-labs\\Less-1\\index")) -- -现在大多数站点都会使用站库分离的方案,文件系统和服务系统分开存储,或者直接使用第三方的文件存储系统,阿里云、七牛云都有这方面的服务如:oss。站库分离的拿到文件系统地址没有太大作用,使用第三方的一般防护做的都很好,普通新手很难绕过。如:存储桶接管。五、安全防范最有效的,将文件上传目录直接设置为不可执行,对于Linxu而言,撤销其目录的x权限;实际中很多大型网站的上传应用都会防止在独立的存储上作为静态文件处理,一是方便使用缓存加速降低能耗,二是杜绝了脚本执行的可能性。文件类型检查:墙裂推荐白名单方式,结合MIME Type、后缀检查等方式(即:只允许允许的文件类型上传);此外对于图片的处理可以使用压缩函数或resize函数,处理图片的同时破坏其包含的html代码。使用随机数改写文件名和路径,使得用户不能轻易访问自己上传的文件。单独设置文件服务器的域名;由于浏览器同源策略的关系,一些列客户端攻击将失效。
一、原理:
应用程序未对用户上传文件的类型、内容、大小进行严格的校验,或校验存在逻辑缺陷,导致攻击者可将恶意脚本(如:PHP、JSP木马)伪装后上传到服务器,并通过URL直接访问或配合包含漏洞执行,从而控制服务器。
直接危害:
间接危害:
二、常见上传触发点
三、常见的检测及绕过方式
3.1 客户端JavaScript检测
通常为检测文件扩展名
表现:仅浏览器端校验后缀或大小,弹框提示。
绕过:上传一个允许的文件,通过抓包修改文件后缀绕过。
如:禁用JS、用BurpSuite拦截修改请求,直接发送.php文件
3.2 服务端MIME类型检测
3.2.1 MIME(Multipurpose Internet Mail Extensions)
多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动指定应用程序来打开,多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
比如浏览器的MIME Sniff功能就是通过读取文件的前256个字节,来判断文件的类型的。
每个MIME类型由两部分组成,前面是数据的大类别,例如:声音audio、图像image等,后面定义具体的种类。
3.2.2 常见MIME类型
名称
文件后缀
类型
超文本标记语言文本
.html
text/html
xml文档
.xml
text/xml
XHTML文档
.xhtml
application/xhtml+xml
普通文本
.txt
text/plain
PDF文档
.pdf
application/pdf
Microsoft Word文档
.word
application/msword
PNG图像
.png
image/png
GIF图像
.gif
image/gif
JPEG图像
.jpeg .jpg
image/jpeg
MPEG文件
.mpg .mpeg
video/mpeg
任意二进制数据
application/octet-stream
表现:只检查Content-Type,如果手动修改为image/jpeg,文件内容仍为PHP
绕过手法:
3.3 服务端文件扩展名检测
黑名单:文件名大小写绕过或使用黑名单里没有的名称,如cer。
白名单:利用解析漏洞或使用长文件名进行检测绕过
0x00截断:
.htaccess文件:修改该配置文件内容可设定指定目录下的文件解析成指定的格式
把文件名改为test.asp.或test.asp_(这个下划线我指的是空格)
:$DATA绕过
3.4 服务端文件内容检测
检测内容是否合法或含有恶意代码
将恶意代码加密上传绕过
3.5 Web应用程序解析
3.5.1 Apache解析漏洞
原因:在Apache 1.x 2.x中存在文件解析问题,Apache 对于文件名的解析是从后往前解析的,直到遇到一个Apache认识的文件类型为止。
例:test.php.rar.rar
3.5.2 IIS解析漏洞(Internet Information Services)
解析问题:
配置问题:
3.5.3 Nginx解析漏洞
原因:
四、不回显文件保存路径的利用思路
五、安全防范