对某SRC的渗透测试实战
字数 1544 2025-08-11 08:36:13
Sitecore CMS渗透测试实战教学文档
1. 前期准备与目标选择
1.1 目标选择策略
- 选择没有明确测试范围的目标(无范围限制)
- 优先选择大规模企业(暴露面广,可能有遗留系统)
- 注意寻找"软柿子"(防护较弱或开发者遗漏的站点)
1.2 心态准备
- 渗透测试需要耐心(案例中耗时一周多)
- 避免过度依赖自动化工具(容易被封IP)
- 保持手工测试与工具扫描的平衡
2. 信息收集阶段
2.1 初始侦察
- 主域名分析
- 搜索框识别(潜在注入点)
- 抓包分析(识别CDN、特殊文件)
2.2 CMS识别
- 识别Sitecore CMS特征
- 尝试确定CMS版本(本例中失败)
- 收集CMS已知漏洞(如CVE-2021-42237)
2.3 敏感目录探测
- 尝试访问/Sitecore后台目录(本例中被限制)
- 检查robots.txt文件
- 访问/api接口(本例中403)
- 检查Sitemap.xml
2.4 403绕过技术
- 使用X-Rewrite-URL覆盖路径尝试绕过
- 注意绕过后可能仍有重定向限制
2.5 端口扫描
- 使用nmap扫描
- 识别开放服务(本例中发现MySQL、VPN等)
- 注意443端口的web服务
2.6 旁站与子域名收集
- 使用FOFA、SHODAN等黑暗引擎
- 识别同CMS站点(可能有相同漏洞)
- 寻找空白站(可能有开发者遗漏内容)
3. 漏洞挖掘技术
3.1 Vue模板注入漏洞
- 识别Vue.js框架特征(双大括号{{}}或v-text指令)
- 测试Payload:
{{7*7}}(本例中返回49确认漏洞) - 绕过WAF的Payload示例:
{{constructor.constructor%0a(%27\u0061\u006c\u0065\u0072\u0074`1`%27)()}}
3.2 敏感文件泄露
- 扫描可能泄露的文件:
- /log/ 服务器日志
- /data/ 数据库文件
- /data/Setting.xml 数据库凭证
- /old/ 服务器信息
- /trace.axd 应用程序代码
- /update/ 系统内部文件
3.3 Web Service接口测试
- 识别Service.asmx等接口
- 分析接口功能(文件上传、XML处理等)
- 尝试调用接口(本例中IP受限)
3.4 SQL注入漏洞
- 参数测试(本例中whcode参数)
- 布尔型盲注技术:
- 构造判断语句(OR 1=1等)
- 通过返回值差异判断(0为成功,-1为失败)
- 高级Payload示例:
-1' OR ASCII(SUBSTRC((SELECT NVL(CAST(user AS VARCHAR(4000)),CHR(32)) FROM aaaa),1,1))>0 AND 000360=000360 --
4. 工具与脚本
4.1 常用工具
- nmap(端口扫描)
- FOFA/SHODAN(子域名收集)
- 后台扫描工具(敏感文件发现)
4.2 自定义脚本
- Java SOAP接口测试脚本(绕过SSL验证)
- 布尔盲注辅助判断脚本
- 文件上传测试脚本
5. 绕过技术
5.1 WAF绕过
- 编码绕过(Unicode编码)
- 换行符绕过(%0a)
- 特殊字符插入
5.2 403绕过
- 请求头覆盖(X-Rewrite-URL)
- 路径混淆技术
6. 漏洞利用链构建
- 通过子域名收集发现测试站点(无WAF)
- 在测试站点确认Vue模板注入漏洞
- 利用相同技术尝试主站(需WAF绕过)
- 通过敏感文件泄露获取数据库凭证
- 通过Web Service接口发现SQL注入点
- 结合信息泄露内容验证SQL注入结果
7. 注意事项
- 法律合规:获得授权后再测试
- 敏感数据处理:不公开披露具体数据
- 测试强度控制:避免造成服务中断
- IP被封处理:使用代理、调整扫描频率
- 漏洞报告:注意报告内容分寸
8. 总结与经验
- "柿子挑软的捏":从防护弱的点入手
- 信息收集是关键:决定后续测试方向
- 手工测试不可替代:自动化工具有限制
- 耐心与坚持:复杂目标可能需要长时间
- 思路比工具重要:创造性思考解决问题
附录:常见Payload
-
Vue模板注入检测:
{{7*7}} -
Vue模板注入利用(绕过WAF):
{{constructor.constructor%0a(%27\u0061\u006c\u0065\u0072\u0074`1`%27)()}} -
SQL布尔盲注判断:
-1' OR 1=1 -- -1' OR 1=2 -- -
SQL高级盲注(ASCII逐字符判断):
-1' OR ASCII(SUBSTRC((SELECT NVL(CAST(user AS VARCHAR(4000)),CHR(32)) FROM aaaa),1,1))>0 AND 000360=000360 --