Attacking web applications for dynamic discovering of vulnerabilities

Abstract

Tese de Mestrado, Segurança Informática, 2022, Universidade de Lisboa, Faculdade de CiênciasAtualmente, a Internet faz parte do nosso dia a dia, sendo que as aplicações são criadas sobre a mesma. Estas aplicações oferecem múltiplos serviços que são usados para resolver diversos problemas na nossa vida, tal como falar com amigos nas redes sociais, comprar bilhetes para a nossa próxima viagem ou até mesmo verificar o estado da nossa conta bancária. Atualmente existem 1.8 mil milhões de websites ativos, número este que aumenta constantemente, visto que centenas de milhares de novos serviços são criados mensalmente. A grande maioria dos utilizadores destas aplicações, contudo, não está focada nos aspetos de segurança destes sistemas, visto que as funcionalidades destas é que os atraíram a utilizar as aplicações. Isto leva a que a prioridade das empresas seja oferecer o maior número de funcionalidades no menor espaço de tempo, dado que a variedade de funcionalidades é o que leva os utilizadores a comprar e utilizar os seus serviços. Com isto, as empresas são constantemente confrontadas entre criar novas funcionalidades ou melhorar a segurança das aplicações que desenvolvem, e muitas vezes as empresas colocam no mercado novas aplicações pouco testadas a nível de segurança e que apresentam vulnerabilidades. As startups são empresas que optam pelo desenvolvimento de funcionalidades. Nestas pequenas empresas, gastar tempo e dinheiro extra para criar aplicações sólidas e seguras, adiando as datas previstas de lançamento, pode levar à perda total do negócio, visto que a competição para colocar produtos novos no mercado é alta e a funcionalidade é mais valorizada do que a segurança destes. Além disso, o desenvolvimento das aplicações web está cada vez mais acessível, sendo mesmo possível para programadores que não têm grandes conhecimentos técnicos e de programação. O WordPress é um sistema de gestão de conteúdos que é usado para criar blogues e aplicações web de uma forma rápida e intuitiva, sendo assim um sistema apelativo para utilizadores sem, ou com pouca experiência em desenvolvimento de conteúdos web. O WordPress é desenvolvido em PHP, uma linguagem de script utilizada principalmente para processar os dados do lado do servidor. Estes dois elementos são os mais relevantes no desenvolvimento de aplicações web, uma vez que quase 80% usam PHP como linguagem de programação e, de todas estas aplicações PHP, 40% usa o WordPress para gerir os seus conteúdos. Contudo, apesar do seu elevado número de utilizadores, o PHP tem uma fraca validação dos dados, sendo necessário que os programadores tenham boas práticas de programação e que utilizem um conjunto de funções de sanitização para prevenir a inserção de vulnerabilidades no código. Programar em PHP sem gralhas, em termos de segurança de software, requer um elevado nível de conhecimentos técnicos da linguagem. Prova disto é que múltiplas vulnerabilidades presentes nos plugins do WordPress estão constantemente a ser descobertas e que afetam todas as aplicações que utilizem esses plugins vulneráveis. Se combinarmos esta falta de conhecimentos técnicos e más práticas com as limitações da linguagem e as vulnerabilidades existentes, acabamos por ter aplicações web com vulnerabilidades de segurança, que estão presentes na Internet à espera de serem exploradas por utilizadores maliciosos. Com a existência destes utilizadores constantemente a atacar as aplicações web, as empresas estão cada vez mais a implementar mecanismos de testes em fases tardias no desenvolvimento das aplicações. Apesar deste esforço, o número de vulnerabilidades encontradas continua a aumentar, tornando a segurança destas aplicações uma das suas principais preocupações. Vulnerabilidades de injeção, como Cross¬Site Scripting (XSS) e injeção de código SQL, continuam a estar muito presentes nestas aplicações, especialmente em aplicações pouco atualizadas. Prova disto é que estas vulnerabilidades estão em terceiro lugar no OWASP Top 10 2021, uma lista que contém as vulnerabilidades mais relevantes de momento. O impacto destas vulnerabilidades é enorme e pode resultar na exfiltração de informações sensíveis, perda de dados, ataques de negação de serviço, entre outros. As vulnerabilidades de XSS, apesar de terem um impacto mais moderado, foram encontradas em cerca de dois terços das aplicações, segundo estudos feitos pelo OWASP, revelando a sua grande prevalência na Internet. Apesar de estas vulnerabilidades serem já antigas e muito conhecidas, continuam a existir casos recentes com algumas aplicações que são usadas por milhões de utilizadores. As atuais abordagens para resolver este problema passam por mecanismos de fuzzing, que enviam valores erróneos para as aplicações e detetam vulnerabilidades baseado nas respostas das mesmas. Outras soluções seguem abordagens de análise estática, que analisam o código fonte das aplicações sem a execução do mesmo, e abordagens de execução simbólica que mapeiam as aplicações de forma simbólica para encontrar vulnerabilidades. Por fim, algumas abordagens utilizam oracles que são utilizadas para analisar os pedidos feitos às aplicações e definir se esses pedidos são tentativas de ataque. Apesar disto, estas abordagens têm algumas limitações: Fuzzing apenas envia valores incorretos para as aplicações e identifica vulnerabilidades baseado nas respostas, não fornecendo nenhuma informação extra de como a vulnerabilidade é explorada nem o código fonte que é vulnerável. O sucesso da análise estática depende do seu conhecimento das classes de vulnerabilidades a testar, assim como dos seus mecanismos para inspecionar o código fonte, que, se forem incorretamente aplicados podem levar a um elevado número de falsos positivos e negativos. Por fim, os oracles utilizam proxies que apenas identificam se um pedido é malicioso antes da sua execução na aplicação, não tendo conhecimento do fluxo de dados dentro da aplicação nem de como a vulnerabilidade é explorada. Esta dissertação pretende caracterizar como as vulnerabilidades de XSS e SQL injection podem ser identificadas no código fonte e como podem ser exploradas. Com esta informação, conseguimos identifica-las no código fonte das aplicações, sem ter de o inspecionar, se correlacionarmos a informação reportada pelos fuzzers com a informação recolhida pelo monitor na aplicação web, que monitoriza os pedidos recebidos e regista os caminhos de execução dos dados na aplicação. Nós avaliámos e explorámos alguns fuzzers com o código fonte disponível, criámos um conjunto de fuzzers para explorar as aplicações e melhorámos um monitor que funciona como debugger para recolher os caminhos de execução dos ataques. Os objetivos da tese e a forma de os concretizar são os seguintes. Primeiramente, é feito um estudo das vulnerabilidades mais comuns nas aplicações web, e como é possível explorá-las e identifica-las no código fonte da aplicação. Além disso, é feita uma análise soluções de fuzzing e injeção de código para aplicações PHP e é identificado como monitorizar estas soluções para recolher os caminhos de execução (traces) dos ataques, controlar o seu estado e explorar possíveis vulnerabilidades. Em segundo lugar, é feita uma melhoria numa extensão do XDebug de forma a poder corretamente identificar os caminhos de execução associados a vulnerabilidades de XSS. Finalmente, é implementada uma solução, com um conjunto de fuzzers, que injeta código malicioso nas aplicações, recolhe os seus traces e identifica se estes estão associados com ataques que conseguiram explorar vulnerabilidades com sucesso, através da correlação da informação dos traces com a informação dos ataques. Se estes estiverem associados a ataques, identifica as vulnerabilidades no código fonte da aplicação, sem o inspecionar, apresentando como resultados as vulnerabilidades encontradas e os ataques que levaram a essa exploração. A solução implementada contém um conjunto de três fuzzers (W3af, Wapiti e OWASP ZAP), os quais se complementam uns aos outros através da partilha dos seus resultados, obtidos na fase de crawling. Isto leva a uma melhoria posterior na fase de ataque porque páginas e pedidos que não foram encontrados por um fuzzer, mas que foram encontrados por outro, podem ser explorados, usufruindo assim da partilha dos resultados. Desta combinação de fuzzers obtivemos resultados interessantes, tais como a descoberta de vulnerabilidades que não seriam possíveis de identificar caso os fuzzers fossem executados individualmente. Enquanto os ataques decorrem, nós recolhemos os traços de execução gerados durante os ataques feitos pelos scanners, que contêm informação das movimentações dos dados dentro da aplicação web, especificamente desde o ponto de entrada do ataque até à chegada de funções sensíveis (funções que podem levar à exploração de vulnerabilidades). Com estes dados que recolhemos, conseguimos identificar os traços de execução que contêm os ataques que foram reportados como bem ¬sucedidos por parte dos fuzzers, confirmar que o valor malicioso utilizado no ataque atingiu uma função sensível e se conseguiu explorar uma vulnerabilidade com sucesso. Finalmente, conseguimos validar a veracidade dos ataques reportados pelos scanners, verificando se os ataques realmente atingiram uma função sensível, assim como apresentar os ataques que foram bem ¬sucedidos, o traço de execução que levou a essa exploração e a identificação da função vulnerável no código fonte da aplicação. Esta validação é possível devido à informação extra que os traços de execução contêm, nomeadamente os valores exatos que chegaram à chamada de funções e o comportamento posterior da aplicação a estes, sendo então possível identificar se a aplicação tomou um comportamento inesperado e identificar possíveis vulnerabilidades. A solução foi validada através do teste a três aplicações web com vulnerabilidades conhecidas. Os resultados das experiências revelam que a solução é capaz de identificar vulnerabilidades de SQL Injection e XSS, que não seriam reportadas caso cada fuzzer corresse independentemente dos outros. Para além disto, a solução foi capaz de confirmar a veracidade dos ataques reportados pelos fuzzers, assim como identificar falsos positivos nos seus relatórios.The vast majority of online services we use nowadays are provided by web applications to the users. The correctness of the source code of these applications is crucial to prevent attackers from exploiting the possible existing vulnerabilities they can contain, leading to severe consequences like the disclosure of sensitive information or the degradation of the availability of the service. Currently, multiple static analysis solutions analyse and detect vulnerabilities in the applications’ source code and are used by organisations to test their software. Malicious actors, however, do not usually have access to the source code of these applications and have to plan their attacks based on the information that is made public and fuzzing tools. This dissertation proposes a solution for the automatic detection of vulnerabilities in web applications written in PHP through an ensemble fuzzing approach and their identification in the source code without accessing it. Using an ensemble fuzzing of open¬source web fuzzers, the solution scans the target web applications and collects the application execution traces of the attacks carried by the fuzzers. Furthermore, it correlates the successful attacks reported by the fuzzers with the collected traces, identifying thus the traces in which such attacks happened. Afterwards, the solution inspects the resulting traces to evaluate the truthfulness of the attacks by checking if they successfully reached any sensitive sink (functions susceptible to be vulnerable to malicious inputs), and identifying, for these, the vulnerable code in the application. The solution was implemented and validated through the testing of three vulnerable web applications using three open¬source web application fuzzers for the ensemble. The experimental results demonstrate that it is capable of identifying SQL Injection and XSS vulnerabilities that would be missed if each fuzzer would run without the ensemble. Furthermore, the solution is capable of confirming the attacks reported by the fuzzers, as well as identifying false positives in their reports. Also, for the successful attacks checked, the solution is capable of identifying the vulnerable source code associated with the exploited vulnerabilities

    Similar works