SQL тарилга нь өгөгдөлд тулгуурласан хэрэглээний програмуудад халдахад хэрэглэгддэг кодыг тарих техник юм. SQL тарилга нь хэрэглээний програмын програм хангамжийн аюулгүй байдлын эмзэг байдлыг ашиглах ёстой. Жишээл нь SQL илэрхийлэлд агуулагдсан тэмдэгт мөрийн esc тэмдэгтүүд нь буруугаар шүүгдсэн эсвэл хэрэглэгч хатуу тогтсон дүрмийн дагуу оролтыг оруулаагүй тохиололд санаанд оромгүй буруу үр дүн гаргадаг. SQL тарилга нь ихэвчилэн вэбсайтын халдлагын вектор гэж нэрлэгддэг боловч ямар ч төрлийн SQL өгөгдлийн санд халдахад ашиглагдах боломжтой. SQL тарилга халдлага нь гүйлгээг зогсоох эсвэл дансны үлдэгдлийг өөрчилөх, систем дэх бүх өгөгдлийг бүрэн задлах, өгөгдлийг устгах эсвэл боломжгүй болгох мөн өгөгдлийн сангийн серверийн администраторын эрхтэй болох гэх мэтээр хүчингүй болгох асуудлыг үүсгэх мөн одоо байгаа өгөгдлүүдийг хөндлөнгөөс өөрчилөх боломжийг халдагчид олгодог. 2012 оны судалгаагаар компаны вэбсайт сар бүр дунджаар 4 халдлагад өртдөг бол жижиг худалдааны газрууд бусад салбаруудаас хоёр дахин их халдлагыг хүлээн авдаг байна.

Түүх засварлах

SQL тарилгын хамгийн анхны нийтийн хэлэлцүүлэг 1998 оноос эхэлжээ.

Хэлбэр засварлах

SQL тарилга(SQLI) Нээлттэй Вэб Програмын Аюулгүй байдлын Төслийн (Open Web Security Project) 2007 болон 2010 оны топ 10 вэб програмын эмзэг байдлын нэгд тооцогдож байсан. 2013 онд SQLI нь OWASP-ийн топ 10 халдлагын нэгдүгээрт эрэмбэлэгдсэн байсан. SQL тарилгын дөрвөн гол дэд ангилал байдаг:

  • Сонгодог SQLI
  • Сохор буюу таамаглал SQL тарилга
  • Өгөгдлийн сан удирдах систем – тусгай SQLI
  • Нийлмэл SQLI
  • SQL injection + хангалтгүй нотолгоо
  • SQL injection + DDoS халдлага[1]
  • SQL injection + DNS hijacking халдлага[2]
  • SQL injection + XSS[3]

Storm Worm бол нийлмэл SQLI-ийн нэг хэлбэр. Энэ ангилал нь SQLI-ийн төлвийн 2010 он хүртэлх хугацааны хөгжлийн хувьд авч үзсэн ангиллын төлөөлөл болно.

Техникийн хэрэгжүүлэлтүүд засварлах

Буруу шүүгдсэн esc тэмдэгтүүд засварлах

SQL тарилгын энэ хэлбэрийн тохиолдолд хэрэглэгчийн оролт дох esc тэмдэгтүүд шүүгдээгүй үед SQL илэрхийлэлд дамжуулагдана. Үүний үр дүнд SQL илэрхийллүүдийн боломжит арга заль програмын эцсийн хэрэглэгчээр өгөгдлийн сан дээр хийгдэнэ.

Дараах мөр код энэ эмзэг байдлыг харуулж байна:

илэрхийлэл = "SELECT * FROM users WHERE name = '" + userName + "';"

Энэ SQL код нь хэрэглэгч хүснэгтээс заасан хэрэглэгчийн бичлэгийг татахад зориулагдсан. Гэсэн хэдий ч “username” хувьсагч нь хорт хэрэглэгчийн тодорхой аргаар бүтээгдсэн бол код зохиогчийн зорилгоос илүүг хийх боломжтой. Жишээлбэл дараах зурагт харуулсан нэвтрэх хуудсан дээр жишээ авч үзье. Хэрэглэгч өөрийн нэр нууц үгийг зурагт харуулснаар оруулахад буруу өгөгдөл оруулсан үед доорх зурагт харагдаж буй мэдээлэл гарна.


Хэрэглэгч стандарт өгөгдөл оруулах үед SQL илэрхийлэл дараах хэлбэрээр биелэнэ. Энэ үед query нь нөхцлийг шалгаад өгөгдсөн нөхцөл бүхий бичлэг байгаа эсэхийг ямар ч алдаагүйгээр шалгаад үр дүнг буцаана.

SELECT * FROM users WHERE username = 'alex' AND userpass = 'john';

Хэрэглэгчийн нэр нууц үгийн оронд “’ OR ‘1’=’1” гэсэн оролтыг өгөхөд л өгөгдлийн сангаас мэдээлэл шүүж гаргах SQL query-ны бүтэц өөрчлөгдөж амжилттай нэвтэрж чадсаныг харж байна.


Хэрэглэгч стандарт бус өгөгдөл оруулах үед SQL илэрхийлэл дараах хэлбэрээр биелэнэ:

SELECT * FROM users WHERE username = '' OR '1'='1' AND userpass = '' OR '1'='1';

Эсвэл query-ний үлдсэн хэсгийг хаахын тулд тайлбарыг ашиглах(SQL 3 төрлийн тайлбарыг ашигладаг ). Бүх гурван мөрийн төгсгөлд зай авдаг:

' OR '1'='1' --
' OR '1'='1' ({
' OR '1'='1' /* 

Дараах SQL илэрхийллийн аль нэгийг эцэг хэл дээр гүйцэтгэдэг:

SELECT * FROM users WHERE name = '' OR '1'='1';
SELECT * FROM users WHERE name = '' OR '1'='1' -- ';

Хэрвээ энэ кодыг баталгаажуулах процедурт ашиглах бол энэ жишээ нь өгөгдлийн талбар бүрийн (*) сонголтыг бүх хэрэглэгчидээс гэхээсээ илүүтэйгээр кодерийн хувьд нэг тодорхой хэрэглэгчийн нэр ашиглагдаж болно, учир нь '1'='1' нь үргэлж үнэн байдаг. Доорх зурганд харагдаж буйгаар хэрэглэгчийн нэр эсвэл нууц үгийн аль нэг талбарт энэхүү ололтыг оруулан нэвтэх товчийг дархад bat гэсэн хэрэглэгч байсан ч байгаагүй ч Suppliers хүснэгт устах болно.

Хэрэглэгч дээрх шиг стандарт бус өгөгдөл оруулах үед SQL илэрхийлэл дараах хэлбэрээр биелэнэ.

SELECT * FROM users WHERE username = 'bat';DROP TABLE Suppliers;

Доорх илэрхийлэлд “userName”-ийн дараах утга нь хэрэглэгчийн хүснэгтийн устгал мөн түүнчлэн “userInfo” хүснэгтийн(бүх хэрэглэгчийн мэдээллийн хувьд) бүх өгөгдөлийг сонгоход хүргэдэг, API ашиглан олон тооны илэрхийллийг зөвшөөрдөг. a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't Энэ оролт нь эцсийн SQL илэрхийллийг дараах байдлаар тодорхойлно:

SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';

Ихэнхи SQL серверийн шийдлүүд нь иймэрхүү байдлаар нэг илэрхийлэл бүхий олон илэрхийллийг гүйцэтгэхийг зөвшөөрдөг боловч PHP-ийн mysql_query() функц гэх мэт зарим SQL API-ууд нь аюулгүй байдлын үүднээс үүнийг зөвшөөрдөггүй. Энэ нь халдагчид бүхэлд нь тусдаа query-нуудад тарилга хийхээс урьдчилан сэргийлж байгаа боловч, query-д өөрчилөлт оруулахыг зогсоодоггүй.

Буруу төрлийн боловсруулалт засварлах

Энэ төрлийн SQL тарилгын хэлбэр нь хэрэглэгч заавал хатуу тогтсон дүрмийн дагуу өгөгдлийг оруулах албагүй байдагтай холбоотойгоор эсвэл төрлийн хязгаарлалтанд шалгалт хийгдээгүй үед гардаг. Энэ нь тоон талбарыг SQL илэрхийлэлд ашиглах үед хэрэгжиж болох юм. Гэхдээ програмист хэрэглэгчийн оруулсан оролт тоо эсэхийг шалгах шалгалтыг хийдэггүй. Жишээ нь: илэрхийлэл := "SELECT * FROM userinfo WHERE id =" + a_variable + ";"

Энэ илэрхийллээс авч үзэхэд a_variable нь "id" талбарт хамааралтай тоо байхыг хүссэн тодорхой байна. Гэсэн хэдий ч хэрвээ энэ нь үнэн хэрэгтээ тэмдэгт байвал эцсийн хэрэглэгч өөрийн сонголтоороо илэрхийллийг гуйвуулж болзошгүй, ингэснээр esc тэмдэгтүүдийг ашиглах шаардлагагүй болно. Жишээлбэл a_variable - г ийм хэлбэртэйгээр бичиж болно:

1;DROP TABLE users

"users" хүснэгтийг өгөгдлийн сангаас устгана, мөн SQL ийм хэлбэртэй болно:

SELECT * FROM userinfo WHERE id=1; DROP TABLE users;

Сохор SQL тарилга засварлах

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

Хоёрдугаар дарааллын SQL тарилга засварлах

Хоёрдугаар дарааллын SQL тарилга нь оруулсан утгууд шууд ажиллахаас илүүтэй хадгалагддаг хортой командыг агуулж буй үед тохиолддог. Зарим тохиолдолд програм нь SQL илэрхийллийг зөвөөр кодчилдлог бөгөөд үүнийг зөв SQL гэж хадгалдаг. Дараа нь SQL тарилгаас хамгаалах ямар нэг хяналтгүйгээр програмын өөр нэг хэсэг хадгалсан SQL илэрхийллийг ажиллуулах боломжтой. Энэ халдлага нь оруулсан утгуудыг дараа нь яаж ашигласан талаар илүү их мэдлэгтэй байхыг шаарддаг. Автоматжуулсан вэб програмын аюулгүй байдлын сканерууд энэ төрлийн SQL тарилгыг амархан илрүүлэх боломжгүй.

Хор хөнөөллийг бууруулах засварлах

SQL тарилга нь алдартай халдлага бөгөөд энгийн аргаар амархан сэргийлэх боломжтой.

Тодорхой хэлбэрээр бичигдсэн илэрхийлэл засварлах

Хөгжүүлэлтийн ихэнхи протформууд дээр параметрүүдтэй ажилладаг тодорхой хэлбэрээр бичигдсэн илэрхийллүүд нь хэрэглэгчийн оролтыг илэрхийлэлд оруулаахын оронд ашиглах боломжтой. Тиймээс SQL тарилга нь энгийнээр үл мэдэх(магадгүй хүчингүй) параметрийн утга гэж боловсруулагддаг.

Кодчилох түвшинд хэрэгжүүлэх засварлах

Объект харилцааны зураглалын санг ашиглан SQL код бичих шаардлагаас зайлсхийдэг. ORM сан нь объект хандалтат кодоос параметржүүлсэн SQL илэрхийллийг бий болгодог.

Зайлсхийх нь засварлах

Шууд бус боловч тарилгын эсрэг алдаа гардаг арга нь SQL дэх тусгай утгатай тэмдэгтүүдийг хасах явдал юм. SQL DBMS-ийн гарын авлага нь ямар тэмдэгтүүд нь тусгай утгатай байхыг тайлбарладаг бөгөөд ингэхийн тулд хөрвүүлэгч хэрэгтэй тэмдэгтүүдийн дэлгэрэнгүй жагсаалтыг бий болгох боломжийг олгодог. Жишээлбэл хүчинтэй SQL тэмдэгтийн хэлбэрт параметрд дан ганц хашилт(‘) байх тохиолдолд (“) давхар хашилтаар солигдох ёстой. Жишээ нь PHP –д mysqli_real_escape_string(); функцийг ашиглан параметраас зугтахад түгээмэл ашигладаг. SQL query-ыг илгээхээсээ өмнө:

$mysqli = new mysqli('hostname', 'db_username', 'db_password', 'db_name');
$query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'",
                  $mysqli->real_escape_string($username),
                  $mysqli->real_escape_string($password));
$mysqli->query($query);

Энэ функц нь backslash-уудыг дараах тэмдэгтүүдээр бэлтгэдэг: \x00, \n, \r, \, ', " болон \x1a. Энэ функц нь MySQL руу query илгээхээс өмнө өгөгдлийг аюулгүй болгоход ашигладаг. PostgreSQL-д зориулсан pg_escape_string() зэрэг PHP –д олон төрлийн өгөгдлийн санд зориулсан функцүүд байдаг.

Хээ шалгах засварлах

Хэрэв өгөгдсөн төрөлд тэдгээрийн утга хүчинтэй төлөөлөл байгаа бол бүхэл тоо, бутархай, бүүлэн, тэмдэгт параметрууд шалгагдах боломжтой.

Өгөгдлийн сангийн зөвшөөрөл засварлах

Вэб програмын ашигладаг нэвтрэх хэсгийн өгөгдлийн сан дээр зөвшөөрлийг зевхен хэрэгцээнд нь хязгаарлах нь веб програм дахь аливаа алдаануудыг ашиглах SQL тарилгын халдлагуудын үр нөлөөг багасгахад тусална.

Жишээ засварлах

  • 2002 оны 2-р сард Jeremiah Jacks Guess.com -г SQL тарилга халдлагад өртөж болзошгүй байсныг илрүүлсэн. [4]
  • 2005 оны 11-р сарын 1-ний өдөр өсвөр насны хакер Tech Target групээс гаргадаг Тайваны мэдээллийн аюулгүй байдлын сэтгүүлийн сайтын сайт руу SQL тарилгыг ашиглан нэвтэрч, хэрэглэгчдийн мэдээллийг хулгайлсан. [5]
  • 2006 оны 1-р сарын 13-нд Оросын компьютерийн гэмт хэрэгтнүүд Род Айландын засгийн газрын вэбсайтрууу орж, төрийн агентлагуудтай онлайнаар бизнес эрхэлж буй хувь хүмүүсээс зээлийн картын мэдээллийг хулгайлсан.[6]
  • 2006 оны 3-р сарын 29-нд хакер албан ёсны Энэтхэгийн засгийн газрын аялал жуулчлалын сайтын SQL тарилгын сул талыг илрүүлсэн..[7]
  • 2007 оны 6-р сарын 29-нд компьютерийн гэмт хэрэгт SQL injection ашиглан Microsoft UK вэбсайтыг устгасан.[8][9]
  • 2008 оны 7-р сард Касперскийгийн Малайзын сайтыг SQL тарилга ашиглан "m0sted" хакерын бүлэг хакерджээ.
  • 2008 оны 5-р сард Хятад дахь серверийн ферм нь автомат квериг автоматжуулсан SQL тарилгын халдлагад өртөмтгий SQL сервер вэбсайтуудыг илрүүлэхийн тулд Google-ийн хайлсын системийг ашигласан. [10][11]
  • 2009 оны 8-р сарын 17-нд АНУ-ын Хууль зүйн яам АНУ-ын иргэн Альберт Гонзалес болон хоёр орос нэр нь үл мэдэгдэх иргэнийг 130 сая кредит картын дугаарыг SQL тарилга халдлагыг ашиглан хулгайлсан хэргээр ялласан.[12]
  • 2009 оны арванхоёрдугаар сард халдагч 32 сая хэрэглэгчдийн нэр, нууц үг агуулсан RockYou plaintext мэдээллийн санг SQL injection халдлага ашиглан халдсан байна.[13]
  • 2010 оны 7-р сарын 24-нээс 26-ны хооронд Японд болон Хятад улсын довтолгоонууд нь онлайн сүлжээнд холбогдсон томоохон дэлгүүрүүдээр ажилладаг Осака хотод байрладаг Neo Beat компаний зээлийн картын мэдээллийг интернетээр цацахын тулд SQL injection ашигласан. Довтолгооны сүлжээнд нь Izumiya Co, Maruetsu Inc, Ryukyu Jusco Co. зэрэг 7 бизнесийн түншүүд өртсөн. Мэдээллийн хулгай нь 12,191 хэрэглэгчидэд нөлөөлсөн байна. 2010 оны 8-р сарын 14-ний байдлаар гуравдагч этгээд Хятадын бараа, үйлчилгээ худалдан авахад 300 гаруй төрлийн зээлийн карт ашиглагдаж байна гэж мэдээлсэн.
  • 2010 оны 11-р сарын 8-нд Британий Хааны Тэнгисийн цэргийн вэбсайт нь SQL injection ашигласан TinKode нэртэй Румын хакераар эвдэгдсэн.[14][15]
  • 2011 оны 3-р сарын 27-ны өдөр mysql.com, MySQL-ийн албан ёсны вэб хуудсийг хакер SQL сохор тарилга ашиглан хэлэлцээр хийсэн.[16]
  • 2012 оны долдугаар сард хакерын бүлэг Yahoo-аас 450,000 нэвтрэх эрх хулгайлсан гэж мэдэгдсэн байна. Бүлэг нь нэгдэлд суурилсан SQL тарилгын аргыг ашиглан Yahoo-ийн аюулгүй байдлыг зөрчсөн байна.[17][18]
  • 2013 оны 6-р сарын 27-нд хакерын бүлэг "RedHack" нь Словакийн захиргааны сайтыг эвдсэн.[19] Тэд ус, хий, Интернет, цахилгаан, телефон утасны компаниудад өр төлбөрийг арилгах боломжтой гэж зарласан. Үүнээс гадна, тэд өглөө эрт бусад өртэй хүмүүсийг нэвтэрж, өрийн мэдээллийг арилгахын тулд админ хэрэглэгчийн нэр, нууц үгийг нийтэлжээ. Тэд Твиттерээс энэ мэдээллээ зарласан.[20]
  • 2014 оны 3-р сарын 7-нд Жонс Хопкинсын их сургуулийн албан тушаалтнууд "Биотехнологийн Интернетийн Серверүүд" нь "Хьюки" нэртэй Anonymous хакерын "SQL тарилга" халдлагад өртөж, "хакерчивист" группын "РaptorSwag" Хакерууд 878 сурагч, ажилтнуудын хувийн мэдээллийг задалсан.[21]
  • 2015 оны аравдугаар сард SQL тарилга халдлага нь Британий харилцаа холбооны компани TalkTalk-ийн серверүүдээс 156,959 хэрэглэгчдийн хувийн нарийн мэдээллийг хулгайлахад ашиглагдсан.[22]

Уншвал зохих засварлах

Холбоос засварлах

  1. "WHID 2009-1: Gaza conflict cyber war". Xiom. Retrieved 2011-06-03.
  2. [1] Archived June 18, 2009, at the Wayback Machine.
  3. "Third Wave of Web Attacks Not the Last". Dark Reading. Retrieved 2012-07-29.[permanent dead link]
  4. "Guesswork Plagues Web Hole Reporting". SecurityFocus. March 6, 2002.
  5. "WHID 2005-46: Teen uses SQL injection to break to a security magazine web site". Web Application Security Consortium. November 1, 2005. Retrieved December 1, 2009.
  6. "WHID 2006-3: Russian hackers broke into a RI GOV website". Web Application Security Consortium. January 13, 2006. Retrieved May 16, 2008.
  7. "WHID 2006-27: SQL Injection in incredibleindia.org". Web Application Security Consortium. March 29, 2006. Retrieved March 12, 2010.
  8. Robert (June 29, 2007). "Hacker Defaces Microsoft U.K. Web Page". cgisecurity.net. Retrieved May 16, 2008.
  9. Keith Ward (June 29, 2007). "Hacker Defaces Microsoft UK Web Page". Redmond Channel Partner Online. Archived from the original on Арван хоёрдугаар сар 23, 2007. Retrieved May 16, 2008. {{cite web}}: Check date values in: |archive-date= (help)
  10. Sumner Lemon, IDG News Service (May 19, 2008). "Mass SQL Injection Attack Targets Chinese Web Sites". PCWorld. Retrieved May 27, 2008.[permanent dead link]
  11. Michael Zino (May 1, 2008). "ASCII Encoded/Binary String Automated SQL Injection Attack". Archived from the original on Зургадугаар сар 1, 2008. Retrieved Арван нэгдүгээр сар 5, 2017. {{cite web}}: Check date values in: |access-date= and |archive-date= (help)
  12. "US man 'stole 130m card numbers'". BBC. August 17, 2009. Retrieved August 17, 2009.
  13. O'Dell, Jolie (December 16, 2009). "RockYou Hacker - 30% of Sites Store Plain Text Passwords". New York Times. Retrieved May 23, 2010.
  14. Royal Navy website attacked by Romanian hacker BBC News, 8-11-10, Accessed November 2010
  15. Sam Kiley (November 25, 2010). "Super Virus A Target For Cyber Terrorists". Retrieved November 25, 2010.
  16. "MySQL.com compromised". sucuri.
  17. Chenda Ngak. "Yahoo reportedly hacked: Is your account safe?", CBS News. July 12, 2012. Retrieved July 16, 2012.
  18. http://www.zdnet.com/450000-user-passwords-leaked-in-yahoo-breach-7000000772/
  19. "RedHack Breaches Istanbul Administration Site, Hackers Claim to Have Erased Debts".
  20. "Redhack tweet about their achievement".
  21. "Archive copy". Archived from the original on 2014-04-14. Retrieved 2017-11-05.{{cite web}}: CS1 maint: archived copy as title (link)
  22. "Archive copy". Archived from the original on 2016-10-24. Retrieved 2017-11-05.{{cite web}}: CS1 maint: archived copy as title (link)

Гадаад холбоосууд засварлах