LFI2RCE a través de PHP_SESSION_UPLOAD_PROGRESS
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Información Básica
Si encontraste una Local File Inclusion incluso si no tienes una sesión y session.auto_start
está Desactivado
. Si session.upload_progress.enabled
está Activado
y proporcionas el PHP_SESSION_UPLOAD_PROGRESS
en datos multipart POST, PHP habilitará la sesión para ti.
$ 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 que con PHP_SESSION_UPLOAD_PROGRESS
puedes controlar datos dentro de la sesión, así que si incluyes tu archivo de sesión puedes incluir una parte que controlas (un php shellcode por ejemplo).
note
Aunque la mayoría de los tutoriales en Internet te recomiendan establecer session.upload_progress.cleanup
en Off
para fines de depuración. El valor predeterminado de session.upload_progress.cleanup
en PHP sigue siendo On
. Esto significa que tu progreso de carga en la sesión se limpiará lo antes posible. Así que esto será Race Condition.
El CTF
En el CTF original donde se comenta esta técnica, no era suficiente explotar la Race Condition, sino que el contenido cargado también necesitaba comenzar con la cadena @<?php
.
Debido a la configuración predeterminada de session.upload_progress.prefix
, nuestro archivo de SESIÓN comenzará con un prefijo molesto upload_progress_
Tal como: upload_progress_controlledcontentbyattacker
El truco para eliminar el prefijo inicial fue base64encode el payload 3 veces y luego decodificarlo a través de los filtros convert.base64-decode
, esto se debe a que cuando decodificas en base64 PHP eliminará los caracteres extraños, así que después de 3 veces solo el payload enviado por el atacante permanecerá (y luego el atacante puede controlar la parte inicial).
Más información en el escrito original https://blog.orange.tw/2018/10/ y exploit final https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py
Otro escrito en https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.