
Un taller de CodeQL que cubre CVE-2021-21380
En este taller utilizaremos el razonamiento sintáctico y semántico para encontrar una inyección SQL en el componente de calificación de la plataforma XWiki documentado por CVE-2021-21380
Por favor, completa esta sección antes del taller, si es posible.
Instala Visual Studio Code.
Instala la extensión CodeQL para Visual Studio Code.
No necesitas instalar la CLI de CodeQL: la extensión se encargará de esto por ti.
Clona este repositorio:
git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
xwiki-platform-CVE-2021-21380.zip en la vista del Explorador y selecciona el comando CodeQL: Set Current Database.Cmd/Ctrl+Mayús+P), busca y ejecuta el comando CodeQL: Install Pack Dependencies.github en la caja para filtrar la lista.cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions y cve-2021-21380-solutions-tests.El taller está dividido en varios ejercicios que introducen el soporte del lenguaje QL para Java y termina con una consulta final para encontrar la inyección SQL conocida. En estos ejercicios aprenderás:
En este taller buscaremos vulnerabilidades de inyección SQL conocidas en el componente de API de calificaciones de la Plataforma XWiki. Tales vulnerabilidades pueden ocurrir en aplicaciones cuando información controlada por un usuario externo llega al código de la aplicación que construye de manera insegura una consulta SQL y la ejecuta.
La inyección SQL conocida que se discute en este taller está revisada en GHSA-79rg-7mv3-jrr5 en la Base de Datos de Avisos de GitHub. Para encontrar la inyección SQL, y posibles variantes, abordaremos los siguientes subproblemas:
En los primeros ejercicios razonaremos sobre información sintáctica, usando el Árbol de Sintaxis Abstracta (AST), para identificar:
Encuentra todos los métodos con el nombre getAverageRating y su tipo declarante en el programa completando la consulta exercise1.ql
java proporciona una clase Method para razonar sobre métodos en un programa.Method proporciona los predicados miembro getName y hasName para razonar sobre el nombre de un método.Method proporciona el miembro getDeclaringType para razonar sobre el tipo que declara el método.Una solución se puede encontrar en la consulta exercise1.ql
Una solución al ejercicio 1 devuelve una lista de métodos. Algunos están definidos en una interfaz llamada RatingsManager y otros en las clases AbstractRatingsManager y RatingsScriptService.
De la información devuelta por la consulta y la documentación de componentes de XWiki podemos deducir que:
Role, y una implementación anotada con Component.ScriptService se hace accesible a las páginas wiki a través de scripting.Encuentra todas las clases anotadas con la anotación Component completando la consulta exercise2.ql. Ten en cuenta que el nombre completamente calificado del tipo de la anotación es org.xwiki.component.annotation.Component.
this en el predicado característico.Class proporciona un método getAnAnnotation para obtener las anotaciones asociadas.Annotation proporciona el predicado miembro getType para razonar sobre su tipo.Type proporciona los predicados miembro getName y hasName para razonar sobre el nombre de un tipo.RefType, que representa clases e interfaces, proporciona los predicados miembro getQualifiedName y hasQualifiedName para razonar sobre el nombre completamente calificado del reftype.Una solución se puede encontrar en la consulta exercise2.ql