Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

Prefacio

Las vulnerabilidades de inyección de SQL son una de las vulnerabilidades más comunes en la seguridad WEB. Con el uso de precompilación y varios marcos ORM en Java, los problemas de inyección son cada vez menos.

Los auditores de código novatos a menudo se sienten intimidados por la combinación de múltiples marcos de aplicaciones web Java. No saben cómo comenzar. Esperan que al usar el problema de inyección SQL causado por el uso inadecuado del marco Mybatis como ejemplo, puedan darles algunas ideas.

Uno, inyección SQL de Mybatis

Las sentencias SQL de Mybatis se pueden escribir en el método de clase basándose en anotaciones, y más se escriben en archivos xml en formato xml.

La instrucción SQL en Mybatis debe ser escrita manualmente por nosotros mismos o generada automáticamente por un generador. Al escribir archivos xml, Mybatis admite dos símbolos de parámetro, uno es #, el otro es $. como:

<select id="queryAll"  resultMap="resultMap">  SELECT * FROM NEWS WHERE ID = #{id}</select>

Use precompilación y $ use SQL de empalme.

Las vulnerabilidades de inyección de SQL que tienden a ocurrir bajo el marco de Mybatis se dividen principalmente en los siguientes tres tipos:

1. Consulta difusa

Select * from news where title like ‘%#{title}%’

En este caso, el uso del programa # informará de un error y los programadores novatos cambiarán el número # a $, por lo que si el nivel de código Java no se ocupa del contenido de la entrada del usuario, inevitablemente provocará vulnerabilidades de inyección SQL.

Escritura correcta:

select * from news where tile like concat(‘%’,#{title}, ‘%’)

2. Varios parámetros después de en

Cuando utilice varias consultas de ID después de in, # también informará un error.

Select * from news where id in (#{ids})

El uso correcto es usar foreach en lugar de reemplazar # con $

id in<foreach collection="ids" item="item" open="("separatosr="," close=")">#{ids} </foreach>

3. Después de ordenar por

Este escenario debe mapearse a nivel de Java, configurar una matriz de nombres de campo / tabla y solo permitir a los usuarios pasar valores de índice. Esto asegura que los campos entrantes o los nombres de las tablas estén en la lista blanca. Cabe señalar que en la instrucción SQL generada automáticamente por mybatis-generator, order by también usa $, y like y in no son un problema.

2. Ideas de combate reales

Usamos un cms de código abierto para analizar. El problema de inyección SQL de java es adecuado para inferencia inversa. Primero busque xml para encontrar posibles puntos de vulnerabilidad de inyección → presione inverso a DAO → luego a la clase de implementación → busque la URL de front-end a través de la cadena de llamadas y encuentre el punto de explotación , No hables mucho

1. Proyecto de importación de ideas

Haga clic en Obtener del control de versiones en la página de inicio de Idea e ingrese https://gitee.com/mingSoft/MCMS.git

La descarga está completa, espere a que maven descargue el proyecto

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

2. Busque la palabra clave $

Ctrl + shift + F abre Find in Path, filtra el sufijo xml y busca la palabra clave $

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Según el nombre del archivo, lo que necesitamos es el xml con Dao. Tome IContentDao.xml como ejemplo, haga doble clic para abrir, ctrl + F buscar $, busque los primeros tres de los 16 para la selección de la base de datos, omita,

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Continúe hacia abajo para ver el pedido sospechoso por archivado temporalmente

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Continúe mirando hacia abajo y descubra que hay múltiples empalmes ordinarios, que son más fáciles de usar. Tomemos esto como un ejemplo para profundizar y solo encontrar dónde se importan los identificadores desde el frente.

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

3. Busque objetos cartográficos

El id de selección de Mybatis corresponde al nombre del objeto a mapear, usamos getSearchCount como la palabra clave para buscar el objeto mapeado

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Encontré IContentDao.java, IContentDaoimpl.java y McmsAction.java, que corresponden al objeto mapeado, la clase de implementación del objeto y el controlador front-end respectivamente, y saltan directamente a la clase controladora

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Se encuentra que solo categoryIds es similar a los identificadores de parámetros de destino y se requiere confirmación adicional. Regrese a IContentDao.java para continuar la deducción inversa de acuerdo con el flujo estándar

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Busque los identificadores como último parámetro de getSearchCount, alt + f7 para ver la cadena de llamadas

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Transfiera a ContentBizImpl, confirme que el parámetro de primer plano es categoryIds

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Regrese a McmsAction, los parámetros son recibidos por BasicUtil.getString,

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Seguimiento de BasicUtil.getString

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Continúe saltando a SpringUtil.getRequest (), la interfaz no se ha procesado y SQL se inyecta en el martillo real

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

4. Confirmación de vulnerabilidad

El proyecto se está ejecutando y la declaración sql se construye http: // localhost: 8080 / ms-mcms / mcms / search.do? CategoryId = 1% 27)% 20% 20 o + updatexml (1, concat (0x7e, (SELECT +% 40% 40version ), 0x7e), 1)% 23 Obtenga la versión 5.7.27 de mysql, verifique que la inyección exista.

Las 3 formas de ataques de inyección SQL bajo el marco de Mybatis son realmente difíciles de prevenir

 

Tres, resumen

Lo anterior es el método básico de la auditoría de inyección SQL de Mybatis. También hay problemas con varios puntos que no analizamos. Los novatos pueden intentar analizar diferentes puntos de inyección para volver a hacerlo. Creo que habrá más ganancias. Cuando volvamos a encontrarnos con problemas similares, podemos considerar:

1. Audite la inyección SQL bajo el marco Mybatis, enfocándose en tres aspectos como, en y orden por

2. Al escribir sql en modo xml, primero puede filtrar el archivo xml para buscar $, analizar uno por uno, prestar especial atención al orden mediante la inyección de mybatis-generator

3. El método de anotación de Mybatis es similar al escribir SQL

4. El nivel de Java debería hacer un buen trabajo de verificación de parámetros, asumiendo que la entrada del usuario es una entrada maliciosa para prevenir posibles ataques.

Supongo que te gusta

Origin blog.csdn.net/weixin_48612224/article/details/109191989
Recomendado
Clasificación