2007-10-20, 22:12
  #1
Medlem
Awwents avatar
Har flera gånger hört talas om rubrikens namn :P
SQL injection, d.v.s.
Vad är det?
Hur gör man det?

Jag kan lite smått med databasen MySQL, om det är det :P
Citera
2007-10-20, 22:21
  #2
Medlem
DaVajjs avatar
Citat:
Ursprungligen postat av Awwent
Har flera gånger hört talas om rubrikens namn :P
SQL injection, d.v.s.
Vad är det?
Hur gör man det?

Jag kan lite smått med databasen MySQL, om det är det :P

Tänk dig att du har en hemsida som hämtar data, och skickar vidare till en SQL-databas, exempelvis MySQL. En hemsida skulle vilja göra detta t. ex för att registrera medlemmar, autentisera medlemmar (kontrollera att ett användarnamn och lösenord är ett giltigt par), hämta data som t. ex nyheter som ligger lagrade i databasen för visning.

Låt oss säga att vi har en nyhetssida news.php som tar en parameter via adressfältet, ID, som anger vilken nyhet vi vill visa. Användaren fyller inte i detta manuellt, utan något som din hemsida tar hand om, t. ex vid listning av nyheterna.

En exempellänk kan då se ut: http://hemsida/news.php?id=5

PHP-skriptet news.php hämtar denna parameter och inkluderar den i en SQL-förfrågan.

Dvs, den kanske bygger sin SQL förfrågan på följande sett (psuedokod):

Kod:
"SELECT title, text FROM nyheter WHERE id=" + variabelID

Tänk dig att skriptet inte kontrollerar så att variabeln id är på ett korrekt sätt, och låt oss säga att vi istället för att ange id till 5, så anger vi den att vara något som när det tolkas av SQL-databasen får SQL-databasen att utföra saker som skaparen av skriptet inte har tänkt sig. Voila, vi har SQL-injection.

id=-1 UNION SELECT VERSION(),2

Detta skulle medföra att SQL-förfrågan blev:

SELECT title,text FROM nyheter WHERE id=-1 UNION SELECT VERSION(),2

Denna SQL-förfrågan plockar title och text från tabellen nyheter där id't är -1 (vilket inte lär finnas) och kombinerar detta resultat från den förfrågan som hämtar versionsnumret på MySQL-databasen, och 2.

Det skriptet får tillbaka är alltså versionen, och två, och den kommer hantera det som att det var nyhetsdata som den skulle visa.

Du kommer således på hemsidan få utskrivet vilken version databasen kör, och siffran två.

Det hela handlar alltså om att bygga om SQL-förfrågningar och manipulera dom så gott det går. Det hela är lite olika beroende på vilken databas som körs, för visst följer de alla den grundläggande SQL-syntaxen, men de har alla sina egna egenskaper, ofta egna speciella tabeller, kommandon etc, som är bra att känna till för att utnyttja vid sin injicering.
Citera
2007-10-20, 22:26
  #3
Medlem
Awwents avatar
Okej, tack för svaren
Citera
2007-10-20, 22:26
  #4
Medlem
khlars avatar
Asså, du kan hoppa in i wiki och kolla. Men för att göra detta lite snabt och änkelt kan man säga att ställen där du kan tillexempel skriva in kod som i browsern, sökrutan eller inloggningsrutorna, där skickar du ju kod till DB:n men om du nu inte skulle använda, exempelvis magic quote så skulle denna koden köras i din DB...

För att ta ett exempel:

Skulle du få för dig att i en inloggningsruta skriva:
username = ' OR ''='
password = ' OR ''='


queryn skulle i så fall se ut såhär:
SELECT * FROM user WHERE username='' OR ''='' AND password='' OR ''=''

Men det finns flera sätt att komma för bi detta på...
Men det finns oxå sjukt många typer av injections.... Men nu kanske du har en susning... Googla på det annars vettja!
Citera
2007-10-21, 02:25
  #5
Medlem
HerrHBs avatar
Här har du en hel del information inom ämnet http://en.wikipedia.org/wiki/SQL_injection

Även på milw0rm finns det ett par stycken bra papers.
Citera
2007-10-21, 06:21
  #6
Medlem
hexxas avatar
Lånar tråden lite
Finns det något sätt att lista kolumberna i tabellen
Har ej så jätte stor kundskap av sql men vi säger att det är så här

[PHP]
profil?uid=3
^
Select xxx from users where uid=$_GET['uid'] [/PHP]

och då tänkte jag på om man kunde få fram
alla kolumber =/?

[PHP]union all select * from users--[/PHP]
kan något sådant fungera?
Citera
2007-10-21, 11:16
  #7
Medlem
crazzirs avatar
I vissa fall kan man använda sig av INFORMATION_SCHEMA för att ta reda på tabellnamn och kolumnnamn.

Finns en PDF på milw0rm.com om detta.
http://milw0rm.com/papers/174
Citera
2007-10-21, 11:55
  #8
Medlem
Kokarns avatar
Citat:
Ursprungligen postat av DaVajj
Tänk dig att du har en hemsida som hämtar data, och skickar vidare till en SQL-databas, exempelvis MySQL. En hemsida skulle vilja göra detta t. ex för att registrera medlemmar, autentisera medlemmar (kontrollera att ett användarnamn och lösenord är ett giltigt par), hämta data som t. ex nyheter som ligger lagrade i databasen för visning.

Låt oss säga att vi har en nyhetssida news.php som tar en parameter via adressfältet, ID, som anger vilken nyhet vi vill visa. Användaren fyller inte i detta manuellt, utan något som din hemsida tar hand om, t. ex vid listning av nyheterna.

En exempellänk kan då se ut: http://hemsida/news.php?id=5

PHP-skriptet news.php hämtar denna parameter och inkluderar den i en SQL-förfrågan.

Dvs, den kanske bygger sin SQL förfrågan på följande sett (psuedokod):

Kod:
"SELECT title, text FROM nyheter WHERE id=" + variabelID

Tänk dig att skriptet inte kontrollerar så att variabeln id är på ett korrekt sätt, och låt oss säga att vi istället för att ange id till 5, så anger vi den att vara något som när det tolkas av SQL-databasen får SQL-databasen att utföra saker som skaparen av skriptet inte har tänkt sig. Voila, vi har SQL-injection.

id=-1 UNION SELECT VERSION(),2

Detta skulle medföra att SQL-förfrågan blev:

SELECT title,text FROM nyheter WHERE id=-1 UNION SELECT VERSION(),2

Denna SQL-förfrågan plockar title och text från tabellen nyheter där id't är -1 (vilket inte lär finnas) och kombinerar detta resultat från den förfrågan som hämtar versionsnumret på MySQL-databasen, och 2.

Det skriptet får tillbaka är alltså versionen, och två, och den kommer hantera det som att det var nyhetsdata som den skulle visa.

Du kommer således på hemsidan få utskrivet vilken version databasen kör, och siffran två.

Det hela handlar alltså om att bygga om SQL-förfrågningar och manipulera dom så gott det går. Det hela är lite olika beroende på vilken databas som körs, för visst följer de alla den grundläggande SQL-syntaxen, men de har alla sina egna egenskaper, ofta egna speciella tabeller, kommandon etc, som är bra att känna till för att utnyttja vid sin injicering.

En snabb fråga bara, varför använda -1 istället för ett vanligt id? Vet att "det är så man gör" men varför?
Citera
2007-10-21, 14:28
  #9
Medlem
DaVajjs avatar
Citat:
Ursprungligen postat av Kokarn
En snabb fråga bara, varför använda -1 istället för ett vanligt id? Vet att "det är så man gör" men varför?

Eftersom nyhetssidan behandlar en nyhet. En SQL-förfrågan har ett svar som består av noll eller fler rader, med de kolumner man begärt.

Om du skulle använt ett ID som fanns, så hade svaret bestått av en rad för nyheten, och en rad för den data vi kombinerade in i svaret med UNION. Vilken av dessa som skulle komma att visas beror på hur svaren sorterades. Skriptet skulle bara plocka det första, den förväntar sig förmodligen inget annat. Så för att vara säker på att vår data är den som visas ser vi till att den första satsen inte returnerar någon data alls.
Citera
2007-10-21, 14:31
  #10
Medlem
DaVajjs avatar
Citat:
Ursprungligen postat av hexxa
Lånar tråden lite
Finns det något sätt att lista kolumberna i tabellen
Har ej så jätte stor kundskap av sql men vi säger att det är så här

[PHP]
profil?uid=3
^
Select xxx from users where uid=$_GET['uid'] [/PHP]

och då tänkte jag på om man kunde få fram
alla kolumber =/?

[PHP]union all select * from users--[/PHP]
kan något sådant fungera?

När du gör en UNION så måste kolumnerna förfrågade i alla satser vara lika till antalet, så det är högst osannolikt att det skulle fungera.
Citera
2007-10-21, 14:37
  #11
Medlem
Citat:
Ursprungligen postat av DaVajj
När du gör en UNION så måste kolumnerna förfrågade i alla satser vara lika till antalet, så det är högst osannolikt att det skulle fungera.
Ett snabbt sätt att få reda på antalet kolumner är att använda order by [siffra].
T.ex. "SELECT * FROM users WHERE id = 1 ORDER BY 10/*", om det fungerar är det mer än 10 kolumer som selectas, då är det bara att testa med 20 istället osv.

Sedan om man vill ha tag på kolumnnamnen så går det att missbruka information_schema lite.

EDIT: Såg att det jag sagt redan stod lite längre upp i tråden, my bad.
Citera
2007-10-21, 15:22
  #12
Medlem
hexxas avatar
Citat:
Ursprungligen postat av DaVajj
När du gör en UNION så måste kolumnerna förfrågade i alla satser vara lika till antalet, så det är högst osannolikt att det skulle fungera.

Jo det vet jag men var bara ett exempel men i värsta fall kör man ju bara
[PHP]Select 1,2,3..[/PHP]

Sen finns det någon möjlighet att göra så här
[PHP]SELECT 1,2,3 FROM users +
UPDATE ...[/PHP]

Får väll dra in en webserver på burken och leka lite
hehe !
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in