☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
- 发现我们的独家[**NFT收藏品The PEASS Family**](https://opensea.io/collection/the-peass-family)
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
# 文件上传通用方法论
1. 尝试使用**双重扩展名**上传文件(例如:_file.png.php_ 或 _file.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_
2. 尝试将扩展名的**某些字母大写**,例如:_.pHp, .pHP5, .PhAr ..._
3. 尝试上传一些**双重(或更多)扩展名**(用于绕过检查是否存在特定扩展名的错误配置检查):
1. _file.png.php_
2. _file.png.txt.php_
4. 尝试上传一些**反向双重扩展名**(用于利用Apache错误配置,其中任何具有_.php_扩展名的文件,但**不一定以.php结尾**,都将执行代码):
* 例如:file.php.png
5. 使用**空字符的双重扩展名**:
1. 例如:file.php%00.png
6. 在扩展名的末尾**添加一些特殊字符**:_%00,%20,(多个点)...._
1. _file.php%00_
2. _file.php%20_
3. _file.php...... --> 在Windows中,如果文件以点结尾创建,这些点将被删除(因此可以绕过检查扩展名为.php的过滤器)
4. _file.php/_
5. _file.php.\_
7. 通过将**Content-Type** **header**的**value**设置为:_image/png_,_text/plain_,_application/octet-stream_,绕过Content-Type检查。
8. 通过在文件开头添加**真实图像的字节**(混淆_file_命令)来绕过魔术数字检查。或者在**元数据**中引入shell:`exiftool -Comment="*?”`。 (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文件(在被受害者意外打开时将执行代码)。
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files" %}
如果您正在尝试将文件上传到**PHP服务器**,请查看[**.htaccess**技巧以执行代码](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess)。
如果您正在尝试将文件上传到**ASP服务器**,请查看[**.config**技巧以执行代码](../pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files)。
`.phar`文件类似于Java的`.jar`文件,但用于PHP,并且可以像PHP文件一样使用(使用php执行它,或在脚本中包含它...)
`.inc`扩展名有时用于仅用于导入文件的PHP文件,因此在某些情况下,某人可能已经允许执行此扩展名。
使用BurpSuit插件[https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)检查许多可能的文件上传漏洞,或使用一个控制台应用程序找出可以上传的文件并尝试不同的技巧来执行代码:[https://github.com/almandin/fuxploider](https://github.com/almandin/fuxploider)
## wget文件上传/SSRF技巧
在某些情况下,您可能会发现服务器正在使用`wget`来下载文件,并且您可以指定URL。在这些情况下,代码可能会检查下载文件的扩展名是否在白名单中,以确保只有允许的文件才能下载。然而,这个检查可以被绕过。
在Linux中,文件名的最大长度为255个字符,但是`wget`将文件名截断为236个字符。您可以下载一个名为"A"\*232+".php"+".gif"的文件,这个文件名将绕过检查(在这个例子中,".gif"是一个有效的扩展名),但是`wget`将把文件重命名为"A"\*232+".php"。
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
```
```bash
#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将使用新名称下载重定向的文件。这**不起作用**,**除非**wget与参数`--trust-server-names`一起使用,因为**wget将使用原始URL中指定的文件名下载重定向的页面**。
# 从文件上传到其他漏洞
* 将**文件名**设置为`../../../tmp/lol.png`,尝试实现**路径遍历**
* 将**文件名**设置为`sleep(10)-- -.jpg`,可能能够实现**SQL注入**
* 将**文件名**设置为`