Micro-CMS v1
2 minutos de lectura
Tenemos una página web sencilla que nos permite editar y crear artículos en Markdown:

Vamos a pinchar en “Testing”:

Ahora, podemos intentar editar el artículo actual. Se nos muestra una caja de texto para escribir el código Markdown ahí:

Markdown es un lenguaje de marcado similar a HTML pero más sencillo. Además, Markdown soporta el uso de etiquetas HTML. Por tanto, podemos intentar a poner un payload de Cross-Site Scripting (XSS) como este:
<script>alert(123)</script>
Parece que no funciona. De hecho, si mostramos el código fuente, se ve que nuestro payload ha sido reemplazado:

Por tanto, este payload está bloqueado. Vamos a probar este otro:
<img src="x" onerror="alert(123)">
Y ahora sí funciona, ya que se muestra la alerta:

Si inspeccionamos el código fuente de nuevo, obtenemos una flag:

Mirando a la URL, vemos que hay un número al final (/page/1). Vamos a probar a poner otros números: para /page/2 tenemos “Markdown test”, para /page/3 obtenemos 404 Not Found. Pero para /page/4 tenemos 403 Forbidden:



Si probamos más números solamente obtendremos 404 Not Found.
Vamos a ver qué pasa en “Markdown test”:

No hay nada más que hacer con el artículo. Sin embargo, vemos que la URL ha cambiado; ahora es /page/edit/2. Vamos a ver si podemos visualizar /page/edit/4, que nos daba error 403 Forbidden:

Y tenemos la segunda flag, explotando una vulnerabilidad de Referencia Directa a Objetos Insegura (IDOR).
Vamos a continuar creando un nuevo post:

Decidí ponerle New1 como título y Test1 como contenido. Después, creé otro post usando New2 y Test2. Ahora, la página principal tiene esta pinta:

Vamos a probar a añadir el payload XSS con <img> en el título de alguno de los posts. En esta página el HTML no se está interpretando:

Pero si volvemos a la página principal, obtenemos otra flag:

Y finalmente, podemos deducir que la aplicación está utilizando una base de datos para almacenar los artículos. Por tanto, para mostrarlos, el servidor está realizando una consulta a la base de datos para obtener los artículos. Y entonces, podemos probar con algún payload de inyección de código SQL.
Por ejemplo, podemos añadir una comilla simple para romper la sintaxis de SQL:

Y obtenemos la cuarta y última flag.