Carga de archivos
Ejercicio 1 - Upload1
Al acceder al entorno de prueba se presenta una funcionalidad de carga de archivos. Se intenta subir un webshell básico para obtener acceso al sistema.
El sistema indica que el archivo no es una imagen. Se intercepta la solicitud con Burp Suite para modificar el tipo MIME del archivo.
El servidor detecta código PHP en el contenido, lo que sugiere filtrado por extensión. Se cambia la extensión a .jpg.
Se identifica filtrado del patrón "<?", por lo que se emplea una técnica de evasión combinando sintaxis de Java y PHP.
Tras investigar, se utiliza una cabecera mágica (magic bytes) modificada y se cambia la extensión a .phtml para superar la validación.
Una vez cargado el archivo, se conecta con China Chopper para acceder al sistema y localizar la bandera en el directorio raíz.
Ejercicio 2 - Upload
La metodología es idéntica al primer ejercicio, utilizando el mismo webshell modificado.
Ejercicio 3 - CheckIn1
Se enfrenta un desafío de carga de archivos donde se filtran extensiones y contenido.
Se convierte el webshell a formato .jpg y se prueba codificación base64 para evadir filtros de "<?".
Al recibir error de tipo MIME, se implementa una imagen maliciosa combinada con configuración del servidor.
Se descubre que el archivo .user.ini puede utilizarse para configurar auto_prepend_file y auto_append_file, permitiendo ejecutar código PHP desde imágenes.
Tras configurar correctamente el entorno, se establece conexión con el webshell para obtener la bandera.
Ejercicio 4 - Give me you photo PLZ
Se sube un webshell con extensión .jpg para evadir controles de tipo.
Se emplea un archivo .htaccess para forzar interpretación PHP de archivos .jpg.
Una vez establecida la conexión con AntSword, se encuentra la bandera pero se indica que debe buscarse en las variables de entorno.
Se ejecuta comando para volcar variables de entorno a archivo temporal y se recupera la bandera.
Ejercicio 5 - BabyUpload
Se implementa webshell con prefijo GIF89a para superar validaciones de cabeceras mágicas.
Tras múltiples intentos con .htaccess sin éxito, se modifica el tipo de archivo en la solicitud.
El archivo se interpreta correctamente como PHP tras la modificación, permitiendo conexión con China Chopper.
Ejecución de comandos
Ejercicio 1 - Ping Ping Ping
La aplicación muestra parámetro "?ip=" indicando funcionalidad de ping remoto.
Se prueba concatenación de comandos con ";ls" revelando archivos en el directorio.
Intentos de leer flag.php son bloqueados por filtros. Se utiliza $IFS$9 para evadir filtrado.
Dado que caracteres específicos están prohibidos, se construye nombre de archivo mediante concatenación de variables: ?ip=127.0.0.1;b=ag.php;a=fl;cat$IFS$9$a$b
La bandera aparece comentada en el código fuente de la página.
Inyección SSTI
Ejercicio 1 - easy_tornado
Se presentan tres enlaces con parámetros filename y filehash en MD5.
Se identifica vulnerabilidad SSTI al no encontrar puntos de entrada directos. Se descubre página de error con parámetro msg.
Pruebas con {{2*2}} muestran filtrado. Se explota handler.settings para obtener cookie_secret.
Se genera MD5 del secreto obtenido y se construye parámetro filehash para acceder a /fllllllllllllag.
Ejercicio 2 - [GYCTF2020]FlaskApp
Aplicación Flask susceptible a SSTI. Se confirma con payloads básicos retornando resultados numéricos.
Se identifica función render_template_string() en mensajes de error, confirmando uso de Jinja2.
Se construye payload complejo utilizando __class__, __bases__, __subclasses__ para acceder a funciones built-in:
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__=='catch_warnings' %}
{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}
{% endif %}
{% endfor %}
Se evaden filtros mediante concatenación de strings y se accede a archivos del sistema.
Ejercicio 3 - Text Reverse
Funcionalidad básica de inversión de texto. Se detecta filtrado de {{}}.
Se utiliza sintaxis {%print ...%} para evadir protección y confirmar SSTI.
Se explotan clases del sistema para ejecutar comandos del sistema operativo.
Se sustituye cat por more para evadir filtros y recuperar contenido de la bandera.
Ejercicio 4 - Cookie is so stable
Se identifica SSTI en manejo de cookies. Pruebas con {{7*'7'}} determinan motor Twig.
Se emplean funciones específicas de Twig para registrar callbacks y ejecutar comandos:
{{_self.env.registerUndefinedFilterCallback("exec")}}
{{_self.env.getFilter("cat /flag")}}
Otros ataques
Ejercicio 1 - [BSidesCF2019]Cookie
Solicitud de autenticación como administrador. Se logra acceso con credenciales válidas.
Se modifica campo username en cookie a "admin" para elevar privilegios y obtener bandera.
Ejercicio 2 - Xcaptcha
Sistema de verificación requiere resolver 3 operaciones matemáticas en menos de 1 segundo.
Se desarrolla script automatiazdo para extraer problemas, calcular respuestas y enviar solución:
import requests
import re
from lxml import etree
# Configuración de sesión y URL base
session = requests.Session()
url_base = 'http://target/xcaptcha'
# Extracción de problemas y cálculo automático
response = session.get(url_base)
html = etree.HTML(response.text)
problema1 = html.xpath('//label/text()')[0][:-6]
problema2 = html.xpath('//label/text()')[1][:-6]
problema3 = html.xpath('//label/text()')[2][:-6]
# Envío de respuestas calculadas
data = {
'captcha1': eval(problema1),
'captcha2': eval(problema2),
'captcha3': eval(problema3)
}
session.post(url_base, data=data)
Ejercicio 3 - Easy Java
Se explota vulnerabilidad de exposición de directorio WEB-INF en aplicaciones Java.
Se accede a WEB-INF/web.xml para mapear estructura de la aplicación.
Se descargan archivos .class y se descompilan para obtener código fuente.
La bandera se encuentra codificada en base64 dentro del código recuperado.
Ejercicio 4 - The mystery of ip
Se identifica uso de cabecera X-Forwarded-For para procesamiento en servidor.
Se inyecta comando mediante {{system("comando")}} en la cabecera.
Se ejecutan comandos del sistema para listar directorios y recuperar bandera.
Ejercicio 5 - 我有一个数据库
Se identifica phpMyAdmin versión 4.8.1 mediante escaneo de directorios.
Esta versión presenta vulnerabilidad de inclusión arbitraria de archivos.
Se construye payload con doble codificación URL para evadir validaciones:
?target=server_sql.php%253f../../../../../../flag