Insecure Authorization Restriction
Restricción de Autorización Insegura
Descripción
La restricción de autorización insegura se refiere a las debilidades en las restricciones del lado del servidor que pueden explotarse mediante técnicas de manipulación de solicitudes HTTP. Esta vulnerabilidad permite a los atacantes eludir los controles de acceso, lo que conduce a un acceso no autorizado a los recursos, la escalada de privilegios y permite que usuarios no autorizados recuperen, creen, actualicen o eliminen datos confidenciales.
Al apuntar a las restricciones de autorización inseguras en un servidor web, por ejemplo, se aplicarían estas técnicas:
- Fuzzing del método de la solicitud HTTP: Probar métodos HTTP no válidos, mal formados o inesperados en el servidor.
- Fuzzing de la ruta de la solicitud HTTP: Manipular la ruta de la solicitud HTTP deformándola, agregándole o eliminándole elementos.
- Fuzzing del parámetro de consulta de la solicitud HTTP: Agregar, eliminar o cambiar los parámetros de consulta originales.
- Fuzzing del encabezado de la solicitud HTTP: Agregar encabezados conocidos, eliminar encabezados o agregar encabezados de proxy.
Todas estas técnicas se enfocan en defectos, vulnerabilidades o errores en la lógica de un servidor.
import requests
response = requests.get("http://www.some-url.com/unauthorized_path")
'''if we have some unauthorized path that gets us a 403 code,
we can try something like adding a query parameter like "debug=true" to see if we can
trick the server by exploiting some mistake.'''
response = requests.get("http://www.some-url.com/unauthorized_path?debug=true")
'''Might get us the resource we want''
Recomendación
Las organizaciones deben implementar controles de acceso adecuados y aplicar una validación estricta de las solicitudes HTTP para mitigar el riesgo de vulnerabilidades HTTP por restricciones de autorización inseguras. Esto implica tener una lógica sólida del lado del servidor para administrar reglas sobre los métodos HTTP, los encabezados, los parámetros de consulta y las rutas que se reciben.
A continuación se presentan algunas recomendaciones:
- Limitar los métodos HTTP: Restringir qué métodos HTTP pueden acceder a cada una de sus vistas o recursos.
- Sanitizar los parámetros de consulta: Sanitizar los parámetros de consulta de cada solicitud y asegurarse de que solo un conjunto limitado de parámetros pueda afectar la lógica del servidor.
- Limitar los encabezados: Restringir qué encabezados pueden afectar su código. Utilice reglas estrictas sobre qué combinaciones de métodos y encabezados pueden realizar cambios del lado del servidor, y asegúrese de que su lógica no dependa de valores de encabezado que se puedan encontrar fácilmente en Internet (como el User-Agent de Google).
- Análisis de rutas robusto: Implementar un análisis de rutas robusto con reglas estrictas y rechazar las solicitudes que no se ajusten a sus estándares.
python
# Permitir solo los métodos GET y POST para esta ruta
@app.route('/limiting_method_usage', methods=['GET', 'POST'])
def limiting_method_usage():
if request.method == 'GET':
return jsonify({"message": "This is a GET request"})
elif request.method == 'POST':
data = request.json
return jsonify({"message": "This is a POST request", "data": data})
# Usar solo los encabezados que espera
@app.route('/limiting_header_values')
def limiting_header_values():
expected_header = request.headers.get('Expected-Header')
### Lógica dependiendo del encabezado esperado
Enlaces
Estándares
- OWASP_ASVS_L1:
- V4_1_1
- V4_1_2
- V4_1_3
- V4_1_5
- V5_1_1
- V5_1_2
- V5_1_3
- V5_1_4
- V5_2_2
- OWASP_ASVS_L2:
- V4_1_1
- V4_1_2
- V4_1_3
- V4_1_5
- V5_1_1
- V5_1_2
- V5_1_3
- V5_1_4
- V5_2_2
- OWASP_ASVS_L3:
- V4_1_1
- V4_1_2
- V4_1_3
- V4_1_5
- V5_1_1
- V5_1_2
- V5_1_3
- V5_1_4
- V5_2_2
- PCI_STANDARDS:
- REQ_2_2
- HIPAA_CONTROLS:
- SECURITY221
- SECURITY212
- SECURITY213