BlogEngine.Net Hacking

by Hirashiki 14. May 2008 22:35

 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 Cry.

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 http://algumsite.com/js.axd?path=/app_data/users.xml, você consegue visualizar o conteúdo do arquivo, e como o arquivo XML não está criptografado, você consegue acesso admin ao site.

 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 (http://algumsite.com/js.axd?path=http://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)

Tags: , , ,

BlogEngine.NET

Modificando o AdsenseInjector

by Hirashiki 9. May 2008 01:13

Hoje resolvi dar uma olhada nas extensões do BlogEngine.net. Eu não faço a mínima idéia (ainda) de como funciona o "sistema", mas já deu pra ter uma idéia de como o negócio aqui é poderoso!!!

Instalei a extensão  AdsenseInjector. Se é que posso falar que instalei, pois foi só colocar um arquivo em uma pasta e já estava funcionando.

Esta extensão gerencia e adiciona o script do Google AdSense nas páginas.Porém, percebi que os anúncios só apareciam nosPost e nas páginas personalizada, nunca na página inicial.

 É aí que eu entro!!! Dei uma olhada no código do arquivo e achei isso aqui:

    ...
    /// <summary>
    /// Serving AdSense code in post and page
    /// </summary>
    private static void Serving(object sender, ServingEventArgs e)
    {
        if (_settings.Parameters.Count > 0)
        {
            if (e.Location == ServingLocation.SinglePage || e.Location == ServingLocation.SinglePost)
            {
                DataTable table = _settings.GetDataTable();
                Int32 count = 0;
                // Post or page ?
                bool where = false;
    ...

 

 Está aí a causa!! Substitui a linha em negrito por:

if (e.Location == ServingLocation.SinglePage || e.Location == ServingLocation.SinglePost || e.Location == ServingLocation.PostList)

 

 E tudo funcionou como esperava!! O resultado está na Home.

Tags: , ,

BlogEngine.NET | Programação

Calendário

<<  September 2010  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

RecentPosts