none
Falha de segurança com pagemethods do javascript RRS feed

  • Pergunta

  • Pessoal, eu estou usando muito o pagemethods nas minhas páginas, ai me deparei com um grande problema.

    Eu tenho esse codigo 

    function Delete() {
                PageMethods.DeleteReg('13', DeleteSuccess, DeleteFail);
            }
            function DeleteSuccess(res) {
                if (res == 'ok') {
                    alert('Notícia deletada com sucesso!');
                } else { alert(res); }
            }
            function DeleteFail(res, destCtrl) {
                alert(res.get_message());
            }
    

    Entao, executei minha página no visual studio, fui no "Especionar elemento" do google chrome e IE, fui em console e digitei o seguinte

     PageMethods.DeleteReg('13', DeleteSuccess, DeleteFail);

    Executei o código, e simplismente o site executou a função normalmente e deleto o registro com a ID '13' do banco de dados!!! como isso? isso nao pode acontecer se nao qualquer um poderá fazer oque quizer com o site, como eu corrijo isso?


    Thiii =)

    segunda-feira, 30 de julho de 2012 13:53

Respostas

  • Seu site requer autenticação para realizar esta ação?

    Se sim:

    O quando o fez através do IE já estava logado no site? Experimente fazer uma chamada sem efetuar o login.


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 14:27
  • Leia isto como complemento:

    http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           


    segunda-feira, 30 de julho de 2012 14:28
  • Thiago,

    Sua função retorna JSON né, esse é o problema. O código [ScriptMethod(UseHttpGet = true)] faz o PageMethod aceitar chamada usando o Verbo GET, esse é o problema.

    Além do post que o Eduardo recomendou, existe um outro com uma ótima explicação a respeito do problema:

    http://haacked.com/archive/2009/06/25/json-hijacking.aspx

    Veja se te ajuda.

    Outra coisa se você estiver logado no sistema, não adianta o método será executado de qualquer maneira. Agora se você não estiver logado, lembre-se que usando PageMethods o código do Page_Load não é executado, portanto, você deve fazer a verificação de usuário logado em todo PageMethod.

    Abs!


    Alexsandre Rodrigues de Almeida - MCTS .NET Framework - Web Applications
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 15:16
    • Não Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 15:17
    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 15:08
  • Thiago,

    Em toda a aplicação web, o usuário terá acesso ao código javascript. Por isso você não deve ser basear somente nas validações e restrições feitas no cliente, eles servem para questões de usabilidade, e performance, evitando de ir ao servidor desnecessariamente.

    Mas você deve sempre refazer no servidor todas as regras de validações e restrições, só assim conseguirá manter o controle de tudo.

    Não tem o que fazer.

    No seu caso, você deve garantir que o método só poderá ser executado por um usuário logado e que tenha permissão de executar essa ação.

    Como disse, você está usando PageMethods e ao usar métodos desse tipo, o page_load da página que o método está contido não é executado. Portanto você deve na execução desse método, verificar se o usuário está logado, e se ele tem permissão de execução da referida ação.

    Abs!


    Alexsandre Rodrigues de Almeida - MCTS .NET Framework - Web Applications
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 15:33
  • Thiago,

    Ai você já entra num aspecto de controle de acesso.

    Se qualquer um pode se cadastrar, mas não é qualquer um que pode executar uma ação (ex. deletar um registro) você precisa validar se o usuário pode realizar tal ação, existem N maneiras de se fazer isso.

    Se precisar de ajuda poste ai.


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 15:46
  • Se vc usar forms isso já pode barrar da uma olhada

    http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 17:27
    Moderador
  • Leia isto como complemento:

    http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           



    Isso mesmo Seilor, rsss...

    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:04
    segunda-feira, 30 de julho de 2012 17:56
  • Thiago,

    Estando autenticado ele poderá executar o método, estando em PageMethods ou não. Lembre isso é uma aplicação web, é facil fazer chamadas ao servidor. Independente da tecnologia usada, há meios de burlar. Por isso é necessário a validação no server.

    Se por acaso, só alguns usuários podem chamar esse método, você deve ter alguma implementação de perfils/papeis em seu sistema. Assim além de estar logado no sistema, o usuário precisará ter um papel e/ou perfil específico para poder chamar esse método. E no servidor além de verificar o usuário logado, você irá verificar se ele tem esse perfil/papel. Entendeu?

    Abs!


    Alexsandre Rodrigues de Almeida - MCTS .NET Framework - Web Applications
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:04
    segunda-feira, 30 de julho de 2012 22:21
  • Thiago,

    Se você usar o panelUpdate do AjaxControlToolkit, no fundo ele também usa Javascript. Ele apenas faz al coisas de forma mais automática. Portanto você não tem muito para onde correr.

    Abs!


    Alexsandre Rodrigues de Almeida - MCTS .NET Framework - Web Applications
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:04
    segunda-feira, 30 de julho de 2012 23:01
  • Prezado,

    Para aumentar a sua segurança além da validação do usuário feita no server, você deve pensar mais além.
    Comprima seu javascript, logo em seguida use um ofuscamento de código e por fim para dificultar um pouco mais faça uma segunda criptografia, assim ficará quase impossível de alguém burlar o seu código mas lembre-se isto não o exime de fazer as validações necessárias no server.

    Obs. Existem várias ferramentas online de ofuscação de código e criptografia de uma olhada como funciona e faça a sua própria ferramenta, para ofuscar e criar a criptografia, ou apenas para criar a criptografia. Faça também uma backup dos seus Js para você usar em ambiente de dev sem ofuscar e criptografar.

    Código Original: Alert("segurança");

    ###################Ofuscado

    eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0("1ç2");',3,3,'alert|seguran|a'.split('|'),0,{}))

    ###################Criptografado

    eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('n(7(4,a,c,k,e,6){e=d;f(!\'\'.8(/^/,d)){9(c--)6[c]=k[c]||c;k=[7(e){5 6[e]}];e=7(){5\'\\\\i+\'};c=1};9(c--)f(k[c])4=4.8(h m(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c]);5 4}(\'0("1ç2");\',3,3,\'o|l|a\'.j(\'|\'),0,{}))',25,25,'||||p|return|r|function|replace|while||||String||if||new|w|split||seguran|RegExp|eval|alert'.split('|'),0,{}))


    k3rn3lp4n1c

    • Marcado como Resposta Thiago de bona quarta-feira, 1 de agosto de 2012 14:15
    quarta-feira, 1 de agosto de 2012 14:10

Todas as Respostas

  • Seu site requer autenticação para realizar esta ação?

    Se sim:

    O quando o fez através do IE já estava logado no site? Experimente fazer uma chamada sem efetuar o login.


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 14:27
  • Leia isto como complemento:

    http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           


    segunda-feira, 30 de julho de 2012 14:28
  • Sim, na página manager.aspx, se o usuario nao estiver conectado, ele redireciona para o login, entao resumindo a página manager.aspx que contem os codigos do page methods que tava dando problemas só carrega se estiver logado, mas isso ainda é um problema pra mim, pois eu estava pensando em fazer uma página com muitos pagemethods, e qualquer hackerzinho inútil irá consegue hackear assim

    Thiii =)

    segunda-feira, 30 de julho de 2012 14:30
  • Amigo usei o método que vc mando no link [ScriptMethod(UseHttpGet = true)]  mas msm assim eu executo o comando pelo console do chrome e o comando executa normalmente e deleta o registro do banco, nao teria algum outro método?

    Thiii =)

    segunda-feira, 30 de julho de 2012 14:59
  • Thiago,

    Sua função retorna JSON né, esse é o problema. O código [ScriptMethod(UseHttpGet = true)] faz o PageMethod aceitar chamada usando o Verbo GET, esse é o problema.

    Além do post que o Eduardo recomendou, existe um outro com uma ótima explicação a respeito do problema:

    http://haacked.com/archive/2009/06/25/json-hijacking.aspx

    Veja se te ajuda.

    Outra coisa se você estiver logado no sistema, não adianta o método será executado de qualquer maneira. Agora se você não estiver logado, lembre-se que usando PageMethods o código do Page_Load não é executado, portanto, você deve fazer a verificação de usuário logado em todo PageMethod.

    Abs!


    Alexsandre Rodrigues de Almeida - MCTS .NET Framework - Web Applications
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 15:16
    • Não Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 15:17
    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 15:08
  • Mas se algum usuario com intenção de visualizar o codigo fonte da página, se cadastrar logar , ele terá completo acesso ao código java esse é o problema

    Thiii =)

    segunda-feira, 30 de julho de 2012 15:17
  • Thiago,

    Em toda a aplicação web, o usuário terá acesso ao código javascript. Por isso você não deve ser basear somente nas validações e restrições feitas no cliente, eles servem para questões de usabilidade, e performance, evitando de ir ao servidor desnecessariamente.

    Mas você deve sempre refazer no servidor todas as regras de validações e restrições, só assim conseguirá manter o controle de tudo.

    Não tem o que fazer.

    No seu caso, você deve garantir que o método só poderá ser executado por um usuário logado e que tenha permissão de executar essa ação.

    Como disse, você está usando PageMethods e ao usar métodos desse tipo, o page_load da página que o método está contido não é executado. Portanto você deve na execução desse método, verificar se o usuário está logado, e se ele tem permissão de execução da referida ação.

    Abs!


    Alexsandre Rodrigues de Almeida - MCTS .NET Framework - Web Applications
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 15:33
  • Thiago,

    Ai você já entra num aspecto de controle de acesso.

    Se qualquer um pode se cadastrar, mas não é qualquer um que pode executar uma ação (ex. deletar um registro) você precisa validar se o usuário pode realizar tal ação, existem N maneiras de se fazer isso.

    Se precisar de ajuda poste ai.


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 15:46
  • Se vc usar forms isso já pode barrar da uma olhada

    http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:05
    segunda-feira, 30 de julho de 2012 17:27
    Moderador
  • Leia isto como complemento:

    http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           



    Isso mesmo Seilor, rsss...

    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:04
    segunda-feira, 30 de julho de 2012 17:56
  • Bom to lendo tudo que todos membros do forum entao me enviando, porem, mesmo se eu fizer a checagem de auttenticação do usuario, no page methods, ainda terá códigos que colocarão o banco de dados em grande risco, pq se o usuario copiar o codigo do java e executar no console do "inpsecionar elemento" do chrome e IE o códígo irá verificar se o usuario esta autenticado se nao estiver ele recusa, se estiver ele executa o código, resumindo, nao tem como eu proteger sobre isso, o negocio msm é nao usar o pagemethods, mas ai cada postback a página recarrega e fica ruim. Por isso eu uso o pagemethods

    Thiii =)

    segunda-feira, 30 de julho de 2012 22:05
  • Thiago,

    Estando autenticado ele poderá executar o método, estando em PageMethods ou não. Lembre isso é uma aplicação web, é facil fazer chamadas ao servidor. Independente da tecnologia usada, há meios de burlar. Por isso é necessário a validação no server.

    Se por acaso, só alguns usuários podem chamar esse método, você deve ter alguma implementação de perfils/papeis em seu sistema. Assim além de estar logado no sistema, o usuário precisará ter um papel e/ou perfil específico para poder chamar esse método. E no servidor além de verificar o usuário logado, você irá verificar se ele tem esse perfil/papel. Entendeu?

    Abs!


    Alexsandre Rodrigues de Almeida - MCTS .NET Framework - Web Applications
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:04
    segunda-feira, 30 de julho de 2012 22:21
  • COmpreendo, eu ouvi falar sobre o MVC + Ajax, eu uso o pagemethods pelo fato de chamar o servidor sem recarregar a página, isso que eu gosto, se eu usar um panelUpdate do ajax, talvez isso se resolveria? ai eu nem precisaria do javascript, e outra, o javascript é a unica linguagem que consegue se adaptar ao html da página? eu uso muito o document.getelementById etc... e o java é o unico que faz isso?


    Thiii =)

    segunda-feira, 30 de julho de 2012 22:43
  • Thiago,

    Se você usar o panelUpdate do AjaxControlToolkit, no fundo ele também usa Javascript. Ele apenas faz al coisas de forma mais automática. Portanto você não tem muito para onde correr.

    Abs!


    Alexsandre Rodrigues de Almeida - MCTS .NET Framework - Web Applications
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    • Marcado como Resposta Thiago de bona segunda-feira, 30 de julho de 2012 23:04
    segunda-feira, 30 de julho de 2012 23:01
  • Bom irei continuar assim, porem o site vai ter segurança zero, a nao ser que... eu faça mesmo o esquema de autenticação, e no codebehind, cada usuário conectado, poderá fazer sómente modificações nas proprias informações, resumindo... Cada tabela com uma coluna "usuario_id" e o code behind executa sómente querys onde o usuario_id seja igual ao usuario conectado, assim se algum "hacker" tente burlar, ele irá simplismete burlar a si proprio e nao fará nada com os outros usuarios!

    Acho que essa é a solução! oque vcs acham?


    Thiii =)

    segunda-feira, 30 de julho de 2012 23:04
  • Prezado,

    Para aumentar a sua segurança além da validação do usuário feita no server, você deve pensar mais além.
    Comprima seu javascript, logo em seguida use um ofuscamento de código e por fim para dificultar um pouco mais faça uma segunda criptografia, assim ficará quase impossível de alguém burlar o seu código mas lembre-se isto não o exime de fazer as validações necessárias no server.

    Obs. Existem várias ferramentas online de ofuscação de código e criptografia de uma olhada como funciona e faça a sua própria ferramenta, para ofuscar e criar a criptografia, ou apenas para criar a criptografia. Faça também uma backup dos seus Js para você usar em ambiente de dev sem ofuscar e criptografar.

    Código Original: Alert("segurança");

    ###################Ofuscado

    eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0("1ç2");',3,3,'alert|seguran|a'.split('|'),0,{}))

    ###################Criptografado

    eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('n(7(4,a,c,k,e,6){e=d;f(!\'\'.8(/^/,d)){9(c--)6[c]=k[c]||c;k=[7(e){5 6[e]}];e=7(){5\'\\\\i+\'};c=1};9(c--)f(k[c])4=4.8(h m(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c]);5 4}(\'0("1ç2");\',3,3,\'o|l|a\'.j(\'|\'),0,{}))',25,25,'||||p|return|r|function|replace|while||||String||if||new|w|split||seguran|RegExp|eval|alert'.split('|'),0,{}))


    k3rn3lp4n1c

    • Marcado como Resposta Thiago de bona quarta-feira, 1 de agosto de 2012 14:15
    quarta-feira, 1 de agosto de 2012 14:10
  • Nesse caso irei criptografar o codigo obsfucado, eu faço isso em meus app de c# para windows forms, nao sabia que existia isso para web, teria como vc mandar o nome ou o web site das duas ferramentas que vc uso ?

    Thiii =)

    quarta-feira, 1 de agosto de 2012 14:16