Recientemente he estado usando EJECUTAR COMO INICIAR SESIÓN para verificar si cierta persona podría o no usar una función de tabla en una de nuestras bases de datos. Las pruebas mostraron que podía pero él reportó repetidamente el fracaso.
La persona usa el inicio de sesión 'WEB' para conectarse a la base de datos y tiene el usuario 'WEB' en esa base de datos asociado con el inicio de sesión 'WEB', así que probé los siguientes scripts:
-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
y
-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
La primera parte estuvo bien con el resultado de:
WEB | WEB | WEB | WEB
Pero el segundo resultado fue un poco confuso:
dbo | WEB | WEB | WEB
¿Cuál es la diferencia entre EJECUTAR COMO USUARIO y EJECUTAR COMO INICIAR SESIÓN que hace que el segundo falle? Además, por supuesto, el primero es el nivel de la base de datos y el segundo es la suplantación del nivel del servidor, de lo que soy consciente y no explica la situación aquí.
fuente
Respuestas:
Siempre se asigna un miembro del
sysadmin
grupo , incluso si tiene un usuario explícito en la base de datos. Por lo tanto, parece que el inicio de sesión es miembro , por lo tanto , regresa correctamente en el segundo caso.dbo
WEB
sysadmin
USER_NAME()
dbo
fuente
sysadmin
miembro, por lo que la aplicación de informes es un administrador de sistemas de facto. Es decir. ia un posible vector de ataque de elevación de privilegios, puede ser utilizado por un pirata informático o, más probablemente, por su personal.WEB
yWEB
se eliminó desysadmin
entonces, la puerta está cerrada. Pero vale la pena comprobarlo.