REFERENCIA DIRECTA INSEGURA A OBJETOS
DEFINICION:
Una referencia directa a objetos ("direct
object reference") ocurre cuando un
programador expone una referencia
hacia un objeto interno de la aplicación,
tales como un fichero, directorio, registro
de base de datos, o una clave tal como
una URL o un parámetro de formulario
Web.
Un atacante podría manipular este tipo
de referencias en la aplicación para
acceder a otros objetos sin autorización,
a menos que se aplique un control de
accesos como medida de prevención.
ENTORNOS AFECTADOS:
Todos los entornos de desarrollo de
aplicaciones de Web son vulnerables
presentando referencias a objetos
internos de la aplicación.
VULNERABILIDAD
Muchas aplicaciones presentan a los
usuarios referencias a objetos internos.
Un atacante podría manipular los
parámetros de entrada a la aplicación
cambiando estas referencias, saltándose
de esta manera un control de accesos
incorrectamente desarrollado
Con frecuencia, estas referencias
apuntan a sistemas de ficheros y bases
de datos, si bien cualquier otro elemento
de la aplicación podría ser vulnerable por
un problema de esta categoría.
EJEMPLO:
En el ejemplo que se presenta a
continuación, un atacante puede cambiar
el parámetro "cartID" para obtener la
información asociada a cualquier "carrito
de la compra" de la aplicación.
int cartID = Integer.parseInt( request.getParameter( "cartID" ) ); String query =
"SELECT * FROM table WHERE cartID=" + cartID;
PROTECCION:
La mejor protección es evitar presentar al
usuario cualquier referencia directa a un
objeto, mediante el uso de un índice, un
mapa de referencias indirectas, o
cualquier otro método que sea fácil de
verificar. Si es necesario utilizar una
referencia directa, se deberá comprobar
que el usuario está autorizado a usarla
antes de hacerlo.
http://www.example.com/application?file=1
En caso de que sea necesario presentar
referencias a elementos de base de
datos, hay que asegurarse de que las
sentencias SQL y otros mecanismos de
acceso a base de datos sólo permiten
que se obtengan los registros
autorizados:
int cartID = Integer.parseInt( request.getParameter( "cartID" ) );
User user = (User)request.getSession().getAttribute( "user" );
String query = "SELECT * FROM table WHERE
cartID=" + cartID + " AND userID=" + user.getID();
EJEMPLO DE UN ATAQUE
Descargar

Diapositiva 1 - redes2011liliana