อธิบายช่องโหว่
ผมอธิบายไม่เก่ง ผมเขียนคร่าวๆก็แล้วกันนะครับ ปกติ หน้า login ของเว็บจะมี ช่องให้กรอก 2 ช่องนั่นคือ
username และ password ส่วนใหญ่เขาจะเขียนโปรแกรม ดังนี้
$username = รับค่ามาจากช่อง
$password= รับค่ามาจากช่อง
คำสั่ง sql ในการ query ก็จะประมาณ
$sql = "select * from members where user='$username' and pass='$password' ";
ถ้าคนกรอก username เป็น bigchern และ password มาเป็น 1234 คำสั่ง sql ที่ได้ก็จะออกมาเป็น
$sql = "select * from members where user='bigchern' and pass='1234' ";
ซึ่งถ้าข้อมูล username และ password ถูกต้องก็จะไม่มีปัญหาใดๆทั้งนัน้
แต่ถ้า มีคนหัวหมอถ้าคนกรอก username เป็น bigchern และ password มาเป็น 1' or ''=' คำสั่ง sql ที่ได้ก็จะออกมาเป็น
$sql = "select * from members where user='bigchern' and pass='1' or ''='' ";
ซึ่งจะทำให้ การลอกอิน ครั้งนี้ผ่านไปได้โดยที่ คนลอกอินไม่จำเป็นต้องรู้รหัสผ่าน
วิธีป้องกัน
ตอนรับค่าจาก form ลอกอิน ควรใส่คำสั่ง addslashes ให้กับตัวแปรเช่น
$username = addslashes(รับค่ามาจากช่อง)
$password= addslashes(รับค่ามาจากช่อง)
จะทำให้เครื่องหมาย 1' or ''=' กลายเป็น 1\' or \'\'=\' ก็จะไม่เปิดปัญหานี้
ช่องโหว่นี้ยังมีหลงเหลือมากมายในเว็บต่างๆ ทั้งไทยและ ต่างชาติ แม้แต่เว็บใหญ่ๆ ก็มักจะมี ส่วนใหญ่ นักพัฒนาก็รู้ดีอยู่แล้ว แต่ขี้เกียจป้องกัน หรือบางทีอาจจะหลงลืม
ถ้าใครอยากลองดูเว็บที่มีช่องโหว่นี้ก็ลองได้ง่ายๆ ผมจะใบ้ keyword ให้หาใน google ก็แล้วกันนะครับ
ลองหาคำว่า
"กินเที่ยว ทั่วไทย"
"scawai"
เป็นต้น ลองดูนะ ขำๆ อย่าไปทำอะไรเขาหละ หรือจะเมล์ไปบอกเขาถึงช่องโหว่ก็ได้ เผื่อจะได้รับคำชม
edit @ 4 Aug 2011 13:45:23 by bigchern
edit @ 4 Aug 2011 13:47:51 by bigchern