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.