Thursday, December 27, 2012

SQL Injection Attack



sql injection ကို သံုးဖို ့ တၿခားဘာ tool မွ ေထြေထြထူးထူးမလိုပါဘူး ။ browser တခုရွိေနရင္ပဲ ရပါၿပီ ။ sql injection attack ကို စတင္ေလ့လာေတာ့မယ္ဆိုရင္ sql database နဲ ့ query ေတြအေၾကာင္းကို မသိလို ့မၿဖစ္ပါဘူး ။ဒါေၾကာင့္ ဒီ အေၾကာင္းက အရင္ စတင္ပါ့မယ္ ။

website တခုကို စတင္ တည္ေဆာက္ေတာ့မယ္ဆိုရင္ database ဆိုတာက အေရးၾကီးတဲ့ အစိတ္အပိုင္းတခုပါပဲ ။ ဘာလို ့ဆိုေတာ့ website ရဲ ့ data ေတြ ၊ user ေတြ ၊ post ေတြ စတဲ့ အေရးၾကီးအခ်က္အလက္ေတြကို စုစည္းထားတဲ့ေနရာၿဖစ္လို့ပါ။ ေနာက္အပိုင္းက်မွေသခ်ာရွင္းလင္းၿပပါ့မယ္ ။ database တခုမွာ table တခုကေန မ်ားစြာ အထိပါဝင္နိုင္ပါတယ္ ။ table တခုစီမွာ သက္ဆိုင္ရာ coloum ေတြရွိၿပီး coloum တခုစီရဲ့ေအာက္မွာdata ေတြပါဝင္တဲ့ row ( တခ်ိဳ့က record လို ့ေခၚပါတယ္) ေတြရွိပါတယ္ ။ ဒီေလာက္ပဲ မွတ္ထားပါအံုး ။

ကဲ...sql အေၾကာင္း စလိုက္ၾကရေအာင္ ။ sql ဆိုတာ sever scripting language တခု ပါ ။ database တခုကို query ေတြ သံုးၿပီး table ေတြကို ဖ်က္မယ္၊ ၿပင္မယ္၊ထပ္တိုးမယ္။ data ေတြကို ဖ်က္မယ္၊ၿပင္မယ္၊ထပ္တိုးမယ္။ စတာေတြကို sql query ေတြသံုးၿပီး ၿပဳၿပင္ေၿပာင္းလဲတဲ့ language တခုပါ ။ ဥပမာ ... vulnerability ရွိေနတဲ့ ဆိုဒ္တခုကို injection ထိုးလို ့ ေပါက္ၿပီဆိုရင္ site admin ရဲ့ acc ေတြကိုဖ်က္မယ္ ၿပင္မယ္ username နဲ ့ password ေတြကိုၿပင္မယ္၊ အစားထိုးမယ္ ။ ဒါေတြကို လုပ္ေဆာင္ၾကရပါမယ္ ။ အဲလိုလုပ္ေဆာင္ဖို ့ဆိုရင္ အခုေၿပာမယ့္ sql query ေတြကိုနားလည္ထားရပါမယ္ ။တကယ္လို ့ မိမိ site ကို hack ခံထိၿပီဆိုပါေတာ့၊ database ကို ဝင္လို ့ရေသးရင္ ဒီ query ေတြသံုးၿပီး ၿပန္ယူနိုင္ပါတယ္။ေနာက္ဆံုး မိမိဆိုဒ္ကို injection ၿပန္ထိုးၿပီး ၿပန္ယူနိုင္ပါတယ္ ။ ဒီေတာ့ ဒီေနရာကစၿပီး ေသခ်ာနားလည္ေအာင္ ေလ့လာရမွာၿဖစ္ပါတယ္ ။

SQL select statement ကေန စၾကရေအာင္ ... ေအာက္က query ေလးကိုၾကည့္ပါ ။

select coloum_name
from table_name

ဒါက column ေတြကိုၿပသေအာင္လုပ္တဲ့ query ပါ ။ column_name ေနရာမွာ column ရဲ ့ အမည္ကို ထည့္ရမွာၿဖစ္ၿပီး column အားလံုးကိုေခၚၾကည့္မယ္ဆိုရင္ * (ခေရပြင့္ သေကၤတ) ေလးကိုထည့္ေပးပါ ။ဒီေကာင္က အားလံုးကိုမွတ္ပါဆိုတဲ့ အဓိပၸါယ္ပါ ။ table_name ေနရာမွာ table ရဲ ့အမည္ကို ေရးရမွာပါ။

ကၽြန္ေတာ္တို ့ database က table တခုရဲ ့ အမည္က smf_1users ဆိုပါစို ့ဗ်ာ ။ smf_1users ဆိုတဲ့ table ရဲ့ ေကာ္လံေတြနဲ့ data ေတြကို ေခၚၾကည့္ခ်င္တယ္ဆိုရင္.............

select *
from smf_1users

ဒါဆိုရင္ smf_1users ဆိုတဲ့ table ရဲ ့ ေကာ္လံ အားလံုးနဲ့ row အားလံုး က်လာပါလိမ့္မယ္ ။လက္ေတြ့လုပ္ေဆာင္ၾကည့္ခ်င္တယ္ဆိုရင္ မိမိ database ရဲ ့ php my admin ကိုသြားပါ ။ အဲဒီမွာ query ဆိုတဲ့ tab ကို နွိပ္ၿပီး command ေတြကို ေရးၿပီး ေလ့က်င့္နိုင္ပါတယ္ ။ database မရွိတဲ့သူမ်ားကေတာ့ w3school.com မွာေလ့က်င့္ဖို ့ေနရာေပးထားပါတယ္။ အေသးစိတ္လဲေရးသားထားပါတယ္ ။web သမားတိုင္း w3school ဆိုရင္သိၾကမွာပါ ။ beginner မ်ားကေတာ့ www.w3school.com လို ့ ရိုက္ၿပီး ေလ့လာနိုင္ပါတယ္ ။

ဒီတခါေတာ့ SQL where clause အေၾကာင္းေလးေလ့လာၾကရေအာင္......အသံုးၿပဳမယ့္ syntax ေလးကေတာ့ ဒီလိုပါ။

select*
from table_name
where column_name + operator +values

ထံုးစံအတိုင္း select * ဆိုတာကေတာ့ ေကာ္လံေတြ အကုန္လံုးကို ေခၚၾကည့္ဖို့ command ပါ ။ table_name ေနရာမွာ မိမိၾကည့္မယ့္ table ရဲ ့အမည္ကိုထည့္ပါ ။ where ဆိုတဲ့ command ကေတာ့ ေကာ္လံတခုရဲ ့ ေအာက္ကတိတိက်က်သိထားတဲ့ row တခုကို ေခၚၾကည့္ဖို့ပါ ။ ရွဳပ္သြားၿပီထင္ပါတယ္။ေအာက္မွာထပ္ရွင္းပါ့မယ္။

( စာၾကြင္း ။ ။ Sql query command ေတြကိုေရးတဲ့အခါမွာ တိတိက်က်ေရးသားရမယ္လို ့ မသတ္မွတ္ထားပါဘူး ။ javascript variables ေတြကို ေရးတဲ့အခါ မွာ C အၾကီးနဲ့c အေသးမတူပါဘူး ။ js ဟာ sensitive ၿဖစ္ပါတယ္ ။ စာလံုးအၾကီးအေသး ေသခ်ာခြဲၿခားေရးရပါတယ္ ။ sql ကေတာ့ no sensitive ပါ ။ SELECT နဲ့ select တူတူပါပဲ ။ ဒါေလးတခ်က္ေလာက္သိထားရပါမယ္။ )

ကၽြန္ေတာ္တို့ SMF_1USERS ဆိုတဲ့ TABLE မွာ user ေတြက ေထာင္ခ်ီရွိတယ္ဆိုပါေတာ့ဗ်ာ . ဆိုလိုတာက row ေတြအမ်ားၾကီးရွိတယ္ဆိုပါေတာ့ ။ ေကာ္လံ name ေတြကလဲ အမ်ားၾကီးပဲ ။ ကၽြန္ေတာ္တို ့ ၿမင္ခ်င္တာက admin ရဲ့ data အခ်ိဳ့ပဲဗ်ာ ။ ဆိုလိုတာက admin ရဲ့ username ၊ password ၊ email စတာေတြေပါ့ ။ ေကာ္လံ name ေတြအမ်ားၾကီးထဲက ကၽြန္ေတာ္တို ့ေခၚၾကည့္မွာက usernameရွိတဲ့ user_name ၊ password ရွိတဲ့ user_password၊ email ရွိတဲ့ user_email ဆိုတဲ့ ေကာ္လံေတြဆိုပါစို ့ ။ ဒါ နမူနာေၿပာတာေနာ္ ။ site တခုနဲ့တခုအမည္ေပးပံုၿခင္းတူခ်င္မွတူမွာပါ ။ မိတ္ေဆြတို ့က ေမးပါလိမ့္မယ္ ။ သူမ်ား site ရဲ ့ ေကာ္လံ name ေတြကို ဘယ္လို သိမွာလဲလို ့ ..... ဟုတ္ကဲ့.... site မွာ vulnerability ရွိလို ့ injection ထိုးၿပီး ေပါက္ၿပီဆိုရင္ၿဖင့္ query ေတြ သံုးၿပီး သိေအာင္လုပ္နိုင္ပါတယ္။ေနာက္ပိုင္းေရးသားခ်က္ေတြမွာေတြ ့ရမွာပါ ။အခုစကားစပ္မိလို့ေၿပာတာပါ။ကဲ...ဆက္ရေအာင္....

select user_name, user_password, user_email
from smf_1users
where user_name='admin'

ဒါဆိုရင္ user_name ဆိုတဲ့ ေကာ္လံေအာက္မွာ admin ဆိုတဲ့ စာလံုးရွိတဲ့ row တခုပဲ က်လာပါလိမ့္မယ္ ။ က်န္တဲ့ user ေတြရဲ့ row ေတြ က်လာမွာမဟုတ္ပါဘူး ။ query command ကို ၿပန္ရွင္းရရင္ select user_name, user_password, user_email ဆိုတာက user_name, user_password, user_email ဆိုတဲ့ ေကာ္လံ 3 ခုကိုပဲ မွတ္ၿပီး ၿပပါလို ့ဆိုတာပါ ။ line 2 ကေတာ့ သိၿပီးသားပါ ။ table ကိုညႊန္းတာပါ ။ line 3 ကေတာ့ user_name ဆိုတဲ့ ေကာ္လံဟာ admin ဆိုတဲ့ တန္ဖိုးရွိတယ္လို ့ = operator နဲ့ ေၾကၿငာလိုက္တာပါ ။ ဆိုလိုတာက user_name ေကာ္လံေအာက္မွာ admin ဆိုတဲ့ value ရွိေနတဲ့ row တခုပဲ မွတ္ၿပီး ၿပပါလို ့ command ေပးလိုက္တာပါ ။ operators သေကၤတေတြနဲ့ အသံုးၿပဳပံုေတြ ကိုေတာ့ ကၽြန္ေတာ္ဆက္လက္ေရးသားမယ့္ အပိုင္းမွာ ေလ့လာၾကပါ ။ where clause အခန္းဟာ အေရးၾကီးၿပီး အသံုးမ်ားသလို operator ေတြနဲ့ တြဲသံုးပံုေတြကိုပါေသခ်ာသိထားမွ အသံုးခ်နိုင္မွာၿဖစ္လို ့ ေသခ်ာေလ့လာရမယ့္ အခန္းၿဖစ္ပါတယ္ ။

where clause နဲ့ operator ေတြ တြဲသံုးတဲ့ အပိုင္းကို ဆက္ၾကရေအာင္.... တြဲသံုးရတဲ့ operator ေတြကို ေအာက္မွာအရင္ က်က္မွတ္လိုက္ပါ ။ operator သေကၤတ ေတြေနာက္မွာ သံုးတဲ့ values တန္ဖိုးေတြကိုေရးတဲ့အခါမွာ စာလံုး (word) ေတြဆိုရင္ single quote (') ထည့္ေပးရပါမယ္ ။ ကိန္းဂဏန္းေတြဆိုရင္ single quote ( ' ) ထည့္စရာမလိုပါဘူး ။ဒီအခ်က္မွာမွားယြင္းရင္ query လုပ္တဲ့အခါ အလုပ္လုပ္မွာမဟုတ္ပါဘူး ။

Operator Description

= Equal
<> Not equal > Greater than
< Less than
>= Greater than or equal
<= Less than or equal BETWEEN Between an inclusive range LIKE Search for a pattern IN If you know the exact value you want to return for at least one of the columns တခ်ိဳ ့ version ေတြမွာ < > ကို != ဒီလိုေရးပါတယ္ ။ ဒါေတြကို w3school ကပဲ အလြယ္ကူးေပးလိုက္တယ္ေနာ္..တခုခ်င္းကို where clause နဲ့ ဘယ္လိုတြဲသံုးရမယ္ဆိုတာကို ေအာက္မွာေရးသားပါ့မယ္ ။

= operator

ဒီေကာင္ကို သံုးပံုေလးေအာက္မွာၾကည့္ပါ ။ အေပၚမွာလဲ ရွင္းၿပီးပါၿပီ .. ဒီမွာ ထပ္ၿပီးရွင္းခ်င္ပါတယ္ ။ post ေတြမ်ားေအာင္ေရးတာမဟုတ္ပဲ... က႑ ေလးအလိုက္ေရးေတာ့ ဖတ္သူ ၿမင္သာၿပီး မွတ္ရတာလြယ္ကူေစမွာမို ့ပါ ။

select*
from table_name
where column_name= value

line 1 နဲ့ line 2 က သိၿပီးသားပါ ..မရွင္းေတာ့ပါဘူး ။ line 3 ကိုရွင္းပါ့မယ္ ။ where column_name ဆိုတာကေတာ့ မိမိေခၚၾကည့္မယ့္ table က မိမိလိုခ်င္တဲ့ data ရွိမယ့္ column_name ကို ရည္ညႊန္းတာပါ ။ တိတိက်က်ထပ္ညႊန္းဖို ့ = operator ကို သံုးလိုက္ပါတယ္ ။ ဆိုလိုတာက table ရဲ့ ေကာ္လံတခုေအာက္က တိတိက်က် data တခုရွိတဲ့ row ကို မွတ္ၿပီး ၿပခိုင္းလိုက္တာပါ ။ ဥပမာ...ၾကည့္ပါ ။

ကၽြန္ေတာ္တို ့ smf_1users ဆိုတဲ့ table မွာ user_name ဆိုတဲ့ ေကာ္လံရွိေနတာေတြ ့ၿပီဆိုပါစို ့ဗ်ာ ။ အဲဒီေအာက္မွာရွိတဲ့ admin ဆိုတဲ့ user ရဲ ့ data ေတြကိုပဲၾကည့္ခ်င္တယ္ ။

select*
from smf_1users
where user_name='admin'

ဒါကေတာ့ query command ပါ ။ = operator ကို သံုးထားတဲ့အတြက္ ဒီ column ေအာက္မွာ admin ဆိုတဲ့ value တခု ေသခ်ာရွိေနရပါမယ္ ။ = ဆိုတာ ထပ္တူညီသေကၤတကိုဗ် .. စာလံုးတလံုးေတာင္ လြဲလို့မရပါဘူး ။ လြဲတာနဲ့ အလုပ္မလုပ္ေတာ့ပါဘူး ။ ဒီ operator က အသံုးဝင္ပါတယ္ ။ ကၽြန္ေတာ္တို ့ စီးပြားေရးလုပ္ငန္းအတြက္ မိမိ ေဖာက္သည္ေတြရဲ ့ အခ်က္အလက္ေတြကို database တခုေဆာက္ၿပီး customers လို ့ table name ေပးထားမယ္ ... column 3ခု ထားမယ္ဗ်ာ ... ေဖာက္သည္ရဲ ့ အမွတ္စဥ္ နံပါတ္က တခု ၊ အမည္ကတခု ၊ လိပ္စာ address က တခု ေပါ့ဗ်ာ ... ဒီမွာ ကၽြန္ေတာ္တို ့က U Win ဆိုတဲ့ ေဖာက္သည္ရဲ ့ လိပ္စာကို အေရးတၾကီး သိဖို ့လိုအပ္လာၿပီဗ်ာ ... ခက္တာက သူရဲ့ အမွတ္စဥ္ကို ေမ့ေနၿပီ row ဘယ္ေလာက္မွာ ရွိလဲမသိေတာ့ဘူး ။ တခုခ်င္းရွာရေအာင္ကလဲ ROW ေတြက ေထာင္ေသာင္းခ်ီေနတာကိုဗ် .။ အခ်ိန္အဲေလာက္မေပးနိုင္ဘူး ။ ဒါေပမယ့္ သူ ့အမည္ကိုေတာ့ ကၽြန္ေတာ္တို ့ သိေနတာပဲ .. ဒါေၾကာင့္ QUERY နဲ့ရွာမယ္ဗ်ာ .. ။

SELECT*
FROM CUSTOMERS
WHERE CUSTOMER_NAME='U WIN'

ဒါဆိုရင္ CUSTOMER_NAME ေကာ္လံေအာက္မွာ ရွိေနတဲ့ U WIN ဆိုတဲ့ VALUE ရွိေနတဲ့ ROW တခုပဲ က်လာပါလိမ့္မယ္ ။ ဒါဆို သူလိပ္စာကို သိနိုင္ၿပီေပါ့ ။ ဘာလို ့လဲဆိုေတာ ့ ေကာ္လံေတြအကုန္က်လာေအာင္လို ့ SELECT* ကို သံုးထားတယ္ေလ ... ။ ဒီေလာက္ဆိုရင္ = OPERATOR ကို သံုးနည္းနဲ့ သေဘာသဘာဝကို နားလည္ေလာက္ၿပီထင္ပါတယ္ ။ဒီလိုေရးၿပရတာကလဲ စာဖတ္သူ ေတြးတတ္ေအာင္ပါ ။ ခ်ဲ့နိုင္သေလာက္ခ်ဲ့ၿပီးေတြးရပါ့မယ္ ။ SQL INJECTION ဟာ ေတြးနိုင္သူတာ ေအာင္ၿမင္မွဳရနိုင္ပါတယ္ ။ ခ်ဲ့ထြင္ေတြးေတာၿပီး သံုးစြဲၾကရပါမယ္ ။


Credit: Titegyithar

0 comments:

Related Posts Plugin for WordPress, Blogger...