១. និយមន័យ
SQL injection ជាប្រភេទ injection attack ដែលធ្វើការវាយប្រហារចូលលួចទិន្នន័យតាមរយៈ SQL Statement ។ ឧទាហរណ៍ក្នុងជីវភាពជាក់ស្តែង គឺវាស្រដៀងទៅនឹងការចាក់ថ្នាំដែលមានលាយសារជាតិពុលចូលទៅក្នុងខ្លួនមនុស្សក្នុងគោលបំណងអាក្រក់ណាមួយយ៉ាងដូច្នោះដែរ ប៉ុន្តែនៅទីនេះគឺគេធ្វើទៅលើការលួចទិន្នន័យនៅលើវ៉េបសាយដោយចាក់បញ្ចូលនូវ malicious statement។
រាល់ Statements ទាំងឡាយដែលហេគឃ័រប្រើប្រាស់នឹងត្រូវចូលទៅគ្រប់គ្រង Database Server ដែលស្ថិតនៅពីក្រោយ Web application របស់យើង។ អ្នកវាយប្រហារ ឬហេគឃ័រអាចប្រើប្រាស់វិធីនេះ ដើម្បីធ្វើការរំលងនូវប្រព័ន្ធសុវត្ថិភាពរបស់ application។ ពួកគេអាចចេញចូល Webpage ឬ Website របស់យើងដោយមិនចាំបាច់សុំការអនុញ្ញាត ឬស្នើសុំសិទ្ធិអ្វីទាំងអស់ ហើយថែមទាំងអាចទាញយកឯកសារចេញពី Database របស់យើងបានយ៉ាងងាយស្រួល។ ពួកគេក៏អាចប្រើប្រាស់ SQL injection ក្នុងការបញ្ចេញ បញ្ចូល កែប្រែ ឬលុបទិន្នន័យពី database បានផងដែរ។
២. ផលប៉ះពាល់
ចន្លោះប្រហោងនៃ SQL injection អាចប៉ះពាល់ទៅគ្រប់វ៉េបសាយទាំងឡាយណា ដែលប្រើប្រាស់ SQL Database ដូចជា MySQL, Oracle, SQL Server, និងSQL Database ផ្សេងៗទៀត។ ហេគឃ័រ អាចនឹងប្រើប្រាស់SQL injection ដើម្បីចូលទៅកាន់ Database ដោយមិនចាំបាច់សុំការអនុញ្ញាត រួចធ្វើការលួចយកទិន្នន័យសំខាន់ៗដែលមានដូចជាៈ ព័ត៌មានអតិថិជន ព័ត៌ផ្ទាល់ខ្លួន ឯកសារពាណិជ្ជកម្មឬជំនួញ កម្មសិទ្ធបញ្ញា កុងធនាគារ និងព័ត៌មានផ្សេងៗទៀតដែលពួកគេគិតថាវាមានប្រយោជន៍។
SQL injection ជាវិធីសាស្រ្តចំណាស់មួយ ត្រូវបានប្រើច្រើន និងគ្រោះថ្នាក់បំផុតនៅលើ web application ទាំងឡាយណាដែលមានភាពងាយរងគ្រោះ។ អង្គការ OWASP (Open Web Application Security Project) បានដាក់បញ្ចូល Injections ទៅក្នុងបញ្ជី OWASP កំពូលទាំង១០ របស់ខ្លួននៅឆ្នាំ២០១៧ ថាជាប្រភេទវាយប្រហារដែលមានការគម្រាមកំហែងខ្លាំងបំផុតមួយនៅលើប្រព័ន្ធសុវត្ថិភាព Web application។
៣. តើ SQL Injection ធ្វើទៅបានតាមរបៀបណា?
មុននឹងធ្វើការវាយប្រហារតាម SQL Injection ហេគឃ័រត្រូវស្វែងរកចន្លោះប្រហោងនៅលើវ៉េបសាយតាមរយៈ User input (កន្លែងដែលអ្នកប្រើប្រាស់ធ្វើការបញ្ចូលព័ត៌មាន) ជាមុនសិន ។ វ៉េបសាយដែលមានចន្លោះប្រហោងសម្រាប់ SQL injection គឺជាវ៉េបសាយដែលដែលប្រើប្រាស់ User input បញ្ចូលដោយផ្ទាល់ទៅកាន់ SQL query ។ ហេគឃ័រអាចបង្កើត input content មួយ ដែល content នោះជាទូទៅត្រូវបានហៅថា malicious payload ហើយវាក៏ជាគន្លឹះសំខាន់មួយក្នុងការវាយប្រហារផងដែរ។ បន្ទាប់ពីហេគឃ័រផ្ញើ content នេះចេញទៅ, malicious SQL commands ក៏នឹងត្រូវបានប្រតិបត្តិនៅក្នុង database ។
SQL គឺជា Query language មួយដែលត្រូវបានបង្កើតឡើងសម្រាប់គ្រប់គ្រងទិន្នន័យដែលបានផ្ទុកនៅក្នុង relational database ។ យើងប្រើប្រាស់វាដើម្បីធ្វើការគ្រប់គ្រង កែប្រែ និងលុបទិន្នន័យ។ វ៉េបសាយជាច្រើនផ្ទុកទិន្នន័យនៅក្នុង SQL database ។ នៅក្នុងករណីមួយចំនួនទៀត យើងក៏អាចប្រើប្រាស់ SQL command នៅក្នុង Operating System commands បានផងដែរ។ ដូច្នេះហើយបានជាការវាយប្រហារតាមរយៈ SQL injection គឺបញ្ហាធ្ងន់ធ្ងរមួយសម្រាប់ Web application។
៤. គួរចងចាំ
- ហេគឃ័រ ប្រើប្រាស់ SQL injection ក្នុងការស្វែងរកអត្តសញ្ញាណរបស់អ្នកប្រើប្រាស់ដែលមាននៅក្នុង Database ។ បន្ទាប់មកពួកគេក្លែងខ្លួនជា User ណាម្នាក់។ អ្នកដែលត្រូវបានក្លែងបន្លំនោះអាចជា Database Administrator ដោយមានសិទ្ធិកាន់កាប់នូវ Database ទាំងមូល។
- SQL អាចបង្ហាញនូវទិន្នន័យទាំងអស់ចេញពី Database ។ ចន្លោះប្រហោងនៃ SQL injection អនុញ្ញាតឲ្យហេគឃ័រ អាច Access ចូលទៅកាន់ Database server បានយ៉ាងពេញលេញ។
- SQL អាចឲ្យយើងធ្វើការកែប្រែទិន្នន័យ និងបន្ថែមទិន្នន័យថ្មីបាន។ ឧទាហរណ៍ នៅក្នុង Application ហិរញ្ញវត្ថុមួយ អាចឲ្យហេគឃ័រប្រើប្រាស់ SQL injection ដើម្បីធ្វើការកែប្រែចំនួនសមតុល្យ ការប្រតិបត្តការវេលុយ ឬវេលុយចូលគណនីរបស់ពួកគេជាដើម។
- គេអាចប្រើ SQL ដើម្បីលុប record (ទិន្នន័យជាជួរ) ចេញពី Database ឬលុប Table ទាំងមូលបានផងដែរ។ បើទោះបីជា Administrator បានធ្វើការរក្សាទុក (backup) ទិន្នន័យរួចម្តងហើយក៏ដោយ ក៏វានឹងធ្វើឲ្យមានផលប៉ះពាល់ដល់ application របស់យើងផងដែរ រហូតដល់ទិន្នន័យនោះត្រូវបានស្តារមកវិញ (restored) ។ ម្យ៉ាងវិញទៀត ទិន្នន័យដែលបានរក្សាទុកនោះក៏មិនប្រាកដថា ជាទិន្នន័យមានបច្ចុប្បន្នភាពផងដែរ។
- នៅក្នុង Database server មួយចំនួន គេអាច access ចូលទៅកាន់ Operating System បានតាមរយៈ Database server ។ វាអាចជាចេតនា ឬជាការចៃដន្យ។ ក្នុងករណីមួយចំនួនដូចជា អ្នកវាយប្រហារប្រើប្រាស់ SQL injection ជា intial vector ហើយបន្ទាប់មកវាយប្រហារចូលបណ្តាញខាងក្នុងនៅពីក្រោយ Firewall ។
មានវិធីសាស្ត្រច្រើនក្នុងការវាយប្រហារតាមរយៈ SQL ដែលមានដូចជា៖ in-band SQLi(ប្រើប្រាស់ database error ឬ UNION commands), Blind SQLi និង out-of-band SQLi ។ លោកអ្នកអាចអានលម្អិតថែមទៀតបានតាមរយៈ Types of SQL Injection (SQLi), Blind SQL Injection: What is it.
ដើម្បីអនុវត្តតាមជាជំហានៗ និងចង់ដឹងថាតើគេធ្វើរបៀបម៉េចខ្លះនោះ អាចចូលទៅកាន់ៈ
Exploiting SQL Injection: a Hands-on Example
៥. ឧទាហរណ៍សាមញ្ញៗ
ឧទាហរណ៍នេះនឹងបង្ហាញពីរបៀបដែលអ្នកវាយប្រហារអាចចូលទៅកាន់វ៉េបសាយរបស់យើង រួចដើរតួជា Administrator ដោយមិនចាំបាច់សុំការអនុញ្ញាតអ្វីទាំំងអស់។
Script ខាងក្រោមគឺជា pseudocode ដែលដែលនឹងត្រូវប្រតិបត្តិការលើ Web server ។ វាជាឧទាហរណ៍សាមញ្ញមួយដែលប្រើប្រាស់ username និង password ដើម្បី log ចូល។ ឧទាហរណ៍ database មួយមាន table មួយឈ្មោះ users ដោយមាន columns ពីរគឺ username និង password។
# Define POST variables
uname = request.POST[‘username’] passwd = request.POST[‘password’]
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’” # Execute the SQL statement database.execute(sql)
Input fields ខាងលើនេះគឺមានចន្លោះប្រហោងសម្រាប់ SQL injection ។ អ្នកវាយប្រហារអាចនឹងប្រើប្រាស់ SQL commands ដាក់ចូលក្នុង input ដែលជាមធ្យោបាយមួយអាចឲ្យមានការកែប្រែនូវ SQL statement ហើយប្រតិបត្តិការដោយ database server។ ឧទាហរណ៍ គេអាចប្រើល្បិចដោយដាក់ single quote ហើយ set passwd field ទៅជាៈ
password' OR 1=1
ជាលទ្ធផល Database server run បាន command ដូចខាងក្រោម៖
SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'
ពីព្រោះតែ OR 1=1′ statement, ឃ្លា WHERE នឹង return id ចេញពី id ដំបូងគេដោយមិនខ្វល់ថា username ឬ password នោះជាអ្វីនោះទេ។ ជាទូទៅ id អ្នកប្រើប្រាស់ដំបូងគេនៅក្នុង database គឺជា Administrator ។ ក្នុងន័យនេះ អ្នកវាយប្រហារមិនត្រឹមតែអាចឆ្លងកាត់ authentication បានប៉ុណ្ណោះទេ ប៉ុន្តែគេអាចកាន់កាប់សិទ្ធិជា Administrator បានទាំងស្រុងផងដែរ។ គេក៏អាចប្រើប្រាស់ comment ផ្សេងទៀតដើម្បីគ្រប់គ្រងទៅលើការប្រតិបត្តិការណ៍របស់ SQL query បានថែមទៀតផងដែរៈ
-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16
៦. ឧទាហរណ៍នៃ Union-Based SQL injection
ប្រភេទមួយទៀតដែលគេពេញនិយមប្រើនៅក្នុង SQL injection នោះគឺការប្រើប្រាស់ UNION operator ។ វាអនុញ្ញាតឲ្យអ្នកវាយប្រហារធ្វើការផ្សំបញ្ចូលនូវលទ្ធផលដែលបានមកពី SELECT statement ពីរឬច្រើនបញ្ចូលគ្នា រួចបញ្ចេញទៅជាលទ្ធផលមួយ។ បច្ចេកទេសនេះគេហៅថា Union-Based SQL injection ។
ឧទាហរណ៍ខាងក្រោមគឺជាការ Request HTTP សាមញ្ញមួយដែលអ្នកប្រើប្រាស់គាត់ធ្វើការផ្ញើចេញ៖
GET http://testphp.vulnweb.com/artists.php?artist=1 HTTP/1.1 Host: testphp.vulnweb.com
artist parameter គឺជាចន្លោះប្រហោងសម្រាប់ SQL injection ។ Payload ខាងក្រោមនឹងធ្វើការកែប្រែ query ដើម្បីស្វែងរក Record ដែលមិនទាន់មាន។ វា sets value ក្នុង URL query string ទៅជា -1 (ព្រោះយើងចង់ស្វែងរក record ដែលមិនមានក្នុង database) ហើយជាទូទៅគេមិន store ចំនួនអវិជ្ជមាននោះទេ។
នៅក្នុង SQL injection, UNION operator គឺពេញនិយមក្នុងប្រើប្រាស់ភ្ជាប់ជាមួយនឹង malicious SQL query (query មិនល្អ) ទៅកាន់ query ដើម ក្នុងគោលបំណងឲ្យវា run ចូល web application ។ លទ្ធផលនៃ query (injected query)ដែលបានចាក់បញ្ចូល និងបញ្ចូលជាមួយលទ្ធផលរបស់ query ដើម (original query) ។ ការណ៍នេះធ្វើឲ្យអ្នកវាយប្រហារទទួលបាន column values ពី Table ។
GET http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1, 2, 3 HTTP/1.1 Host: testphp.vulnweb.com
ឧទាហរណ៍ខាងក្រោមបង្ហាញពីរបៀបដែល SQL injection payload ត្រូវបានប្រើប្រាស់ដើម្បីទាញយកព័ត៌មានសំខាន់ៗចេញពីវ៉េបសាយដែលងាយរងគ្រោះ៖
GET http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,pass,cc FROM users WHERE uname=’test’ HTTP/1.1 Host: testphp.vulnweb.com
៧. របៀបក្នុងការបង្ការពី SQL injection
មធ្យោបាយតែមួយគត់ក្នុងការបង្ការកុំឲ្យមានការវាយប្រហារពី SQL injection នោះគឺ input validation (សុពលភាពការបញ្ចូល) និងការរៀបចំ parameterized queries រួមជាមួយនឹង statement ដែលនឹងត្រូវរៀបចំ។ Application code មិនគួរប្រើប្រាស់ input ផ្ទាល់ជាមួយនឹង SQL query នោះទេ។ អ្នក develop ទាំងឡាយគួរណាស់តែរៀបចំគ្រប់ input form ទាំងអស់ឲ្យមានសណ្តាប់ធ្នាប់ ដោយមិនគ្រាន់តែ validate ទៅលើ login form តែមួយមុខគត់នោះឡើយ។ អ្នកគួរតែលុបចោលនូវរាល់ code elements ទាំងឡាយណាដែលអាចបង្កឲ្យមានចន្លោះប្រហោងដូចជា single quote ជាដើម។ល។ វាក៏ជាជម្រើសល្អមួយផងដែរ ប្រសិនណាបើយើងបិទមិនឲ្យគេមើលឃើញ database error នៅលើ production site ព្រោះថា Database error អាចនឹងត្រូវបានប្រើប្រាស់ជាមួយ SQL injection ដើម្បីទាញយកទិន្នន័យចេញពី Database server របស់យើង។
ប្រសិនបើយើងរកឃើញចន្លោះប្រហោង SQL injection ដោយប្រើប្រាស់ tool scan ណាមួយ នោះលោកអ្នកមុខជាមិនអាចជួសជុលវាបានភ្លាមៗនោះទេ។ ឧទាហរណ៍ វាអាចនឹងបើកចំហរនូវ source codes របស់យើង។ ក្នុងករណីនេះ លោកអ្នកអាចប្រើប្រាស់ web application firewall ក្នុងការ validate input ជាបណ្តោះអាសន្នជាមុនសិន។
ដើម្បីរៀនពីការបង្ការ SQL injectio នៅលើ PHP សូមមើលលម្អិត៖ Preventing SQL Injection Vulnerabilities in PHP Applications and Fixing Them។ ចង់ដឹងបន្ថែមពីរបៀបធ្វើនៅលើភាសាដទៃផ្សេងទៀត អាចមើលបានតាម Bobby Tables guide to preventing SQL Injection។ សូមអរគុណ 🙂