Party Cat0%

03/11/24

InjeccióSQLmitjançantcadenesdefiltresPHP

SMS Challenge | CyCTF 2024

Thanks for sharing!

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ

Injecció SQL mitjançant cadenes de filtres PHP
I know your browser history
Hola a tothom! És l'Omar (també conegut com キ Bolet).
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í /flag.txt.
Tenim codi font i accés a un servidor en directe.
sms-cyctf24-web

Visitant el lloc web

Quan visitem el lloc web, veiem una pàgina amb un formulari de comentaris i un formulari de càrrega:
main page
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:
source code files
  1. index.php - Conté les dues formes que es mostren més amunt.
  2. login.php - que em sembla segur, i observeu la línia $_SESSION['admin'] = true; sempre que inicieu sessió correctament
    Login
  3. reset.php - Res inusual o explotable.
  4. 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.
  5. 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
SQL Injection Vulnerability
$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:
  1. Injecció inicial: finalitza la consulta actual amb:
  2. Insereix usuari nou: coneixent les columnes username i password a la taula users, 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.
Password Verify
Si comprovem reset.php, també trobem que les contrasenyes s'hagin utilitzant password_hash.
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 Date.
La resposta del servidor era una pàgina en blanc, que indicava que la injecció va tenir èxit.
Payload Injection

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.
Dashboard

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
Filter Exploit
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 core

Recuperant la bandera

Executant l'explotació, comencem a veure com apareix la bandera, personatge a personatge.
Flag Appearance
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.sh
Fes una ullada al meu altre escrit sobre Vending Machine Challenge
Pau!

També et pot interessar