Quando estamos executando um projeto de revisão de código, sempre que encontramos algum trecho de código suspeito, investimos um certo tempo para ter a certeza que aquele ponto é ou não uma vulnerabilidade.
Em um destes projetos, nos deparamos com um trecho de código similar ao abaixo:
Arquivo: arquivo_teste.php
—
1 <html> 2 <head> 3 <style> 4 <?php echo strip_tags($_GET['style']); ?> 5 </style> 6 </head> 7 <body> 8 </body> 9 </html>
—
Neste caso, a chamada a função strip_tags() não será suficiente para evitar que ataques de Cross-Site Scripting sejam realizados com sucesso. Através de códigos CSS, que não precisam das tags que são removidas pela função strip_tags(), é possível inserir códigos Javascript que serão interpretados por alguns browsers. É o caso do método expression()[1] para o Internet Explorer (IE) e a propriedade CSS -moz-binding para o Gecko, utilizado pelo Firefox. Aqui iremos falar apenas sobre o caso do IE. O método ‘expression()‘ funciona por padrão no IE versão 5 até 7 e 8 ou superior em modo compatibilidade [2].
Com base nisso, utilizei o seguinte payload para chamar o método alert() e imprimir a mensagem ‘CODIGO_MALICIOSO_EXECUTADO’ no IE versão 10 executado em modo de compatibilidade.
body{
left:expression(alert(String.fromCharCode(0×43,0×4f,0×44,0×49,0×47,0×4f,0×5f,0×4d,0×41,0×4c,0×49,0×43,0×49,0×4f,0×53,
0×4f,0×5f,0×45,0×58,0×45,0×43,0×55,0×54,0×41,0×44,0×4f)));
}
Foi necessário usar o método ‘.fromCharCode’ do objeto ‘String’ porque no ambiente de teste, a opção magic_quotes do PHP estava habilitada, evitando a inserção do carácter aspas-simples.
Em [3] também há outros exemplos, inclusive a utilização do -moz-binding para execução de códigos Javascript.
[1] – http://msdn.microsoft.com/en-us/library/ms537634.aspx
[2] – http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx
[3] – https://code.google.com/p/google-caja/wiki/CssAllowsArbitraryCodeExecution