Uma API é um contrato entre quem chama e o que se chama. As formas mais comuns de abuso de API ocorrem quando o responsável pela chamada não respeita sua parte do contrato. Por exemplo, se um programa não chama chdir() após chamar chroot(), ele viola o contrato que especifica como alterar o diretório raiz ativo de forma segura. Outro bom exemplo de abuso de biblioteca é esperar que o elemento chamado retorne informações confiáveis de DNS ao responsável pela chamada. Nesse caso, o responsável pela chamada abusa a API do elemento chamado ao fazer certas suposições sobre seu comportamento (isto é, que o valor de retorno pode ser usado para fins de autenticação). A outra parte também pode violar o contrato entre quem chama e o que se chama. Por exemplo, se um programador definir SecureRandom como subclasse e retornar um valor não aleatório, o contrato será violado.
finalize()
só deve ser chamado pela JVM após o objeto ter sido coletado como lixo.finalize()
de um objeto seja chamado de fora do finalizador, fazer isso é normalmente uma má ideia. Por exemplo, chamar finalize()
explicitamente significa que finalize()
será chamado mais de uma vez: a primeira vez será a chamada explícita e a última vez será a chamada que é feita depois que o objeto é coletado como lixo.finalize()
explicitamente:
// time to clean up
widget.finalize();
dangerouslySetInnerHTML
O atributo é definido como HTML do código desnecessariamente.dangerouslySetInnerHTML
no React substitui o uso de innerHTML no DOM do navegador, mas a API foi renomeada para transmitir os possíveis perigos de usá-lo. Em geral, definir o HTML com base no código é arriscado porque é fácil expor inadvertidamente seus usuários a um ataque de script entre sites (XSS).dangerouslySetInnerHTML
:
function MyComponent(data) {
return (
<div
dangerouslySetInnerHTML={{__html: data.innerHTML}}
/>
);
}
AUTHID CURRENT_USER
, os identificadores são primeiro resolvidos de acordo com o esquema atual do usuário. Isso pode causar um comportamento inesperado se o definidor do código não disser explicitamente a qual esquema um identificador pertence.SYS.PERMISSIONS
e não poderá modificar as permissões definidas.
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
definir uma tabela de PERMISSIONS
no esquema dele, o banco de dados resolverá o identificador para consultar a tabela local. O usuário teria acesso de gravação à nova tabela e poderia modificá-la para obter permissões que não teria de outra maneira.org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
e org.apache.struts2.interceptor.RequestAware
. Para que qualquer um desses mapas de dados seja injetado em seus códigos de Ações, os desenvolvedores precisam implementar o setter especificado na interface (por exemplo: setSession
para a Interface 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
e ApplicationAware
.
http://server/VulnerableAction?session.roles=admin
execute()
dessa Ação.execute()
. O caractere !
(exclamação) ou o prefixo method:
pode ser usado na URL da Ação para invocar qualquer método público nessa Ação quando a “Invocação de método dinâmico" está habilitada. Os desenvolvedores que não estiverem cientes desse recurso poderão inadvertidamente expor a lógica de negócios interna aos invasores.http://server/app/recoverpassword!getPassword.action
org.apache.struts2.interceptor.ApplicationtAware
, org.apache.struts2.interceptor.SessionAware
e org.apache.struts2.interceptor.RequestAware
. Para que qualquer um desses mapas de dados seja injetado em seus códigos de Ações, os desenvolvedores precisam implementar o setter especificado na interface (por exemplo: setSession
para a Interface 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
e ApplicationAware
.
http://server/VulnerableAction?session.roles=admin