5.1 KiB
LFI2RCE a través de PHP_SESSION_UPLOAD_PROGRESS
{% hint style="success" %}
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.
Información Básica
Si encuentras una Inclusión de Archivos Locales incluso si no tienes una sesión y session.auto_start
está en Off
. Si session.upload_progress.enabled
está en On
y proporcionas el PHP_SESSION_UPLOAD_PROGRESS
en los datos de POST multipart, PHP habilitará la sesión por 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
Ten en cuenta que con PHP_SESSION_UPLOAD_PROGRESS
puedes controlar los datos dentro de la sesión, por lo que si incluyes tu archivo de sesión puedes incluir una parte que controles (por ejemplo, un shellcode php).
{% hint style="info" %}
Aunque la mayoría de los tutoriales en Internet recomiendan establecer session.upload_progress.cleanup
en Off
con 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. Por lo tanto, esto será una Condición de Carrera.
{% endhint %}
El CTF
En el CTF original donde se comenta esta técnica, no fue suficiente explotar la Condición de Carrera, 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 molesto prefijo upload_progress_
como por ejemplo: upload_progress_controlledcontentbyattacker
El truco para eliminar el prefijo inicial fue codificar en base64 la carga útil 3 veces y luego decodificarla mediante filtros convert.base64-decode
, esto se debe a que al decodificar en base64 PHP eliminará los caracteres extraños, por lo que después de 3 veces solo la carga útil enviada por el atacante permanecerá (y luego el atacante puede controlar la parte inicial).
Más información en el informe original https://blog.orange.tw/2018/10/ y en la explotación final https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py
Otro informe en https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/
{% hint style="success" %}
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- ¡Consulta los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.