文件上传破绽
在本节中,您将理解如何将简单的文件上传功用用作许多高严重性攻击的强大载体。我们将向您展现如何绕过常见的防御机制以上传 web shell,使您可以完整控制易受攻击的 web 效劳器。鉴于文件上传功用是多么常见,晓得如何正确测试它们是必不可少的学问。
什么是文件上传破绽?
文件上传破绽是指 Web 效劳器允许用户将文件上传到其文件系统,而无需对其称号、类型、内容或大小等内容停止充沛考证。未能正确执行这些限制可能意味着即便是根本的图像上传功用也可用于上传恣意且具有潜在风险的文件。这以至可能包括支持远程代码执行的效劳器端脚本文件。
在某些状况下,上传文件的行为自身就足以形成损伤。其他攻击可能触及对文件的后续 HTTP 恳求,通常是由效劳器触发其执行。
文件上传破绽有什么影响?
文件上传破绽的影响通常取决于两个关键要素:
网站未能正确考证文件的哪个方面,无论是其大小、类型、内容等。
文件胜利上传后会遭到哪些限制。
在最坏的状况下,文件的类型未正确考证,效劳器配置允许将某些类型的文件(例如.php和.jsp)作为代码执行。在这种状况下,攻击者可能会上传用作 Web Shell 的效劳器端代码文件,从而有效地授予他们对效劳器的完整控制权。
假如文件名未正确考证,攻击者就能够经过上传同名文件来掩盖关键文件。假如效劳器也容易遭到目录遍历的影响,这可能意味着攻击者以至能够将文件上传到不测的位置。
未能确保文件的大小在预期的阈值内还可能招致回绝效劳 (DoS) 攻击,攻击者借此填充可用磁盘空间。
文件上传破绽是如何产生的?
鉴于相当明显的风险,野外网站很少对允许用户上传哪些文件没有任何限制。更常见的是,开发人员施行他们以为是稳健的考证,这些考证要么存在固有缺陷,要么很容易被绕过。
例如,他们可能会尝试将风险文件类型列入黑名单,但在检查文件扩展名时未能处理解析差别。与任何黑名单一样,也很容易不测疏忽可能依然风险的更晦涩的文件类型。
在其他状况下,该网站可能会尝试经过考证攻击者能够运用 Burp Proxy 或 Repeater 等工具轻松支配的属性来检查文件类型。
最终,即便是强大的考证措施也可能在构成网站的主机和目录网络中不分歧地应用,从而招致能够被应用的差别。
在本主题的后面,我们将教您如何应用这些缺陷中的许多来上传 Web shell 以停止远程代码执行。我们以至创立了一些交互式的、成心易受攻击的实验室,以便您能够针对一些理想目的练习所学。
Web 效劳器如何处置对静态文件的恳求?
在我们研讨如何应用文件上传破绽之前,重要的是您对效劳器如何处置静态文件恳求有一个根本的理解。
从历史上看,网站简直完整由静态文件组成,这些文件将在用户恳求时提供应用户。因而,每个恳求的途径能够与效劳器文件系统上的目录和文件的层次构造 1:1 映射。往常,网站变得越来越动态,恳求的途径通常与文件系统没有直接关系。虽然如此,Web 效劳器依然处置对一些静态文件的恳求,包括款式表、图像等。
处置这些静态文件的过程依然大致相同。在某些时分,效劳器解析恳求中的途径以辨认文件扩展名。然后它运用它来肯定所恳求文件的类型,通常是经过将它与扩展名和 MIME 类型之间的预配置映射列表停止比拟。接下来会发作什么取决于文件类型和效劳器的配置。
假如此文件类型不可执行,例如图像或静态 HTML 页面,则效劳器可能仅在 HTTP 响应中将文件内容发送到客户端。
假如文件类型是可执行的,例如 PHP 文件,并且效劳器被配置为执行这品种型的文件,它会在运转脚本之前依据 HTTP 恳求中的标头和参数分配变量。结果输出然后能够在 HTTP 响应中发送到客户端。
假如文件类型是可执行的,但效劳器没有配置为执行这品种型的文件,它通常会响应错误。但是,在某些状况下,文件的内容仍可能以纯文本方式提供应客户端。此类错误配置有时会被应用来泄露源代码和其他敏感信息。您能够在我们的信息披露学习资料中看到这样的例子。
提示
该Content-Type响应头能够提供线索,什么样的文件效劳器以为它曾经送达。假如应用程序代码未明白设置此标头,则它通常包含文件扩展名/MIME 类型映射的结果。
既然您曾经熟习了关键概念,那么让我们来看看如何潜在天时用这些类型的破绽。
应用不受限制的文件上传来部署 web shell
从平安角度来看,最糟糕的状况是网站允许您上传效劳器端脚本,例如 PHP、Java 或 Python 文件,并且还配置为将它们作为代码执行。这使得在效劳器上创立本人的 web shell 变得微乎其微。
网页外壳
Web shell 是一种歹意脚本,攻击者能够经过它向正确的端点发送 HTTP 恳求,从而在远程 Web 效劳器上执行恣意命令。
假如您可以胜利上传 web shell,您就能够有效地完整控制效劳器。这意味着您能够读取和写入恣意文件、泄露敏感数据,以至运用该效劳器对内部根底设备和网络外的其他效劳器停止攻击。例如,以下 PHP one-liner 可用于从效劳器的文件系统中读取恣意文件:
<?php echo file_get_contents('/path/to/target/file'); ?>
上传后,发送对该歹意文件的恳求将在响应中返回目的文件的内容。
一个更通用的 web shell 可能看起来像这样:
<?php echo system($_GET['command']); ?>
此脚本使您可以经过查询参数传送恣意系统命令,如下所示:
GET /example/exploit.php?command=id HTTP/1.1
应用有缺陷的文件上传考证
在野外,您不太可能找到像我们在之前的实验室中看到的那样对文件上传攻击没有任何维护措施的网站。但仅仅由于防御措施到位,并不意味着它们是强大的。
在本节中,我们将研讨 Web 效劳器尝实验证和清算文件上传的一些办法,以及如何应用这些机制中的缺陷来获取用于远程代码执行的 Web shell。
有缺陷的文件类型考证
提交 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-Disposition标题,它提供了有关它所触及的输入字段的一些根本信息。这些单独的局部也可能包含它们本人的Content-Type标头,它通知效劳器运用此输入提交的数据的 MIME 类型。
网站可能会尝实验证文件上传的一种办法是检查此特定于输入的Content-Type标头能否与预期的 MIME 类型匹配。例如,假如效劳器只需求图像文件,则它可能只允许像image/jpeg和这样的类型image/png。当效劳器隐式信任此标头的值时,可能会呈现问题。假如没有执行进一步的考证来检查文件的内容能否真正匹配假定的 MIME 类型,则能够运用 Burp Repeater 等工具轻松绕过这种防御。
避免文件在用户可访问的目录中执行
固然首先避免上传风险的文件类型显然更好,但第二道防线是阻止效劳器执行任何漏网的脚本。
作为预防措施,效劳器通常只运转其 MIME 类型已被明白配置为执行的脚本。否则,它们可能只返回某种错误音讯,或者在某些状况下,将文件内容作为纯文本提供:
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']); ?>
这种行为自身可能很有趣,由于它可能提供一种走漏源代码的办法,但它使任何创立 web shell 的尝试无效。
这种配置通常因目录而异。用户提供的文件上传到的目录可能比文件系统上被以为最终用户无法访问的其他位置具有更严厉的控制。假如您能找到一种办法将脚本上传到不应该包含用户提供的文件的其他目录,那么效劳器最终可能会执行您的脚本。
提示
Web 效劳器通常filename在multipart/form-data恳求中运用该字段来肯定文件的称号和保管位置。
您还应该留意,即便您可能将一切恳求发送到同一个域名,这通常指向某种反向代理效劳器,例如负载均衡器。您的恳求通常会由幕后的其他效劳器处置,这些效劳器的配置也可能不同。
绕过办法
抓包后更改Content-Type为允许的类型绕过该代码限制,比方将php文件的Content-Type:application/octet-stream修正为image/jpeg、image/png、image/gif等就能够
风险文件类型的黑名单缺乏
避免用户上传歹意脚本的一种更明显的办法是将具有潜在风险的文件扩展名(如.php. 列入黑名单的做法存在固有缺陷,由于很难明白阻止可用于执行代码的每个可能的文件扩展名。有时能够经过运用不为人知的替代文件扩展名来绕过此类黑名单,这些文件扩展名可能依然是可执行的,例如.php5、.shtml等。
PHP扩展名
pht, phpt, phtml, php3,php4,php5,php6
文件名过滤时疏忽了大小写
pHp, Php, phP
掩盖效劳器配置
正如我们在上一节中讨论的,效劳器通常不会执行文件,除非它们已被配置为这样做。例如,在 Apache 效劳器执行客户端恳求的 PHP 文件之前,开发人员可能必需将以下指令添加到他们的/etc/apache2/apache2.conf文件中:
LoadModule php_module /usr/lib/apache2/modules/libphp.so
AddType application/application/x-httpd-php.php
SetHandler application/x-httpd-php
许多效劳器还允许开发人员在单独的目录中创立特殊的配置文件,以便掩盖或添加到一个或多个全局设置。例如,Apache 效劳器将从一个名为(.htaccess假如存在)的文件中加载特定于目录的配置。
同样,开发人员能够运用web.config文件在 IIS 效劳器上停止特定于目录的配置。这可能包括如下指令,在这种状况下,它允许向用户提供 JSON 文件:
<staticContent>
<mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>
Web 效劳器在存在时运用这些类型的配置文件,但通常不允许您运用 HTTP 恳求访问它们。但是,您可能偶然会发现效劳器无法阻止您上传本人的歹意配置文件。在这种状况下,即便您需求的文件扩展名被列入黑名单,您也能够诈骗效劳器将恣意自定义文件扩展名映射到可执行 MIME 类型。
混杂文件扩展名
即便是最详尽的黑名单也能够运用经典的混杂技术绕过。假定考证代码辨别大小写并且无法辨认exploit.pHp实践上是一个.php文件。假如随后将文件扩展名映射到 MIME 类型的代码不辨别大小写,则这种差别允许您将歹意 PHP 文件偷偷经过考证,最终可能由效劳器执行。
您还能够运用以下技术取得相似的结果:
提供多个扩展。依据用于解析文件名的算法,以下文件可能会被解释为 PHP 文件或 JPG 图像:exploit.php.jpg
添加尾随字符。一些组件会去除或疏忽尾随的空格、点等:exploit.php.
尝试对点、正斜杠和反斜杠运用 URL 编码(或双 URL 编码)。假如在考证文件扩展名时未解码该值,但稍后在效劳器端解码,这也能够让您上传原本会被阻止的歹意文件:exploit%2Ephp
在文件扩展名之前添加分号或 URL 编码的空字节字符。假如考证是用 PHP 或 Java 等高级言语编写的,但效劳器运用 C/C++ 中的低级函数处置文件,例如,这可能会招致文件名末尾的差别:exploit.asp;.jpg或exploit.asp%00.jpg
尝试运用多字节 unicode 字符,在 unicode 转换或标准化后可能会转换为空字节和点。假如文件名解析为 UTF-8 字符串,然后在途径中运用之前转换为 ASCII 字符,则像xC0 x2E, xC4 xAEor 之类的序列xC0 xAE可能会被转换为x2E。
其他防御措施包括剥离或交换风险的扩展名以避免文件被执行。假如此转换不是递归应用,您能够以这样的方式定位被制止的字符串,即删除它依然留下有效的文件扩展名。例如,思索.php从以下文件名中删除会发作什么:
exploit.p.phphp
这只是可能混杂文件扩展名的多种办法中的一小局部。
有缺陷的文件内容考证
Content-Type更平安的效劳器 不是隐式信任恳求中的指定内容,而是尝实验证文件的内容能否与预期的内容相匹配。
在图像上传功用的状况下,效劳器可能会尝实验证图像的某些内在属性,例如其尺寸。例如,假如您尝试上传 PHP 脚本,则它基本没有任何维度。因而,效劳器能够推断它不可能是图像,并相应地回绝上传。
同样,某些文件类型可能一直在其页眉或页脚中包含特定的字节序列。这些能够用作指纹或签名来肯定内容能否与预期类型匹配。例如,JPEG 文件总是以 bytes 开头FF D8 FF。
这是考证文件类型的更强大的办法,但即便这样也不是万无一失的。运用特殊工具(例如 ExifTool),能够轻松创立在元数据中包含歹意代码的多言语 JPEG 文件。
图片合成php
一句话木马混杂到图片里面
<?php echo file_get_contents('/home/carlos/secret'); ?>
应用文件上传竞争条件
现代框架更能抵御此类攻击。他们通常不会将文件直接上传到文件系统上的预期目的地。相反,他们采取预防措施,例如首先上传到暂时沙盒目录并随机命名以防止掩盖现有文件。然后他们对这个暂时文件执行考证,并且只要在以为这样做是平安的状况下才将其传输到目的地。
也就是说,开发人员有时会独立于任何框架完成本人的文件上传处置。这样做不只相当复杂,而且还可能引入风险的竞争条件,使攻击者可以完整绕过最强大的考证。
例如,某些网站将文件直接上传到主文件系统,假如未经过考证,则再次将其删除。这种行为在依赖防病毒软件等检查歹意软件的网站中很常见。这可能只需求几毫秒,但在文件存在于效劳器上的短时间内,攻击者仍有可能执行它。
这些破绽通常十分奇妙,除非您能找到走漏相关源代码的办法,否则在黑盒测试期间很难检测到它们。
限制jpg和png上传
一句话木马
11.php改为11.php.png
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,)
request1 = '''<YOUR-POST-PEQUEST>'''
request2 = '''<YOUR-GET-PEQUEST>'''
# the 'gate' argument blocks the final byte of each request until openGate is invoked
engine.queue(request1, gate='racel')
for x in range(5):
engine.queue(request2, gate='racel')
# wait until every 'racel' tagged request is ready
# then send the final byte of each request
# (this method is non-blocking, just like queue)
engine.openGate('racel')
engine.complete(timeout=60)
def handleResponse(req, interesting):
table.add(req)
<YOUR-POST-PEQUEST>换成POST恳求参数
<YOUR-GET-PEQUEST>换成GET恳求
开端攻击
基于 URL 的文件上传中的竞争条件
在允许您经过提供 URL 上传文件的函数中可能会呈现相似的竞争条件。在这种状况下,效劳器必需经过 Internet 获取文件并创立本地副本,然后才干执行任何考证。
由于文件是运用 HTTP 加载的,因而开发人员无法运用其框架的内置机制来平安地考证文件。相反,他们可能会手动创立本人的进程降临时存储和考证文件,这可能不太平安。
例如,假如文件被加载到一个随机称号的暂时目录中,理论上,攻击者应该不可能应用任何竞争条件。假如他们不晓得目录的称号,他们将无法恳求文件以触发其执行。另一方面,假如随机目录称号是运用伪随机函数(如 PHP 的 )生成的uniqid(),则它可能会被暴力破解。
为了使此类攻击更容易,您能够尝试延优点理文件所需的时间,从而延长暴力破解目录称号的窗口。一种办法是上传更大的文件。假如它是分块处置的,您能够经过创立一个带有有效负载的歹意文件来潜在天时用这一点,然后是大量的恣意填充字节。
在不远程执行代码的状况下应用文件上传破绽
在我们目前看到的示例中,我们曾经可以上传效劳器端脚本以停止远程代码执行。这是不平安的文件上传功用最严重的结果,但这些破绽依然能够经过其他方式被应用。
上传歹意客户端脚本
虽然您可能无法在效劳器上执行脚本,但您依然能够上传用于客户端攻击的脚本。例如,假如您能够上传 HTML 文件或 SVG 图像,则能够潜在地运用<script>标签来创立存储的 XSS负载。
假如上传的文件随后呈现在其他用户访问的页面上,则他们的阅读器将在尝试呈现该页面时执行该脚本。请留意,由于同源战略限制,只要当上传的文件来自您上传文件的同一来源提供时,这些类型的攻击才会起作用。
应用上传文件解析中的破绽
假如上传的文件似乎被平安地存储和提供,最后的手腕是尝试应用特定于解析或处置不同文件格式的破绽。例如,您晓得效劳器解析基于 XML 的文件,例如 Microsoft Office.doc或.xls文件,这可能是XXE 注入攻击的潜在载体。
运用 PUT 上传文件
值得留意的是,某些 Web 效劳器可能被配置为支持PUT恳求。假如没有恰当的防御措施,这能够提供一种上传歹意文件的替代办法,即便上传功用无法经过 Web 界面运用。
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'); ?>
提示
您能够尝试向OPTIONS不同的端点发送恳求,以测试能否有任何广告支持该PUT办法。
如何避免文件上传破绽
允许用户上传文件是习以为常的,只需您采取正确的预防措施,就不会很风险。通常,维护您本人的网站免受这些破绽影响的最有效办法是施行以下一切理论:
依据允许扩展名的白名单而不是制止的扩展名黑名单检查文件扩展名。猜想您可能希望允许哪些扩展程序比猜想攻击者可能尝试上传哪些扩展程序要容易得多。
确保文件名不包含任何可能被解释为目录或遍历序列 ( ../) 的子字符串。
重命名上传的文件以防止可能招致现有文件被掩盖的抵触。
在文件完整考证之前,不要将文件上传到效劳器的永世文件系统。
尽可能运用已树立的框架来预处置文件上传,而不是尝试编写本人的考证机制。
感谢您的来访,获取更多精彩文章请收藏本站。
![](https://www.gyzsq.com/wp-content/uploads/2022/07/9259adea4619.gif)
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
![头像](/wp-content/themes/zibll/img/avatar-default.png)
- 最新
- 最热
只看作者