Después de un tiempo vuelvo a Deep Hacking con un post sobre un TIP que descubrí hace poco en Burp Suite. Esta investigación la hice a causa del siguiente tweet:
Al ver esto, no podía entender como estaba utilizando caracteres Unicode en el Repeater sin hacer uso del URL Encoding.
La fuente por defecto de Burp Suite es Courier New, si intentamos hacer CTRL + V para pegar texto en Unicode pasará lo siguiente:


No he investigado a fondo el porque de este motivo, pero lo mas probable es que en el tipo de fuente no existan los caracteres que se quieren pegar y por eso mismo salgan los caracteres en forma de cuadrados.
Pues bien, investigando muchas opciones de Burp llegué a la conclusión que esto pasa exactamente por el tipo de fuente. Mirando distintas fuentes hay muchas que aceptan algunos caracteres en Unicode y otras no, por ejemplo, la que uso actualmente es Monospaced 14pt ya que es la que mas amigable se me hace para leer (aunque depende de la persona) y la fuente que acepta los caracteres en Unicode que necesito usar cuando estoy auditando una aplicación web:


Este tipo de letra acepta todos estos caracteres:
⓪①②③④⑤⑥⑦⑧⑨ |


Pero que al momento de introducir una dirección IP en formato Unicode se logre bypasear los filtros implementados y se consiga acceder a una IP de la red interna:


Como se puede ver en la captura, el servidor hace el normalise del Unicode y, dado que no hay filtros que restrinjan una dirección IP en el formato Unicode el servidor funcionará como si se solicitara un URL público (que es para lo que está configurada la web). Si se prueba por ejemplo a introducir google.com funcionará correctamente.
La configuración de la letra en la última versión de Burp se puede encontrar en Settings:


La web donde he realizado las pruebas corresponde a una personalizada que he montado con el siguiente script en python:
from flask import Flask, request, Response
import requests
from urllib.parse import urlparse
app = Flask(__name__)
def is_internal(ip):
if ip.startswith('127.0.0.1') or ip.startswith('192.168.') or ip.startswith('10.') or (ip.startswith('172.') and int(ip.split('.')[1]) in range(16, 32)):
return True
return False
@app.route('/request', methods=['POST'])
def render_url():
data = request.get_json()
if data is None or 'url' not in data:
return 'Bad request', 400
url = data['url']
url_parsed = urlparse(url)
if url_parsed.hostname is None:
return 'Bad request', 400
unicode_to_ascii = {
'①': '1', '②': '2', '③': '3', '④': '4', '⑤': '5',
'⑥': '6', '⑦': '7', '⑧': '8', '⑨': '9', '⓪': '0'
}
ip = url_parsed.hostname
for unicode, ascii in unicode_to_ascii.items():
ip = ip.replace(unicode, ascii)
if is_internal(ip):
return 'Internal IPs are not allowed', 403
ascii_url = url
for unicode, ascii in unicode_to_ascii.items():
ascii_url = ascii_url.replace(unicode, ascii)
ascii_url = ascii_url.replace('。', '.')
try:
# No es necesario hacer la solicitud aquí
# res = requests.get(ascii_url)
html = f"""<!DOCTYPE html>
<html>
<body>
<iframe src="{ascii_url}" width="100%" height="100%"></iframe>
</body>
</html>"""
return Response(html, mimetype='text/html')
except requests.exceptions.RequestException as e:
return str(e), 500
if __name__ == '__main__':
app.run(host='0.0.0.0')
Aunque se pueden generar caracteres Unicode en esta web. También podemos usar la siguiente extensión de Burp Suite que he hecho:
Con esta extensión podemos realizar la generación de caracteres Unicode de forma rápida desde Burp Suite.
¡Buen post! el unicode es muy potente a la hora de hacer SSRF, yo tambien vi el tweet que mencionaste al principio y quede flipando.
¡Buen post! el unicode es muy potente a la hora de hacer SSRF, yo tambien vi el tweet que mencionaste al principio y quede flipando…