LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Impara e pratica l'Hacking su AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)

Sostieni HackTricks

Informazioni di Base

Se hai trovato una Inclusione di File Locale anche se non hai una sessione e session.auto_start è Off. Se session.upload_progress.enabled è On e fornisci il PHP_SESSION_UPLOAD_PROGRESS nei dati multipart POST, PHP abilita la sessione per te.

$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
$ ls -a /var/lib/php/sessions/
. ..
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange' -d 'PHP_SESSION_UPLOAD_PROGRESS=blahblahblah'
$ ls -a /var/lib/php/sessions/
. ..
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange' -F 'PHP_SESSION_UPLOAD_PROGRESS=blahblahblah'  -F 'file=@/etc/passwd'
$ ls -a /var/lib/php/sessions/
. .. sess_iamorange

In the last example the session will contain the string blahblahblah

Nota che con PHP_SESSION_UPLOAD_PROGRESS puoi controllare i dati all'interno della sessione, quindi se includi il file della sessione puoi includere una parte che controlli (ad esempio un shellcode php).

Anche se la maggior parte dei tutorial su Internet ti consiglia di impostare session.upload_progress.cleanup su Off per scopi di debug, il valore predefinito di session.upload_progress.cleanup in PHP è ancora On. Ciò significa che il progresso del caricamento nella sessione verrà eliminato il prima possibile. Quindi si tratta di una Race Condition.

Il CTF

Nel CTF originale in cui questa tecnica è commentata, non è stato sufficiente sfruttare la Race Condition, ma il contenuto caricato doveva iniziare anche con la stringa @<?php.

A causa dell'impostazione predefinita di session.upload_progress.prefix, il nostro file SESSION inizierà con un fastidioso prefisso upload_progress_ come ad esempio: upload_progress_controlledcontentbyattacker

Il trucco per rimuovere il prefisso iniziale era codificare in base64 il payload 3 volte e quindi decodificarlo tramite i filtri convert.base64-decode, questo perché quando decodifica in base64 PHP rimuoverà i caratteri strani, quindi dopo 3 volte solo il payload inviato dall'attaccante rimarrà (e quindi l'attaccante può controllare la parte iniziale).

Maggiori informazioni nel writeup originale https://blog.orange.tw/2018/10/ e nell'exploit finale https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py Un altro writeup in https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

Impara e pratica l'Hacking su AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)

Sostieni HackTricks

Last updated