概述
目录
- 文件上传攻击简介
- 前端验证的突破
- 文件内容检查的突破
- content-type绕过:
- 文件头验证绕过:
- getimagesize()检查和php_exif模块检查绕过
- ⼆次渲染绕过:
- 白名单验证的突破
- 修改MIME类型绕过白名单限制 (Content-type验证):
- 00截断绕过白名单限制:
- 解析漏洞绕过白名单
- 大小写或近似绕过
- 黑名单验证的突破
- 利用操作系统特性
- 利用语言特性
- 利用中间件特性
- 代码不严谨利用
- 解析漏洞
- 如何探查目标是什么类型的web服务器
- IIS漏洞
- Apache
- Nginx
- 双文件上传和竞争上传
- 双文件上传
- 竞争上传
文件上传攻击简介
特点:利⽤简单、危害⼤。
产⽣原因:缺少必要的校验。
找⽂件上传点(关键):管理后台页面、⽤户后台页面、前台页面、⽬录扫描 ==>扫描到后台不需要登陆就能访问的上传页面。
测试思维:根据已有信息、条件分析目标网站架构,再以此架构为基础,从我们已经掌握的知识中过滤出适合此架构的攻击方法。
测试流程:先分析⽬标架构网站使⽤后端语⾔、中间件、⽬标服务器类型、版本等,之后根据分析结果使⽤已有⼿段依次测试
前端验证的突破
如何探查是前端验证:右键查看源代码或者直接上传⽂件,或者如果网站非常快的(没有请求包)弹出提示。
前端验证的例子(代码片段):
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。
防护手段:
对于文件上传类的条件竞争漏洞,一定要先充分检查之后再进行上传。而不是先上传,之后再检测。
最后
以上就是傲娇白云为你收集整理的渗透测试学习8:文件上传攻击文件上传攻击简介前端验证的突破文件内容检查的突破白名单验证的突破黑名单验证的突破解析漏洞双文件上传和竞争上传的全部内容,希望文章能够帮你解决渗透测试学习8:文件上传攻击文件上传攻击简介前端验证的突破文件内容检查的突破白名单验证的突破黑名单验证的突破解析漏洞双文件上传和竞争上传所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复