Neonify
2 minutos de lectura
Tenemos una página web que nos permite introducir un texto y nos lo muestra en formato de neón:
Análisis del código fuente
En el código fuente tenemos una aplicación muy simple hecha en Ruby. Este es el archivo app/controllers/neon.rb
:
class NeonControllers < Sinatra::Base
configure do
set :views, "app/views"
set :public_dir, "public"
end
get '/' do
@neon = "Glow With The Flow"
erb :'index'
end
post '/' do
if params[:neon] =~ /^[0-9a-z ]+$/i
@neon = ERB.new(params[:neon]).result(binding)
else
@neon = "Malicious Input Detected"
end
erb :'index'
end
end
El servidor aplica una validación al texto que queremos convertir en neón. Para ello, utiliza una expresión regular (RegEx) que solamente admite números, letras y espacios (/^[0-9a-z ]+$/i
).
El texto introducido en el parámetro neon
(si pasa la validación), se renderiza con ERB
(un motor de plantillas de Ruby).
Como no hay más código interesante en el servidor, es evidente que tenemos que realizar un ataque de Server-Side Template Injection (SSTI), pero la expresión regular nos impide añadir caracteres especiales, ¿no? Aquí lo vemos con Burp Suite:
Inyección CRLF
Si investigamos un poco, veremos que la expresión regular nos la podemos saltar fácilmente añadiendo un salto de línea (codificado como %0a
en codificación de URL). Esto se conoce como inyección de CRLF (Carriage Return / Line Feed). Vamos a probarlo:
Genial, no nos ha bloqueado el texto. Ahora podemos mirar un payload de SSTI para Ruby en PayloadsAllTheThings y conseguir la flag (que está en /app/flag.txt
). Se puede utilizar el siguiente payload:
File.open('/app/flag.txt').read
Flag
Y vemos que funciona y conseguimos la flag (HTB{r3pl4c3m3n7_s3cur1ty}
):