挖洞经验 | 看我如何发现Paypal内部信息泄露漏洞
字数 1355 2025-08-18 11:37:23
PayPal 表达式注入漏洞挖掘与分析
漏洞概述
在 PayPal 网站 manager.paypal.com 上发现了一个表达式注入漏洞 (Expression Language Injection),攻击者可以利用该漏洞获取 PayPal 系统的内部 IP、端口和方法类等敏感数据信息。
漏洞发现背景
- 时间:2018年2月
- 测试平台:bountyfactory.io 漏洞众测平台
- 目标范围:所有
*.paypal.com域名
前期侦察
-
常规侦察步骤:
- 枚举子域名
- 枚举可访问文件
- 枚举目录
-
发现可疑页面:
- 页面特征:多个可填写区域但没有提交按钮
- 页面架构识别:WappAlyzer 只识别到 "Apache" 无版本信息
- 页面风格:相比新式网页显得"老旧"
漏洞测试过程
初始测试思路
-
尝试反射型XSS:
- 测试结果:PayPal 的 WAF 有效拦截,未发现绕过方法
-
尝试注入漏洞:
- 测试 payload:
{7*7}{{7*7}}${7*7}
- 成功 payload:
${7*7}返回了计算结果49
- 测试 payload:
技术分析
-
漏洞类型确认:
- JSTL (JSP Standard Tag Library) 表达式注入
- 通过 JSTL 标记库执行表达式语法命令
-
JSTL 基础知识:
- 用途:在 JSP 页面中使用标签库代替传统 Java 片段语言
- 功能:迭代和条件判断、数据管理格式化、XML 操作、数据库访问
-
可利用的隐式对象:
pageContext对象及其属性:pageContext.requestpageContext.responsepageContext.propertiespageContext.pagepageContext.servletConfigpageContext.servletContext
- 通过这些属性可以访问:
- 请求协议
- 服务器端口
- Servlet API 版本
- 请求、响应、会话和应用上下文信息
深入利用
-
信息泄露利用:
- 使用 BurpSuite Intruder 功能对发现的属性进行 fuzzing
- 发现新参数:
${pageContext.servletContext.docRoot}- 可显示服务器上编译过的 WAR 文件相对路径
-
尝试 RCE:
- 测试 payload:
${T(java.lang.System).getenv()} - 结果:被 WAF 拦截,响应 301 跳转
- 结论:无法实现 RCE,可能受 WAF 限制或技术限制
- 测试 payload:
漏洞影响
- 可获取的敏感信息:
- 内部 IP 地址
- 服务端口
- 方法类信息
- WAR 文件路径
- Servlet 配置信息
漏洞修复建议
- 对用户输入进行严格过滤和验证
- 禁用或限制 JSTL 表达式的执行能力
- 更新 WAF 规则以检测和阻止表达式注入尝试
- 对老旧系统进行安全审计和升级
漏洞报送结果
- 报送时间:2018-03-08
- PayPal 响应:安全风险不明,但给予漏洞赏金
经验总结
- 老旧系统往往是安全漏洞的高发区
- 表达式注入是一种容易被忽视的漏洞类型
- 系统性的 fuzzing 可以发现意外漏洞
- 即使无法实现 RCE,信息泄露也可能带来严重风险
- 漏洞赏金项目需要持续投入和耐心测试