- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《Spring 远程代码执行中文》.pdf
Remote Code with
Expression Language Injection
Spring Framework 脆弱性DanAmodio
翻译-CISRG Amu
全世界超过 22,000 组织已经下载了 131.4 万过时的 Spring Framework,使用在业务中
可能会存在风险。
在 2011 年,来自 Minded Security 的 Stefano Di Paola 和来自 Aspect Security 的
Arshan Dabirsiaghi 在 Spring Framework 中发现了一个有趣模式。Stefano 创造了
Expression Language (EL) 注入。他们的发现披露了某些双重的解析 EL 的 spring 标签可
以泄露服务器上的敏感数据。这是由于 spring 提供了独立于 jsp/servlet 容器的 EL 支持,
以此来作为向下兼容的一种方式。因此在 jsp2.0 之前,EL 是不被支持的。这个功能在当前
版本中是默认打开的,应用程序使用了此模式描述是易受攻击的。
由于每个应用程序并不都会出现反射 xss 这种弱点,虽然很难量化它的深度和广度,但
我们根据 Sonatype 最新的统计知道,全世界超过 22,000 的组织下载 Spring 3.0.5 以下版
本 已经超过 131.4 万。Point-in-fact, one large retail organization consumed 241
different artifacts, 4,119 total downloads。
这些版本不支持禁用 double EL resolution.
这个问题原来的影响是信息泄露,但是我将举例说明它如何在 Glassfish 和其他包含
EL2.2 容器上可能进行远程代码执行。
这是一个原始信息泄露的攻击例子:
请求:
ttp:///foo?message=${applicationScope}
到达以下内容页面:
spring:message text= code=${param[message]}/spring:message
结果将输出一些包含内部服务器信息 calsspath 和本地工作目录
你也可以做一些其他事情,如这样:
${9999+1}
还可以访问 session 对象和 beans
${employee.lastName}
发现
在执行 Glassfish 上客户端应用程序的渗透测试时,我遇到了同样的模式,知道大概是
EL 注入,做了额外的测试后,确认了这一发现,同时延续下去,我想挖掘一些有滋味的东
西,比如 XSS.
哎,应用程序的输入过滤终止了我的请求,因此去掉了” ”和””标签
突发奇想,我想“我可以在 JAVA 中进行字符操纵,为什么我不试试利用 EL 来绕过过滤
呢?”
因此,我尝试了如下:
/app?code=${param.foo.replaceAll(“P”,”Q”)}foo=PPPP
P
我注意到返回的错误代码时 QQQQQ,由于String.replaceall 方法已经被调用,所以返
回的文本被插入进了 spring:message 标签。
这里是一个最终绕过过滤的实例:
/app?code=${param.foo.replaceAll(“P”,””).replaceA
ll(“Q”,””)}foo=PscriptQalert(1);P/scriptQ
它运行的很好,接下来一个小时我什么都没想。然后我认识到他是真的真的糟糕的。为
什么可以在 EL 中像这样插入方法。接下来,我还可以做些其他好玩的事情呢?
经过一番研究,我学习到 EL2.2 增加了方法调用。
更近一步:
我写了一个快速测试应用程序代码并且检测一些功能
${pageContext.request.getSession().setAttribute(account,123456)}
${pageContext.request.getSession().setAttribute(
文档评论(0)