LFI2RCE tramite PHP_SESSION_UPLOAD_PROGRESS

Reading time: 3 minutes

tip

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

Supporta HackTricks

Informazioni di base

Se hai trovato un Local File Inclusion 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 abiliterà la sessione per te.

bash
$ 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 tuo file di sessione puoi includere una parte che controlli (un php shellcode per esempio).

note

Anche se la maggior parte dei tutorial su Internet ti consiglia di impostare session.upload_progress.cleanup su Off per scopi di debug. L'impostazione predefinita di session.upload_progress.cleanup in PHP è ancora On. Ciò significa che il tuo progresso di upload nella sessione verrà pulito il prima possibile. Quindi questo sarà un Race Condition.

Il CTF

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

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

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

Ulteriori informazioni nel writeup originale https://blog.orange.tw/2018/10/ e 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/

tip

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

Supporta HackTricks