SQL Injection Attack ကို ဘယ္လို ကာကြယ္ၾကမလဲ.pdf

How to prevent attack from SQL Database Attacking

SQL Injection ကို ကာကြယ္ရာတြင္ User Input တြင္ လက္ခံေသာ characters မ်ားကို ကန္႔သတ္ထားျခင္း၊ data access အတြက္ သတ္မွတ္ထားေသာ SQL query မ်ားကို သံုးျခင္း၊ database တြင္ ခြင့္ျပဳခ်က္ကန္႔သတ္ခ်က္မ်ား႐ွိသည့္ အနည္းဆံုး privileged account တစ္ခုကိုသံုးျခင္း အစ႐ွိသည့္ေျဖ႐ွင္းနည္းမ်ားျဖင့္ ေျဖ႐ွင္းရပါမည္။ 
User တစ္ေယာက္က SSN လို႔ အမည္ေပးထားတဲ့ text box တြင္ ေအာက္တြင္ျပထားေသာ String ကို ႐ိုက္လိုက္တဲ့အခါ ဘယ္လိုျဖစ္မလဲ စဥ္းစားၾကည့္ပါ။ 
' ; DROP DATABASE pubs --
၄င္း string ကို text box တြင္ ထည့္လိုက္ျခင္းျဖင့္ ၄င္း application တြင္ ေအာက္မွာေဖာ္ျပထားေသာ Dynamic SQL Statement (သို႔) Store Procedure (SQL statement တစ္ခု ကဲ့သို႔ အတြင္းပိုင္းတြင္ အလုပ္လုပ္ေသာ) တို႔မွာ အလုပ္ လုပ္သြားပါတယ္။




The attacking of SQL 

 // Use stored procedures
    SqlDataAdapter myCommand = new SqlDataAdapter(
         "LoginStoredProcedure '" + SSN.Text + "'", myConnection);
Code ကို run သည့္အခါ ၄င္း code တြင္ user ၏ အခ်က္အလက္ကို ထည့္ၿပီး ေအာက္ပါ SQL Statement တစ္ခုကို ျဖစ္ေပၚေစျခင္းသည္ Developer ၏ ရည္႐ြယ္ခ်က္ျဖစ္ပါသည္။
    SELECT au_lname, au_fname FROM authors WHERE au_id = '172-32-9999'
  1. Parameter Batching ကို သံုးျခင္း 

အဓိက လြဲေခ်ာ္တဲ့ စိတ္ကူးကေတာ့ single round trip တစ္ခုတြင္ server ဆီသို႔သြားတဲ့ a batch of statement ကို ပို႔ရန္ SQL statement အေျမာက္အမ်ားႏွင့္ ဆက္စပ္လွ်င္ parameter မ်ားကို အသံုးမျပဳႏိုင္ပါ။ သို႔ေသာ္လည္း parameter name မ်ားမွာ မထပ္ဘူးဆိုတာ ေသခ်ာလွ်င္ ဒီ နည္းပညာကို သံုးႏိုင္ပါတယ္။ SQL text concatenation တြင္ unique parameter ကို အေသအခ်ာ သံုးျခင္းျဖင့္ ေအာက္တြင္ ျပထားသလို အလြယ္တကူ လုပ္ႏိုင္ပါတယ္။ 
သို႔ေသာ္လည္း Code တြင္ user ၏ malicious ပါ၀င္သည့္ အခ်က္အလက္ကို ထည့္ၿပီး ေအာက္ပါ query ကို ျဖစ္ေပၚေစပါသည္။ 
SQL injection attacks မ်ားကို တုန္႔ျပန္ရန္ လိုအပ္ခ်က္မ်ားမွာ- 
- Input data မ်ားကို ကန္႔သတ္ထားရန္ႏွင့္ ေသခ်ာစစ္ေဆးပါ။ type , length, format ႏွင့္ range မ်ားကို စစ္ျခင္းျဖင့္ သန္႔စင္သည့္ data ျဖစ္ရန္ စစ္ေဆးရပါမည္။ 
- Data access အတြက္ လံုၿခံဳစိတ္ခ်ရတဲ့ SQL parameters မ်ားကို သံုးပါ။ SQL paramenters မ်ားအား stored procedures (သို႔) SQL command strings မ်ားကို တည္ေဆာက္သည့္ dynamically ေနရာမ်ားတြင္လည္း သံုးႏိုင္ပါသည္။ 
   - SQLParameterCollection ကဲ့သို႔ Parameter collections မ်ားသည္ type စစ္ျခင္းႏွင့္ Length validation တို႔ကို ေထာက္ပံ့သည္။ parameters collection တစ္ခုကို သံုးလွ်င္ input ကို တိက်တဲ့တန္ဖိုးတစ္ခုကဲ့သို႔ သံုးၿပီး SQL Server သည္ excutable code ကဲ့သို႔ ၄င္းကို မသံုးပါ။ parameter collection တစ္ခုကို သံုးျခင္းျဖင့္ type ႏွင့္ length စစ္ျခင္းမ်ားကို အတည္ျပဳႏိုင္သည့္ အက်ဳိးေက်းဇူးရွိပါသည္။ Values outside of the range trigger an exception. ၄င္းမွာ နက္နဲတဲ့ ကာကြယ္မႈ ဥပမာေကာင္းတစ္ခုျဖစ္ပါသည္။
- Database တြင္ permissions ကန္႔သတ္ထားေသာ account တစ္ခုကို သံုးပါ။ အထူးသျဖင့္ database တြင္ stored procedures မ်ားကို ေ႐ြးခ်ယ္ဖို႔ လုပ္ေဆာင္ႏိုင္သည့္ permissions မ်ားကိုသာ သေဘာတူသင့္ၿပီး table မ်ားကို တိုက္႐ုိက္ လက္ခံမႈမ်ဳိး မ႐ွိသင့္ပါ။
- Database Error Information မ်ားကိုထုတ္ေဖာ္ေျပာျခင္းမ်ဳိးကို ေ႐ွာင္ပါ။ database error မ်ား၏ အေသးစိတ္ error မ်ားကို user မ်ားအား ထုတ္ေဖာ္မေျပာမိေစရန္ သတိျပဳပါ။
Special input characters မ်ားကို ေျဖ႐ွင္းရန္ escape routines ကို သံုးျခင္း
Dynamic SQL ႏွင့္အတူ Special input characters မ်ားမွာ threat တစ္ခုအျဖစ္ ဟန္ေဆာင္ပါတယ္။ parameterized SQL ကို သံုးတဲ့အခါမွာေတာ့ မဟုတ္ပါဘူး။ ေအာက္တြင္ေဖာ္ျပတဲ့ code အခ်ဳိ႕က SQL Server ကို အႏၱရာယ္မ႐ွိေအာင္ Escape routines တြင္ Special meaning ျဖစ္တဲ့ characters မ်ားကို escape character တစ္ခုထည့္ထားပါတယ္။ 
    private string SafeSqlLiteral(string inputSQL)
  2.        Error information ေတြကို ေဖာ္ျပျခင္းမွ ေ႐ွာင္ျခင္း
Error မ်ားကို ဖမ္းဖို႔ exception handling ပံုစံကို သံုးၿပီး client ဘက္တြင္ ၄င္း error မ်ားကို ေဖာ္ျပျခင္း ကာကြယ္ပါ။ အေသးစိတ္ error information မ်ားကို Local တြင္ Log အေနနဲ႔ထားပါ။ ဒါေပမယ့္ client ဘက္မွာေတာ့ အေသးစိတ္ error မ်ားကို မျပပါႏွင့္။ 
User က database ကို ခ်ိတ္ဆက္စဥ္ error ေပၚေပါက္မယ္ဆိုလွ်င္ user မ်ားသို႔ error nature မ်ားကို ကန္႔သတ္ သတ္မွတ္ထားမႈ ထား႐ွိပါ။ data ေတြကို လက္ခံရန္ ဆက္စပ္ေနတဲ့ သတင္းအခ်က္အလက္မ်ားႏွင့္ database error မ်ားကို ေဖာ္ျပမယ္ဆိုလွ်င္ သင့္ database security ကို compromise လုပ္ရန္ သံုးႏိုင္တဲ့ အသံုး၀င္တဲ့ သတင္းအခ်က္ႏွင့္အတူ malicious user တစ္ေယာက္ကို ေထာက္ပံ့ႏိုင္ပါတယ္။ Attacker မ်ားက SQL query တစ္ခုကို deconstruct လုပ္ရန္ အကူအညီျဖစ္မည့္ error message အေသးစိတ္တြင္႐ွိတဲ့ သတင္းအခ်က္အလက္မ်ားကို အသံုးျပဳၿပီး သူတို႔သည္ malicious code ေတြႏွင့္အတူ ထိုးေဖာက္ဖို႔ ႀကိဳးစားေနၾကပါတယ္။ error message အေသးစိတ္ တစ္ခုဟာ connection string, SQL server name သို႔မဟုတ္ table ႏွင့္ database naming conventions မ်ားကဲ့သို႔ တန္ဖိုး႐ွိတဲ့ သတင္းအခ်က္အလက္ကို ထုတ္ေဖာ္ႏိုင္ပါတယ္။ 

မူရင္း  : http://msdn.microsoft.com


No comments:

Post a Comment