Já faz um mês que foi publicado este post, porém encontrei muitos sites (inclusive o meu) com este problema. Aparentemente eu corrigi. Se meu site ficar fora do ar, é sinal de que minha solução não deu certo
.
A explicação do js.axd
O problema na versão do BlogEngine.net 1.3.1.0 está na codificação do HttpHandler js.axd.
Em vez de você chamar um javascript como normalmente acontece em uma página HTML:
<script type="text/javascript" src="codigo_javascript.js"></script>
Através do js.axd você chama assim:
<script type="text/javascript" src="/js.axd?path=codigo_javascript.js">
Internamente, este Handler lê o arquivo codigo_javascript.js e insere dinamicamente no HTML. Funciona tanto para arquivos JavaScript internos, como também para externos. como por exemplo:
<script type="text/javascript" src="/js.axd?path=http://www.algumsite.com/codigo_javascript.js">
A falha na segurança
Na versão 1.3.0 do BlogEngine.net, podemos utilizar o js.axd para ter acesso a qualquer arquivo no site. Um dos arquivos que você pode visualizar através desta falha é o users.xml. Ao digitar no browser
Em outro caso, pode-se ter acesso ao arquivo Web.Config onde contém, por exemplo, a senha de acesso ao banco de dados.
Diante deste problema, a equipe do BlogEngine.net divulgou um patch de correção e uma versão full do Blog, chamada de BlogEngine.net versão 1.3.1.0.
Mesmo com esta correção, achei um post do blog ha.ckers.org (http://ha.ckers.org/blog/20080412/blogenginenet-intranet-hacking/) que descreve 2 modos de se visualizar páginas de uma intranet onde existe o BlogEngine.net instalado.
A primeira é usando o js.axd para chamar as páginas como localhost (
O segundo método é usando uma inserção de código JavaScript na página Search.aspx (search.aspx?q=%22%3E%3Cscript%3Ealert(%22XSS%22)%3C/script%3E).
Nos comentários, foi comprovado que o patch não protege totalmente os arquivos onde está hospedado o BlogEngine.net. Você ainda consegue visualizar arquivos importantes, como o machine.config.
A "Solução"
Existem 2 lugares onde deve-se alterar o código e recompilar para
corrigir o problema. O primeiro arquivo é o JavaScriptHandler.cs:
private static string RetrieveLocalScript(string file)
{
if (!file.EndsWith(".js", StringComparison.OrdinalIgnoreCase))
{
throw new System.Security.SecurityException("No access");
}
...
O segundo lugar é no arquivo search.aspx. Localize o trecho:
Request.QueryString["q"]
E substitua por:
Request.QueryString["q"].Replace("<", "").Replace(">", "")
Aparentemente, estas duas soluções bloqueiam os problemas descritos
no site ha.ckers.org. Não é 100% de certeza que funcione, mas já dá pra
proteger mais o seu site.
Você pode realizar o download do ZIP contendo os 2 arquivos necessários para solucionar o problema.
Correcao_BlogEngine_Hacking.zip (3,27 kb)