LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Informazioni di base

Se hai trovato una Local File Inclusion anche se non hai una sessione e session.auto_start è Off. Se session.upload_progress.enabled è On e fornisci 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).

Sebbene la maggior parte dei tutorial su Internet consigli 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 viene commentata questa tecnica, 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_contenutocontrollatodall'attaccante

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

Ulteriori 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 su https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated