渗透测试学习8:文件上传攻击

目录

文件上传攻击简介

特点:利⽤简单、危害⼤。
产⽣原因:缺少必要的校验。
找⽂件上传点(关键):管理后台页面、⽤户后台页面前台页面、⽬录扫描 ==>扫描到后台不需要登陆就能访问的上传页面
测试思维:根据已有信息、条件分析目标网站架构,再以此架构为基础,从我们已经掌握的知识中过滤出适合此架构的攻击方法
测试流程:先分析⽬标架构网站使⽤后端语⾔、中间件、⽬标服务器类型、版本等,之后根据分析结果使⽤已有⼿段依次测试

前端验证的突破

如何探查是前端验证:右键查看源代码或者直接上传⽂件,或者如果网站非常快的(没有请求包)弹出提示
前端验证的例子(代码片段):

 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操作系统对⼤小写不敏感,即PHPPHP在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。

防护手段:
对于文件上传类的条件竞争漏洞,一定要先充分检查之后再进行上传。而不是先上传,之后再检测。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...