20/09/25
CSPBypassmitjançantXSS
Escrit oficial: rebutjat | IEEE 2025
Thanks for sharing!
بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ

I know your browser history
Hola nerrrrrds! Avui tenim un repte divertit. Una bona idea CSP Bypass! Abans de començar, podeu descarregar el codi font des d'aquí
Codi font
El primer que observeu és la capçalera del CSP:
Això vol dir que només podem carregar scripts des de
cdn.jsdelivr.net i només podem fer sol·licituds al mateix origen.Tenim 3 vies principals: Auth, user i admin.
Les rutes d'auth són bastant estàndard. Pel que fa a les rutes dels usuaris:
El tauler de control mostra les dades de l'usuari, si comproveu el
dashboard.ejs, podreu veure que us indica si el vostre estat és approved.L'esquema d'usuari té aquest aspecte (l'usuari administrador està creat prèviament):
I cada vegada que es crea un usuari nou, el seu estat s'estableix a
pending de manera predeterminada.El punt final següent és
/update-message, que actualitza el camp de missatge a l'esquema d'usuari.El punt final
/report us permet informar d'un usuari pel seu nom d'usuari.El bot:
Podeu veure que afegeix el nom d'usuari directament a l'URL i el visita.
Finalment, les rutes d'administració:
A
/admin/dashboard, l'administrador pot veure tots els usuaris i pot aprovar-los amb el seu ID d'usuari.A
/admin/approve/:userId, l'administrador pot aprovar un usuari, que estableix el seu estat en approved./admin/message/:username mostra el missatge d'un usuari.Aquí observem que el missatge es representa amb
<%- %>, el que significa que no s'escapa. Aquest és un vector XSS potencial.L'últim punt final és
/admin/user/:username (que fa servir el bot), que mostra els detalls d'un usuari.Explotació
Ara... hem d'aprovar el nostre usuari i, com que tenim la funció
user, no podem accedir a les rutes d'administració. Això vol dir que necessitem que l'administrador ens aprovi mitjançant XSS.Hem observat que l'única vista que mostra l'entrada de l'usuari sense escapar és
message.ejs, que només és accessible per l'administrador. Així que encenem Docker, iniciem sessió com a administrador i intentem que el nostre xss funcioni.La vostra contrasenya d'administrador s'imprimirà a la consola quan inicieu el servidor.
A CSP només podem carregar scripts des de
cdn.jsdelivr.net. Si hi podem allotjar la nostra càrrega útil, la podem carregar. Llavors, com ho podem fer?A cdn.jsdelivr.net, podeu carregar qualsevol fitxer des de qualsevol repositori públic de github com aquest:
Així que vaig crear un repo amb una càrrega útil d'alerta senzilla i la vaig carregar amb:
Ara visiteu
/admin/message/admin (ja que hem iniciat sessió com a administrador) i hauríeu de veure l'alerta emergent.
Molt bé! Ara podem executar XSS perquè l'administrador ens aprovi. Però... hem de conèixer el nostre userId per fer-ho. L'usuari no té cap manera de veure el seu ID d'usuari, així que primer hauríem de filtrar-lo des del tauler d'administració.
Podeu fer que l'administrador recuperi el tauler i obtingui l'ID d'usuari de moltes maneres, una d'elles és:
Això registra l'ID d'usuari de
mushroom a la consola.
Podem utilitzar aquest identificador per aprovar-nos encara més.

I ho vam fer! Tot el que hem de fer ara és informar-ho al bot
Tenim un altre problema però. El bot només visita
/admin/user/:username, que no mostra el missatge sense escapar. Per tant, hem de fer que el bot visiti /admin/message/:username.A
server.js, podem notar aquesta normalització:Això vol dir que podem utilitzar la travessa del camí per sortir de la ruta
/user/ i anar a /message/.Informarem de
../message/mushroom al bot, que farà que visiti /admin/user/../message/mushroom -> /admin/message/mushroom.I aquí ho tenim!

IEEE{U_F0rc3d_Th3_4dm1n_2_4ppr0v3_Y0u}
Nota: haureu de tancar la sessió i tornar a iniciar sessió per veure la bandera, ja que la vista obté l'usuari deres.locals.useri l'aprovació no l'actualitza.
Perquè consti, una altra manera de filtrar l'ID d'usuari (més complexitat sense cap motiu, però tingueu en compte la tècnica que podeu utilitzar-la en un altre xal) és obtenir l'html del tauler, l'inici de sessió CSRF amb el vostre usuari i després afegir l'html al vostre missatge.
Això és tot per avui, espero que us hagi agradat l'escrit! Ens veiem la propera vegada :)
Etiquetes:

