03/11/24
InjeccióSQLmitjançantcadenesdefiltresPHP
SMS Challenge | CyCTF 2024
Thanks for sharing!
بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ

I know your browser history
Hola a tothom! És l'Omar (també conegut com キ Bolet).
Avui us explicaré el resum del repte
Avui us explicaré el resum del repte
SMS de les qualificacions de CyCTF 2024.Aquest va ser un repte divertit que implicava utilitzar la injecció SQL per crear un compte, seguit d'explotar
PHP filter chains per recuperar la bandera.Aquí teniu el codi font del repte: SMS Challenge - GitHub
Submergem-nos!
Visió general del repte
Sabem que la bandera es troba al camí
Tenim codi font i accés a un servidor en directe.
/flag.txt.Tenim codi font i accés a un servidor en directe.

Visitant el lloc web
Quan visitem el lloc web, veiem una pàgina amb un formulari de comentaris i un formulari de càrrega:

Inicialment, vaig sospitar una vulnerabilitat de càrrega de fitxers, però comprovem el codi font proporcionat per confirmar-lo.
Anàlisi del codi font
Aquí teniu un resum ràpid dels fitxers d'aplicació proporcionats:

- index.php - Conté les dues formes que es mostren més amunt.
- login.php - que em sembla segur, i observeu la línia
$_SESSION['admin'] = true;sempre que inicieu sessió correctament
- reset.php - Res inusual o explotable.
- upload.php: originàriament se sospitava d'una vulnerabilitat de pujada de fitxers, però una revisió més detallada del codi mostra que és segur.
- forgot_password.php - Aquí tampoc no es pot explotar.
Nota: com que el codi font és llarg, l'he adjuntat en un repositori de GitHub (enllaç proporcionat més amunt) com a referència.
Trobar la vulnerabilitat d'injecció SQL
A
submit_feedback.php, observem alguna cosa interessant
$date es passa sense cap validació, el que el fa vulnerable a la injecció SQL.Controlem la capçalera
Date mitjançant $_SERVER['HTTP_DATE'], que es converteix en el nostre punt d'entrada.Per als nostres últims 3 fitxers:
dashboard.php, feedback.php i check_integrity.php requereixen una sessió admin per accedir com es mostra a continuacióEl que bàsicament significa que hem d'iniciar sessió d'alguna manera i tindrem accés a aquestes rutes, perquè obtindreu una sessió
admin sempre que inicieu sessió com s'ha esmentat anteriorment.Explotant la vulnerabilitat d'injecció SQL
Comencem per crear la nostra càrrega útil SQL per crear un compte:
- Injecció inicial: finalitza la consulta actual amb:
- Insereix usuari nou: coneixent les columnes
usernameipassworda la taulausers, la nostra consulta es converteix en:
Aquí,
# s'utilitza per comentar la resta de la consulta. Tanmateix, aquest enfocament no funciona com s'esperava.En revisar
login.php, veiem que utilitza password_verify, és a dir, les contrasenyes s'emmagatzemen com a valors resumits.
Si comprovem
reset.php, també trobem que les contrasenyes s'hagin utilitzant password_hash.
Per generar una contrasenya hash, he executat el següent codi PHP:
La nostra càrrega útil d'injecció final es converteix en:
Això afegeix correctament un usuari anomenat
mushroom amb la contrasenya pass.Execució de la injecció
Vaig enviar comentaris amb aquesta càrrega útil mitjançant Burp Suite, injectant l'SQL elaborat a la capçalera
La resposta del servidor era una pàgina en blanc, que indicava que la injecció va tenir èxit.
Date.La resposta del servidor era una pàgina en blanc, que indicava que la injecció va tenir èxit.

Inici de sessió com a administrador
Navegant a
login.php, vaig iniciar sessió correctament amb les credencials acabades de crear i em vaig redirigir al tauler.
Cercant vulnerabilitats
Amb accés d'administrador, vaig examinar
dashboard.php, feedback.php i check_integrity.php. Tot i que els dos primers fitxers no van revelar gaire, check_integrity.php semblava prometedor.Després d'una inspecció posterior, utilitza la funció
sha1_file, que es pot aprofitar. Una cerca a Google de "vulnerabilitat PHP sha1_file" em va portar a un article sobre cadenes de filtres PHP.Automatització de l'explotació del filtre PHP
L'article proporciona una eina per automatitzar l'explotació: synacktiv/php_filters_chain_oracle_exploit.
Després de la instal·lació, l'ordre hauria d'acabar semblant així:
Tingueu en compte que he afegit un valor fictici per a
user_hash perquè és necessari per introduir la funció sha1_file
Nota: és possible que hàgiu d'eliminar l'avís SSL quan executeu l'eina.
Per fer-ho, només cal que afegiu aquestes línies al principi d'aquest fitxer:
requestor.py al directori coreRecuperant la bandera
Executant l'explotació, comencem a veure com apareix la bandera, personatge a personatge.

Al cap d'una estona, recuperem la bandera completa:
CYCTF{tXv6lJDD-rtX_PC-TngDsrxpOP_mu7As6UaEO5Gmhk0Fo5WYO9S_aIzPiiDxj_yVYnsZxfgK8F9TGyy7zC19R_aGMJAPKXaAYnLUCAnBf96i}
Nota: és possible que l'últim
} no aparegui a causa del truncament; afegir-lo manualment.Això és tot!
Espero que us hagi agradat l'escrit. Va ser divertit resoldre aquest repte.
Fes una ullada al meu X (anteriorment Twitter) per obtenir més actualitzacions.
Em podeu trobar a Discord:
mush.shFes una ullada al meu altre escrit sobre Vending Machine Challenge
Pau!
Etiquetes:

