Un API es un contrato entre un autor de llamada y un receptor de llamada. Las formas de abuso de API más comunes los produce el autor de llamada cuando no consigue atender su fin de este contrato. Por ejemplo, si un programa no consigue llamar chdir() después de llamar chroot(), se viola el contrato que especifica cómo cambiar el directorio de origen activo de una forma segura. Otro buen ejemplo de un abuso de manual es esperar que el receptor devuelva una información de DNS de confianza al autor de llamada. En este caso, el autor de llamada abusa el API del receptor haciendo determinadas suposiciones sobre su comportamiento (que el valor de retorno se puede usar con fines de autenticación). También se puede violar el contrato entre el autor de llamada y el receptor desde el otro lado. Por ejemplo, si un codificador envía SecureRandom y devuelve un valor no aleatorio, se viola el contrato.
finalize()
solo debe ser llamado por el JVM después de que el objeto haya sido recolectado.finalize()
de objeto sea llamado desde fuera del finalizador, se trata de una mala idea. Por ejemplo, llamar finalize()
explícitamente indica que finalize()
se llamará más de una vez: la primera vez será la llamada explícita y la última vez será la llamada que se hace después de que el objeto sea recolectado.finalize()
explícitamente:
// time to clean up
widget.finalize();
dangerouslySetInnerHTML
El atributo se establece como HTML desde el código innecesariamente.dangerouslySetInnerHTML
en React reemplaza el uso de innerHTML en el DOM del navegador, pero se ha cambiado el nombre de la API para transmitir los peligros potenciales de su uso. En general, configurar HTML desde el código es arriesgado porque es fácil exponer inadvertidamente a los usuarios a un ataque de Cross-Site Scripting (XSS).dangerouslySetInnerHTML
:
function MyComponent(data) {
return (
<div
dangerouslySetInnerHTML={{__html: data.innerHTML}}
/>
);
}
AUTHID CURRENT_USER
, los identificadores se solucionan en primer lugar según el esquema del usuario actual. Esto puede provocar un comportamiento inesperado si el definidor del código no expresa explícitamente a qué esquema pertenece un identificador.SYS.PERMISSIONS
y no podrá modificar los permisos definidos.
CREATE or REPLACE FUNCTION check_permissions(
p_name IN VARCHAR2, p_action IN VARCHAR2)
RETURN BOOLEAN
AUTHID CURRENT_USER
IS
r_count NUMBER;
perm BOOLEAN := FALSE;
BEGIN
SELECT count(*) INTO r_count FROM PERMISSIONS
WHERE name = p_name AND action = p_action;
IF r_count > 0 THEN
perm := TRUE;
END IF;
RETURN perm;
END check_permissions
check_permissions
define una tabla PERMISSIONS
en su esquema, la base de datos decidirá que el identificador haga referencia a la tabla local. El usuario podría tener acceso de escritura a la nueva tabla y podría modificarla para obtener los permisos que de otro modo no tendría.org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
y org.apache.struts2.interceptor.RequestAware
. Con el fin de incorporar cualquiera de estos mapas de datos en el código de Actions, los desarrolladores deben implementar el marco que se especifica en la interfaz (por ejemplo: setSession
para la interfaz SessionAware
):
public class VulnerableAction extends ActionSupport implements SessionAware {
protected Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
SessionAware
, RequestAware
, ApplicationAware
.
http://server/VulnerableAction?session.roles=admin
execute()
de la acción.execute()
. El carácter !
(bang) o el prefijo method:
se pueden utilizar en la URL de la acción para invocar a cualquier método público de la acción si se ha habilitado la "invocación de método dinámico". Los desarrolladores que no conocen la existencia de esta función pueden exponer a los atacantes la lógica empresarial interna de forma involuntaria.http://server/app/recoverpassword!getPassword.action
org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
y org.apache.struts2.interceptor.RequestAware
. Con el fin de incorporar cualquiera de estos mapas de datos en el código de Actions, los desarrolladores deben implementar el marco que se especifica en la interfaz (por ejemplo: setSession
para la interfaz SessionAware
):
public class VulnerableAction extends ActionSupport implements SessionAware {
protected Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
SessionAware
, RequestAware
, ApplicationAware
.
http://server/VulnerableAction?session.roles=admin