จุดประสงค์ของการฉีด MySQL คือการเข้ายึดฐานข้อมูลเว็บไซต์และขโมยข้อมูล นักพัฒนาเว็บไซต์จำนวนมากใช้ฐานข้อมูลโอเพ่นซอร์สทั่วไป เช่น MySQL เพื่อจัดเก็บข้อมูลสำคัญ เช่น รหัสผ่าน ข้อมูลส่วนบุคคล และข้อมูลการจัดการ
MySQL ได้รับความนิยมเนื่องจากใช้กับ PHP ซึ่งเป็นภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ที่ได้รับความนิยมมากที่สุด นอกจากนี้ PHP ยังเป็นภาษาหลักของเซิร์ฟเวอร์ Linux-Apache ที่ครองอินเทอร์เน็ต ดังนั้นนี่หมายความว่าแฮกเกอร์สามารถใช้ประโยชน์จาก PHP ได้อย่างง่ายดายเช่นเดียวกับสปายแวร์ Windows
แฮกเกอร์ป้อนโค้ดที่เป็นอันตรายจำนวนมากลงในแบบฟอร์มเว็บที่ไม่ปลอดภัย (ผ่านเมนูแบบเลื่อนลง ช่องค้นหา แบบฟอร์มติดต่อ แบบฟอร์มสอบถาม และช่องทำเครื่องหมาย)
โค้ดที่เป็นอันตรายจะถูกส่งไปยังฐานข้อมูล MySQL จากนั้นจึง "ฉีด" หากต้องการดูกระบวนการนี้ ขั้นแรกให้พิจารณาคำสั่งสืบค้น MySQL SELECT พื้นฐานต่อไปนี้:
SELECT * FROM xmen WHERE username = 'wolverine'
แบบสอบถามนี้จะถามฐานข้อมูลที่มีตาราง "xmen" เพื่อส่งคืนข้อมูลบางส่วนด้วยชื่อผู้ใช้ "wolverine" ใน MySQL
ในรูปแบบเว็บ ผู้ใช้จะป้อน Wolverine และข้อมูลนี้จะถูกส่งไปยังแบบสอบถาม MySQL
หากอินพุตไม่ถูกต้อง แฮกเกอร์มีวิธีอื่นในการควบคุมฐานข้อมูล เช่น การตั้งชื่อผู้ใช้:
' หรือ ''=''
คุณอาจคิดว่าการใช้ไวยากรณ์ PHP และ MySQL ปกติในการดำเนินการป้อนข้อมูลนั้นปลอดภัย เนื่องจาก ทุกครั้งที่มีคนป้อนโค้ดที่เป็นอันตราย พวกเขาจะได้รับข้อความ "ข้อความค้นหาที่ไม่ถูกต้อง" แต่นั่นไม่ใช่กรณีดังกล่าว แฮกเกอร์นั้นฉลาด และช่องโหว่ด้านความปลอดภัยนั้นไม่ใช่เรื่องง่ายที่จะแก้ไขเพราะมันเกี่ยวข้องกับการล้างฐานข้อมูลและการรีเซ็ตสิทธิ์ผู้ดูแลระบบ
ความเข้าใจผิดทั่วไปสองประการเกี่ยวกับการโจมตีแบบฉีด MySQL มีดังนี้:
1. ผู้ดูแลระบบเครือข่ายเชื่อว่าการฉีดที่เป็นอันตรายสามารถกำจัดได้ด้วยซอฟต์แวร์ป้องกันไวรัสหรือซอฟต์แวร์ป้องกันสปายแวร์ ความจริงก็คือการติดเชื้อประเภทนี้หาประโยชน์จากจุดอ่อนในฐานข้อมูล MySQL ไม่สามารถลบออกได้โดยโปรแกรมป้องกันสปายแวร์หรือโปรแกรมป้องกันไวรัสใดๆ
2. การแทรก MySQL เกิดขึ้นเนื่องจากการคัดลอกไฟล์ที่ติดไวรัสจากเซิร์ฟเวอร์อื่นหรือแหล่งภายนอก นี่ไม่ใช่กรณี การติดไวรัสประเภทนี้เกิดขึ้นเมื่อมีคนป้อนโค้ดที่เป็นอันตรายในรูปแบบที่ไม่ได้รับการป้องกันบนเว็บไซต์ จากนั้นจึงเข้าถึงฐานข้อมูล การแทรก MySQL สามารถกำจัดได้โดยการลบสคริปต์ที่เป็นอันตรายออก แทนที่จะใช้โปรแกรมป้องกันไวรัส
กระบวนการตรวจสอบอินพุตของผู้ใช้
จะสำรองฐานข้อมูลที่ปลอดภัยและวางไว้นอกเซิร์ฟเวอร์ ส่งออกชุดตาราง MySQL และบันทึกไว้บนเดสก์ท็อป
จากนั้นไปที่เซิร์ฟเวอร์และปิดการป้อนข้อมูลแบบฟอร์มชั่วคราวก่อน ซึ่งหมายความว่าแบบฟอร์มไม่สามารถประมวลผลข้อมูลได้และเว็บไซต์ถูกปิดตัวลง
จากนั้นเริ่มกระบวนการล้างข้อมูล ขั้นแรก บนเซิร์ฟเวอร์ของคุณ ให้ล้างการแทรก MySQL ที่ยุ่งเหยิงที่เหลืออยู่บนเซิร์ฟเวอร์ของคุณ เปลี่ยนฐานข้อมูล FTP และรหัสผ่านเว็บไซต์ทั้งหมด
ในกรณีที่เลวร้ายที่สุด หากคุณทำความสะอาดล่าช้า คุณสามารถตรวจสอบโปรแกรมที่ซ่อนอยู่ซึ่งทำงานบนเซิร์ฟเวอร์ของคุณได้อีกครั้ง โปรแกรมที่ซ่อนอยู่เหล่านี้เป็นโทรจันที่แฮกเกอร์ติดตั้ง ลบออกทั้งหมดและเปลี่ยนสิทธิ์ FTP ทั้งหมด สแกนเซิร์ฟเวอร์เพื่อหาโทรจันและมัลแวร์ทั้งหมด
เมื่อคุณแก้ไขโปรแกรมสคริปต์ PHP ข้อมูลแบบฟอร์มจะถูกประมวลผล วิธีที่ดีในการป้องกันการแทรก MySQL คือการไม่เชื่อถือข้อมูลผู้ใช้ด้วยซ้ำ การตรวจสอบอินพุตของผู้ใช้เป็นสิ่งสำคัญมากในการป้องกันการฉีด MySQL
ในการออกแบบตัวกรองเพื่อกรองการป้อนข้อมูลของผู้ใช้ ต่อไปนี้เป็นเคล็ดลับบางประการ:
1. การป้อนข้อมูลในแบบฟอร์มคือตัวเลข คุณสามารถตรวจสอบว่าเป็นตัวเลขได้โดยการทดสอบว่ามีค่าเท่ากับหรือมากกว่า 0.001 (สมมติว่าคุณไม่ยอมรับศูนย์)
2. หากเป็นที่อยู่อีเมล ตรวจสอบว่าประกอบด้วยการผสมอักขระที่อนุญาต เช่น "@", AZ, az หรือตัวเลขบางตัว
3. หากเป็นชื่อบุคคลหรือชื่อผู้ใช้ สามารถตรวจสอบได้ว่ามีอักขระที่ผิดกฎหมายหรือไม่ เช่น และ และ * ซึ่งเป็นอักขระที่เป็นอันตรายซึ่งสามารถใช้ในการแทรก SQL ได้
การตรวจสอบการป้อนตัวเลข
สคริปต์ต่อไปนี้ตรวจสอบว่ามีการป้อนตัวเลขที่ถูกต้องตั้งแต่ 0.001 ถึงอนันต์ เป็นที่น่าสังเกตว่าในโปรแกรม PHP คุณสามารถอนุญาตให้ใช้ตัวเลขภายในช่วงที่กำหนดได้ ใช้สคริปต์ตรวจสอบนี้เพื่อให้แน่ใจว่ามีการป้อนเฉพาะตัวเลขลงในแบบฟอร์มเท่านั้น
สมมติว่าคุณมีตัวแปรตัวเลขสามตัวในโปรแกรมของคุณ คุณต้องตรวจสอบตัวแปรเหล่านั้น ตั้งชื่อให้ว่า num1, num2 และ num3:
//ตรวจสอบอินพุตตัวเลข
if($_POST['num1'] >= 0.001 && $_POST['num2'] >= 0.001 && $_POST['num3'] >= 0.001){
}else{
}
?>
และสามารถขยายเงื่อนไขให้รองรับได้มากกว่าสามหมายเลขได้ ดังนั้นถ้าคุณมี 10 คุณจะต้องขยายคำสั่ง AND เท่านั้น
ซึ่งสามารถใช้เพื่อตรวจสอบแบบฟอร์มที่รับเฉพาะตัวเลข เช่น จำนวนสัญญา หมายเลขใบอนุญาต หมายเลขโทรศัพท์ เป็นต้น
ตรวจสอบการป้อนข้อความและที่อยู่อีเมล ข้อมูล
ต่อไปนี้สามารถใช้เพื่อตรวจสอบการป้อนแบบฟอร์ม เช่น ชื่อผู้ใช้ ชื่อ และที่อยู่อีเมล:
//ตรวจสอบการป้อนข้อความ
if (! preg_match('/^[-az.-@,'s]*$/i',$_POST['name'])){
}
elseif ($empty==0){
}else{
}
?>
ข้อดีประการหนึ่งของสคริปต์ตรวจสอบนี้คือ สคริปต์นี้ไม่ยอมรับอินพุตว่าง ผู้ใช้ที่เป็นอันตรายบางรายยังจัดการฐานข้อมูลผ่านอินพุตเปล่าอีกด้วย การใช้สคริปต์ด้านบน ตรวจสอบตัวแปรตัวอักษร "$name" เพียงตัวเดียวเท่านั้น ซึ่งหมายความว่า หากคุณมีตัวแปรข้อความสามตัว คุณสามารถตั้งค่าสคริปต์ตรวจสอบความถูกต้องสำหรับตัวแปรแต่ละตัวเพื่อให้แน่ใจว่าตัวแปรแต่ละตัวผ่านการทบทวนก่อนที่จะเข้าสู่ฐานข้อมูล