LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS
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.
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/
Last updated