聊聊文件上传那些事

by NUIST多火安全组

注:本文的所有内容均不涉及实际站点,必要的演示工作均由第三方开源靶场完成,本文仅作为交流学习用途,请勿使用本文所涉及的技术或工具进行违法操作。多火安全区委提醒您:道路千万条,渗透走不通。一招若不慎,亲人两行泪。

文件上传本来仅是个功能,用漏洞的思路解读他,真的只是个无奈之举。

如今,随着各类web应用的发展,文件上传已然成为几乎每个web程序的必备功能,无论是用户个人主页的头像,亦或是管理员上传某些装饰性图片,都离不开文件上传的相关模块。然而,如果设计web程序的程序员不注意对上传图片类型进行把控的话,那么这个功能很有可能就会变成一个致使web程序甚至服务器沦陷的 “上传点”。

例如,DVWA-File Upload模块在easy模式中为我们提供了一个未进行任何验证的上传场景:


服务端代码为:

“`php+HTML
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

<pre><code>// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
$html .= '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
</code></pre>

}
?>
“`

通过简单的代码审计,我们就可以得出该服务端代码未进行任何文件类型的验证操作,故我们可以直接上传我们的webshell,获取网站控制权限。


如图,上传成功,并且直接回显了文件路径,攻击者可以直接访问该路径,从而通过webshell进行后续的权限控制。

基于前端验证的绕过

接下来我会借助upload-labs(pass-01)来演示针对前端JS验证的绕过。

首先打开burp,并且直接尝试上传webshell文件1.php。

如上图所示,发现在burp拦截到数据包之前,就已经弹出js窗口提示文件类型错误,因此,我们判定该文件上传的检测类型为本地JS验证。为了突破本地JS验证,我们首先将原php脚本文件更改后缀名,改为1.jpg。然后进行上传即可发现,并未弹出js验证的提示,burp也成功抓包捕获了数据包。

通过对数据包的分析我们不难发现,本地已成功将php脚本文件识别为jpg图片文件,我们在数据包内直接将filename=”1.jpg”这一项更改为filename=”1.php”,这样在服务端,我们的webshell就可以重新被命名为1.php,从而顺利被服务器解析。

针对常见服务端的验证绕过

上一个例子,笔者为大家演示了如何绕过本地JS验证,大家不难发现,即使是没有任何经验的脚本小子(这不就是我吗??),也可以顺利突破本地JS 验证。因此在实际的生产环境中,通常会采用配合服务端验证的策略来防御任意文件上传的攻击。

绕过MIME验证上传文件

接下来,笔者通过upload-labs(pass-02)演示针对MIME的绕过。

由于在上传文件时,HTTP请求头中Content-Type项包含了文件的类型,因此,很多为程序通过检测Content-Type项来确定用户上传文件的类型,但是这种安全策略存在十分严重的安全隐患。

例如在本例中,我们通过burp工具抓包,直接修改Content-Type项的内容,即可绕过服务端检查。

将Content-Type: application/octet-stream修改为Content-Type: image/jpeg。放行数据包后即可通过验证。

通过上传.htaccess解析图片绕过

通常情况下,在web程序目录下会存在类似../uploads/的专门储存图片文件的目录,为了防止攻击者上传脚本文件,会设置解析平台的解析规则,来禁止类似这样的目录解析脚本文件,哪怕攻击者上传了脚本文件,那么在此类目录下脚本文件也无法正常解析。对于Apache平台的web程序而言,如果目标程序使用黑名单策略且没有对.htaccess进行过滤,我们可以上传.htaccess文件,通过在.htaccess编写解析规则来突破此类限制。

此解析规则会将1.jpg文件按照PHP的脚本模式解析执行。我们将脚本内容直接写入到1.jpg文件后上传。

上传后直接访问1.jpg即可直接访问webshell后门。

很多朋友对于图片马的使用有疑虑,笔者多次见到很多人在测试文件上传漏洞时,尝试将包含了一句话木马的图片文件上传至服务器,访问图片马地址后发现图片马内的脚本并未被执行,原因是解析平台根本不会尝试对以.jpg格式的文件进行解析,如果想要使图片马生效,必须配合相应的文件包含等其他漏洞或者解析平台的解析漏洞来执行。

利用操作系统、编程语言、解析平台的某些特性绕过文件上传检测

利用web程序所部属的环境和解析平台特有的特性,也可绕过大部分的检测机制,下面我将会具体分析截断绕过的原理。

由于在大多数编程语言中,会将0x00作为终止符,其后的内容会被截断而大部分解析平台会从右到左匹配文件类型,第一个被识别的后缀作为解析语言。因此,我们可以利用这一特性来绕过文件类型的检测机制。截断绕过也是众多利用解析平台特性绕过检测机制的方法中最为著名的一种。

接下来我将通过upload-labs(pass11)来演示%00截断bypass。

通过抓包和前端回显,我们判断该上传页面在服务端直接将路径和文件名进行了拼接,并且请求方式为GET,所以判断使用%00截断上传。

将大马1.php改名为1.jpg,然后如图所示修改数据包。在服务端拼接后,图片路径变为../upload/1.php%001.jpg

由于%00后的内容被截断,因此大马被正常上传。

除了截断上传外,我们经常也会利用操作系统的某些特性来绕过文件后缀的黑名单限制,比如,由于Windows系统对文件大小写不敏感,所以可使用类似形如1.pHp来绕过对.php后缀的限制。由于在Windows系统中,如果文件后缀以点或空格结尾,那么在服务端会直接去掉.或空格,因此可以使用burp直接抓包修改文件后缀来绕过针对某些脚本类型的限制。

基于验证文件内容的上传绕过

有些web程序会调用PHP的相关函数直接对上传文件的文件头进行校验,只有符合条件的文件才能上传,当判断web程序使用此种方法过滤时,由于在PHP解析时,外的部分通常会按照html的格式处理,我们通常直接增加文件头,在不影响PHP正常解析的情况即可绕过文件头检测。

例如在upload-labs(pass13)中,使用如下所示的方法修改数据包即可成功绕过检测上传。

配合其他漏洞的任意文件上传

在web渗透实战中,漏洞与漏洞之间往往存在很强的关联性,比如在上传大马的过程中,我们通常也会结合文件包含漏洞和解析漏洞来进行进一步的利用,而且前者往往拥有极强的隐蔽性并且可绕过市面上众多的WAF防护程序。

例如,如果WAF 程序仅针对脚本文件进行拦截,呢么我们可以上传一个包含病毒代码的txt文件,然后利用去包含该txt文件,即可完成对木马的访问控制。

基于解析漏洞的漏洞利用请参考此文:https://thief.one/2016/09/21/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E/、

关于任意文件上传漏洞的防护策略

由于上传功能的必要性,开发人员在设计web程序时,必须充分考虑对文件上传安全性的把握。对于任意文件上传漏洞的防范,最有效的方法通常认为是尽可能的使上传路径不可见,即尽可能的不要再前端HTML中存在指向图片的url,或者使图片目录对未授权用户不可见。这样,攻击者即使成功的上传了webshell,由于攻击者不知道图片路径或者由于文件目录无法访问,因此也无法进一步的利用webshell。同时,为了进一步提高安全性,可以严格审计对上传文件类型的把控,通常可以使用对图片进行二次渲染并对图片文件强制重命名的方式来防范webshell的上传。

除了在web程序的层面要针对性的处理外,对服务器和解析平台本身也要进行合理配置,比如禁止include(),include_once(),require_once(),fopen(),readfile()等函数的使用,及时更新服务器补丁,关注自己所使用的解析平台版本是否存在相应的解析漏洞等。

参考资料

https://thief.one/2016/09/22/%E4%B8%8A%E4%BC%A0%E6%9C%A8%E9%A9%AC%E5%A7%BF%E5%8A%BF%E6%B1%87%E6%80%BB-%E6%AC%A2%E8%BF%8E%E8%A1%A5%E5%85%85/

http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88%AA%E6%96%AD%E5%88%86%E6%9E%90.html

https://www.freebuf.com/column/161357.html

https://www.freebuf.com/vuls/128846.html

https://www.freebuf.com/column/194846.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注