1 反序列化漏洞原理
如果反序列化的内容就是那串字符串,是用户可以控制的(即变量的值),且后台不正当的使用了PHP中的魔法函数,就会导致反序列化漏洞,可以执行任意命令。
Java 序列化指 Java 对象转换为字节序列的过程
Java 反序列化指字节序列恢复为 Java 对象的过程
Commons-collections 爆出第一个漏洞开始,Java 反序列化漏洞的事件就层出不穷
在 Java 中,利用 ObjectInputStream 的 readObject 方法进行对象读取
2 jndi可以调用哪些协议
反序列化漏洞中一般调用 ldap 和 rmi
3 不安全的反序列化
攻击程序会尝试在不进行任何验证的情况下,对数据进行反序列化,不安全的反序列化会导致远程代码执行、重放攻击、注入攻击等。
4 反序列化漏洞有哪些
Weblogic反序列化漏洞/Jboss反序列化漏洞/nginx反序列化/Tomcat反序列化/shiro反序列化
5 java反序列化原理
把 AESkey 给硬编码到代码里,所以说可以通过爆破的方式找到 AESkey 然后自己构造一个恶意对象,base64 加密然后加载一个恶意对象。
1. Java 序列化指 Java 对象转换为字节序列的过程
2. Java 反序列化指字节序列恢复为 Java 对象的过程
3. Commons-collections 爆出第一个漏洞开始,Java 反序列化漏洞的事件就层出不穷
4. 在 Java 中,利用 ObjectInputStream 的 readObject 方法进行对象读取
5. 可以深入了解 ysoserial 有哪些 gadgets
6 反序列化漏洞的魔法函数(魔术方法)
construct() /destruct() /sleep() /wakeup /toString /get(),set()/invoke()/call 和 callStatic
7 框架漏洞 - 反序列化
1、Shiro 反序列化原理
在Shiro框架下,用户登陆成功后会生成一个经过加密的Cookie。其Cookie的Key的值为RememberMe,Value的值是经过序列化、AES加密和Base64编码后得到的结果。
服务端在接收到一个Cookie时,会按照如下步骤进行解析处理:
○ 检索RememberMe Cookie的值
○ 进行Base64解码
○ 进行AES解码
○ 进行反序列化操作
在第4步中的调用反序列化时未进行任何过滤,进而可以导致出发远程代码执行漏洞。
由于使用了AES加密,成功利用该漏洞需要获取AES的加密密钥,在Shiro1.2.4版本之前AES的加密密钥为硬编码,其默认密钥的Base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,于是就可得到Payload的构造流程:
恶意命令-->序列化-->AES加密-->base64编码-->发送Cookie
目前官方通过去掉硬编码的密钥是的每次生成一个密钥来解决其漏洞,但可以通过搜索引擎等方式收集到不同的密钥,提高对该漏洞的利用成功率。
Shiro漏洞指纹:响应包中存在字段set-Cookie: rememberMe=deleteMe
2、你都复现过strust2哪些漏洞
S2-016 , S2-045 , S2-046 , S2-057
3、thinkphp 远程命令执行
thinkphp版本识别
ThinkPHP是一款基于PHP的开源框架,常用于Web应用程序的快速开发。版本识别是指根据程序的特征和版本信息来判断程序的版本。对于ThinkPHP,可以通过以下几种方式进行版本识别:
1. 查看程序中的版本信息:在ThinkPHP的源代码中,可以找到版本号的定义,一般在ThinkPHP.php文件中。可以通过查看该文件来获取版本号。
2. 检查文件名和目录结构:不同版本的ThinkPHP会有不同的文件名和目录结构,通过检查这些文件名和目录结构可以判断程序的版本。
3. 分析程序的功能和特性:不同版本的ThinkPHP会有不同的功能和特性,通过分析程序的功能和特性可以判断程序的版本。
4. 使用工具进行识别:一些工具可以自动识别程序的版本,例如WhatWeb、Wappalyzer等。这些工具可以通过检查页面源码、HTTP响应头等信息来判断程序的版本。
在 cookie 字段有 remember me 等于 delete me 这么一个特征
1、ThinkPHP3.2.x_assign方法第一个变量可控=>变量覆盖=>任意文件包含=>RCE
2、thinkphp5 一种是因为Request类的method和__construct方法造成的,另一种是因为Request类在兼容模式下获取的控制器没有进行合法校验,我们下面分两种来讲,然后会将thinkphp5的每个小版本都测试下找下可用的payload。
判断:
看icon
看报错
4、spring 远程代码执行
spring4shell
条件:
JDK 9+
直接或者间接地使⽤了Spring-beans包(Spring boot等框架都使用了)
Controller通过参数绑定传参,参数类型为非常规类型的对象(比如非String等类型的自定义对象)
Web应用部署方式必须为Tomcat war包部署
5、fastjson 原理
fastjson实现json对象与JavaBean对象的转换
CVE-2017-18349即Fastjson1.2.24 反序列化漏洞RCE
漏洞出现在Fastjson autoType处理json对象时,没有对@type字段进行完整的安全性验证,我们可以传入危险的类并调用危险类连接远程RMI服务器,通过恶意类执行恶意代码,进而实现远程代码执行漏洞。
判断:
判断fastjson框架
① burp插件自动扫描
② 在web页面抓包,GET改为POST,添加Content-Type:application/json,在发送一个{"test":",即可得到回显有fastjson字样
6、log4j2
一些组件
Spring-Boot-strater-log4j2
Apache struts2
Apache Solr
Apache Flink
Apache Druid
Elasticsearch
Flume
Dubbo
Redis
Logstash
Kafka
vmvare
是一个开源的日志记录组件
原理:该漏洞的主要原因是log4j在日志输出中,未对字符合法性进行严格的限制,执行了JNDI协议加载的远程恶意脚本,从而造成RCE
利用:Log4j2会做什么呢?首先会对该字符串进行解析,发现字符串包含:${},这个会被单独处理,然后再发现这是JNDI的扩展和LDAP协议,并且LDAP协议的地址在本地,要查找的name是exploit,最后调用具体的LDAP模块去请求响应的数据。最多是把该name的数据打印到日志中。但危险的在于:JNDI还支持一个叫命名引用(Naming References)的方式,可以通过远程下载一个class文件,然后下载后加载起来构建对象。
所以JNDI可以远程下载class文件来构建对象就是核心问题,有些时候Java对象比较大,直接通过LDAP存储不方便,就可以通过类似forward的方式不直接返回对象内容,而是告诉你对象属于那个Class以及这个Class的远程地址。
那么危险就来了,如果Class的远程下载URL指定的是一个黑客的服务器,并且下载的Class文件包含攻击代码,你的服务器就完犊子了。