发布于2022年10月15日3年前 文件上传攻击简介 特点:利⽤简单、危害⼤。 产⽣原因:缺少必要的校验。 找⽂件上传点(关键):管理后台页面、⽤户后台页面、前台页面、⽬录扫描 ==>扫描到后台不需要登陆就能访问的上传页面。 测试思维:根据已有信息、条件分析目标网站架构,再以此架构为基础,从我们已经掌握的知识中过滤出适合此架构的攻击方法。 测试流程:先分析⽬标架构网站使⽤后端语⾔、中间件、⽬标服务器类型、版本等,之后根据分析结果使⽤已有⼿段依次测试 前端验证的突破 如何探查是前端验证:右键查看源代码或者直接上传⽂件,或者如果网站非常快的(没有请求包)弹出提示。 前端验证的例子(代码片段): function checkFile() { var file = document.getElementsByName('upload_file')[0].value; if (file == null || file == "") { alert("请选择要上传的⽂件!"); return false; } //定义允许上传的⽂件类型 var allow_ext = ".jpg|.png|.gif"; //提取上传⽂件的类型 var ext_name = file.substring(file.lastIndexOf(".")); //判断上传⽂件类型是否允许上传 if (allow_ext.indexOf(ext_name) == -1) { var errMsg = "该⽂件不允许上传,请上传" + allow_ext + "类型的⽂件,当前⽂件类型为:" + ext_name; alert(errMsg); return false; } } 前端验证绕过方法: 通过浏览器审查元素对⽹页的代码查看,找到对文件格式或大小的限制然后修改即可; 通过Burpsuite工具对浏览器进行代理,抓包对包里的内容进⾏修改。 浏览器禁用JavaScript脚本。 文件内容检查的突破 content-type绕过: Content-Type(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。 使用burp suite抓包直接修改content-type值来绕过content-type检查。 content-type检查实例代码: if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file'] ['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) 文件头验证绕过: gif文件十六进制表示后的文件头是gif89a。 所以我们可以在自己想上传的php文件中添加这个头部来绕过文件头部检查。 例子: gif89a <?php phpinfo(); ?> 不过上穿上去的文件很可能是gif格式的,可以通过文件包含来利用。 getimagesize()检查和php_exif模块检查绕过 这两个效果差不多,就是获取我们输入的图片的各种信息。 绕过方法:先改content-type,在⽂件头部添加gif89a。 ⼆次渲染绕过: ⼆次渲染:就是根据⽤户上传的图⽚,新⽣成⼀个图⽚,将原始图⽚删除,将新图⽚添加到数据库中。 绕过方法:寻找渲染前后不变的地⽅,替换成⼀句话木马。 白名单验证的突破 白名单总体安全性高,这里只提供一些方案。 修改MIME类型绕过白名单限制 (Content-type验证): 与上一部分的一致。使用burp suite抓包直接修改content-type值来绕过content-type检查。 00截断绕过白名单限制: 条件:php版本⼩于5.3.4,php的magic_quotes_gpc为OFF状态 magic_quotes_gpc: 使用addslashes()对输入数据进行处理,addslashes()是在每个双引号(")前添加反斜杠。 0x00(或者%00)可以用在对文件名的绕过上,具体原理:系统在对文件名进行读取时,如果遇到0x00(或者%00),就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。也就是说系统是按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII码为0的位置在十六进制中是00。 例子: 1.php%001.jpg//判断时为jpg,解析后为1.php 用法: GET接收情况的时候,直接用 %00 就可以。 POST接收情况的时候,正确的用法应该是我们需要对 %00 做一个URL编码,也就是URL-decode。原因: %00 截断在 GET 中被 url 解码之后是空字符。但是在 POST 中 %00 不会被 url 解码,所以只能通过 burpsuite 修改hex(十六进制)值为 00 (URL decode)进行截断。 注:有的时候在包中直接改文件名,有可能失败,要是有路径的话可以在路径里改。例如:数据包中存在 path: uploads/,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00 为什么修改path才可以? 因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名。 那么,攻击者修改了path以后的拼接结果为:uploads/aaa.php%00/20190818.php 移动文件的时候会将文件保存为:uploads/aaa.php 从而达到Getshell效果,即上传的文件格式为.php 解析漏洞绕过白名单 Apache解析漏洞(双重拓展名):apache ⽂件名解析时,是从后⾯开始检查后缀,按最后⼀个合法后缀执行。如: shell.php.xxx 因为 xxx 不被apache解析,所以apache会跳过 .xxx ,⽽解析最后⼀个后缀名,即.php,从⽽把这个⽂件当php文件解析了。 IIS解析漏洞: IIS6.0 在解析 asp 格式的时候有两个解析漏洞. 一个是如果目录名以".asp 、.asa、.cer、.cdx"字符串结尾,那么这个目录下所有的文件都会按照 asp 去解析。eg: test.asp/1.jpg,另一个是只要文件名中含有".asp;、.asa;、.cer;、.cdx;会优先按 asp 来解析 eg:1.asp;.jpg IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞, 对任意文件名只要在URL后面追加上字符串"/任意文件名.php",就会按照 php 的方式去解析。eg:http://www.target.com/upload/1.jpg/1adf.php 大小写或近似绕过 利用字典进行暴力破解,查看目标网站的白名单。 黑名单验证的突破 黑名单总体安全性不高,这里提供一些绕过方案。 利用操作系统特性 windows操作系统对⼤小写不敏感,即php和Php在windows看来是⼀样的 Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上⽣成⼀个test.php的⽂件,其中内容和所上传文件内容相同,并被解析。即上传⽂件xxx.php::$DATA = xxx.php Windows下文件名结尾加⼊.,空格,<,·>,>>>,0x81-0xff等字符,会被windows⾃动去除 利用语言特性 php语言可解析后缀:php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml jsp语言可解析后缀:jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml asp/aspx语言可解析后缀:asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr 利用中间件特性 即解析漏洞,下一节详讲。 代码不严谨利用 双写绕过 对于空格,点只做了单次过滤 解析漏洞 如何探查目标是什么类型的web服务器 通过查看相应的http请求,会在头部暴露出web服务器类型。 安装浏览器插件:wappalyzer 通过第三⽅网站:https://www.yunsee.cn/ IIS漏洞 IIS5.X~6.0 ⽬录解析漏洞:服务器默认会把.asp,.asa⽬录下的文件都解析成asp文件。前提是可以控制文件上传的路径或者是⽂件名。eg:xxx.asp/xxx.jpg ⽂件命解析漏洞:服务器默认不会取解析分号后面的内容。前提是可以控制⽂件名。xx.asp;.jpg 畸形⽂件命解析漏洞:iis6.0下的可执行⽂件还有 asa、cer、cdx ,注意,不⼀定能解析aspx,因为aspx是.net环境。 IIS7.0/7.5 利⽤解析图片中的代码上传webshell 如果开启Fast-CGI模式,上传1.jpg,内容如下: <?PHP fputs(fopen('dark5.php','w'),'<?php eval($_POST[cmd])?>');?> 结果就是会在其目录下建立一个dark5.php内容是一句话木马。 特殊情况:fck编译器+iis 上传a.aspx.a.aspx.jpg..jpg可绕过上传a.aspx。 Apache 不可识别解析后缀: 从右向左解析,遇到不认识的跳过继续向左。 .htaccess漏洞: .htaccess⽂件是Apache服务器中的⼀个配置⽂件,它负责相关⽬录下的⽹页配置。通过htaccess⽂件,可以帮 我们实现:网页301重定向、⾃定义404错误页⾯、改变⽂件扩展名、允许/阻⽌特定的用户或者⽬录的访问、 禁⽌⽬录列表、配置默认⽂档等功能。 前提:该漏洞适⽤于⽬标web服务器为apache,并且.htaccess可以被上传执行的情况。 当.htaccess⽂件内容为SetHandler application/x-httpd-php时,即设置当前⽬录所有⽂件都使⽤PHP解析,那么⽆论上传任何⽂件,只要⽂件内容符合PHP语⾔代码规范,就会被当作PHP执⾏。不符合则报错。 在Apache中如果需要启动 .htaccess,必须在http.conf中设置 AllowOverride。 <FilesMatch "1.jpg"> SetHandler application/x-httpd-php </FilesMatch> //指定1.jpg当成php解析 Nginx 00阶段;IIS中的CGI漏洞。 双文件上传和竞争上传 双文件上传 应用场景:南方/良精CMS,或者正则默认匹配第⼀个filename的情况下。 利⽤原理:服务端默认取第⼆个⽂件作为真正的上传文件,但是在检测时只检测了第⼀个⽂件,或者只验证了第⼀个filename 的拓展名。 利用方法:直接在审查元素中添加⼀个上传表单(改前端)或者burp抓包之后在数据包中添加(抓包添加)。 竞争上传 基本概念:竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。 开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。 漏洞逻辑:首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件再删掉。 攻击思路:首先上传一个php文件,当然这个文件会被立马删掉,所以我们使用多线程并发的访问上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件,一旦我们成功访问到了上传的文件,那么它就会向服务器写一个shell。 防护手段: 对于文件上传类的条件竞争漏洞,一定要先充分检查之后再进行上传。而不是先上传,之后再检测。
创建帐户或登录后发表意见