1. ตัดทอนเนื้อหาแบบสอบถาม
ในกรณีที่คุณต้องการละเว้นสคริปต์ในการสืบค้น ตัวอย่างเช่น สำหรับการประมวลผลด้านล่าง การสืบค้นจำเป็นต้องมีเงื่อนไข active=1 แต่เราสามารถแสดงความคิดเห็นได้ (--, -- -, -+, #, /*, /**/, // , ;%00…) และ ไม่สนใจมัน เมื่อทำการขุด เรามักจะไม่รู้ว่าเนื้อหาที่เหลือของแบบสอบถามนั้นทำอะไร ดังนั้นการใช้ความคิดเห็นในกรณีนี้จึงมีประสิทธิภาพมาก
หลังจากแสดงความคิดเห็น คำถามของเราจะกลายเป็น:
2. หลีกเลี่ยงการกรองคำหลัก
ก. ความคิดเห็นแบบอินไลน์
ความคิดเห็นแบบอินไลน์ถูกนำมาใช้อย่างมีประสิทธิภาพเพื่อหลีกเลี่ยงการกรองช่องว่าง คุณสามารถใช้อักขระต่อไปนี้เพื่อข้ามการกรองช่องว่าง: /**/, %20, %09, %0a, %0b, %0c, %0d, %a0) ตัวอย่างเช่น:
หรือหลีกเลี่ยงการกรองคำหลัก (ใช้ได้กับ MySql) ในตัวอย่างด้านล่าง คีย์เวิร์ด union และรหัสผ่านอยู่ในบัญชีดำจึงถูกบล็อก เราสามารถข้ามได้โดย:
ข. แทนที่คำหลัก
เมื่อใช้ประโยชน์จากการฉีด SQLเรามักจะใช้คำหลักเช่น: union, select, information_schema... ในหลายกรณี โปรแกรมเมอร์เพียงแค่แทนที่คำหลักเหล่านั้น:
เราจะเห็นได้ง่ายว่าโค้ดประมวลผลข้างต้นขาดหายไป หากเป็นเพียงการจับคู่รูปแบบ การบายพาสก็ทำได้ง่ายมาก ลองใช้ตัวพิมพ์เล็กและตัวพิมพ์เล็กโดยที่ตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กถูกตีความต่างกัน
ตอนนี้แทนที่จะใช้คำหลัก:
select, union…
เราจะใช้:
SeLEcT, UniOn…
พื้นฐานของการเลี่ยงผ่านนี้คือ ระบบการจัดการฐานข้อมูลไม่ได้แยกความแตกต่างระหว่างคีย์เวิร์ด case และ case
ในบางกรณี เว็บแอปพลิเคชันจะกรองคำหลักบางคำหรือทั้งหมดออก (สหภาพ เลือก...) เราจะข้ามดังนี้:
id=1+uniunionon+SeLselectecT+1,2,3-- -
หลังจากที่เว็บแอปพลิเคชันกรองการรวมและเลือกแล้ว เราจะเหลือแบบสอบถามที่ถูกต้องดังต่อไปนี้:
id=1+union+SeLecT+1,2,3-- -
ค. การเข้ารหัสอักขระ
เราสามารถเลี่ยงได้เมื่อ WAF (Web Application Firewall) บล็อกคำหลักด้วยการเข้ารหัส แอปพลิเคชัน WAF จำนวนมากจะถอดรหัสการสืบค้นเพียงครั้งเดียวและกรองคำหลักในบัญชีดำออก จากนั้นให้เข้ารหัสคำขอสองครั้งเพื่อให้สามารถข้ามได้ในกรณีนี้
3. บายพาสบล็อกเครื่องหมายคำพูดเดี่ยวและคู่
- ลองดูตัวอย่างก่อนที่จะเรียนรู้เกี่ยวกับการบายพาสนี้โดยเฉพาะ
ในสถานการณ์สมมตินี้ เรามีตารางในฐานข้อมูลที่ชื่อผู้ใช้ งานต่อไปคือการรู้ชื่อคอลัมน์ในตารางเพื่อรับข้อมูล เช่นเดียวกับในแบบสอบถามข้างต้น เราใช้เงื่อนไข: table_name='users' แต่หากทั้งเครื่องหมายคำพูดเดี่ยว (') และเครื่องหมายคำพูดคู่ (") ถูกบล็อกโดย WAF เราจะไม่สามารถใช้ 'ผู้ใช้' หรือ 'ผู้ใช้' ได้อีกต่อไป แล้ววิธีแก้ปัญหานี้ระบบฐานข้อมูลในตัวทำให้เรามีฟังก์ชันที่ แก้ปัญหานี้ได้เป็นอย่างดี ซึ่งก็คือฟังก์ชัน CHAR( ) (สำหรับ Oracle คือ CHR()) ตัวอย่างเช่น ในการสืบค้นข้างต้นเราจะเลี่ยงมันโดย:
โปรแกรมเมอร์ PHP คุ้นเคยกับฟังก์ชัน addslashes() เป็นอย่างดี ฟังก์ชัน addslashes() มีเอฟเฟกต์การเพิ่มหน้าอักขระพิเศษ เช่น เครื่องหมายคำพูดเดี่ยว (') เครื่องหมายคำพูดคู่ (") เครื่องหมายแบ็กสแลช (\) อักขระ NUL (ไบต์ null) "\" เพื่อช่วยระบบจัดการฐานข้อมูล มีหรือไม่ ไม่มีปัญหาและความสับสนในการจัดการสตริงที่มีอักขระเหล่านั้น ดังนั้น เมื่อเราต้องการแทรกลงในแบบสอบถามตามสคริปต์: name='someName' หรือ '1'='1'-- ผลลัพธ์ไม่ใช่สิ่งที่เราคาดหวังอีกต่อไป
อย่างไรก็ตาม มีเทคนิคในการข้ามฟังก์ชัน addslashes() เพื่อใส่อักขระเครื่องหมายคำพูดเดี่ยว (') เทคนิคนี้เผยแพร่สู่สาธารณะมาเป็นเวลานานแล้ว และการนำเทคนิคนี้ไปใช้ค่อนข้างยากเนื่องจากเชื่อมโยงกับรูปแบบการเขียนโค้ดที่ใช้กับเว็บไซต์
4. ข้ามข้อผิดพลาด "การผสมผสานที่ผิดกฎหมายสำหรับการดำเนินการ UNION"
ในระบบการจัดการบางระบบ (มักพบใน MySql) เมื่อฐานข้อมูลและตารางได้รับการตั้งค่าให้เปรียบเทียบ เมื่อใช้คีย์เวิร์ด UNION ข้อผิดพลาด "การผสมผสานที่ผิดกฎหมายสำหรับการดำเนินการ UNION" จะถูกรายงาน การจัดเรียงการตั้งค่าอาจเกิดจากความตั้งใจของผู้ออกแบบฐานข้อมูลหรือเนื่องจากการตั้งค่าเริ่มต้นของ MySql ในกรณีที่ใช้สหภาพ เราต้องแน่ใจว่าเงื่อนไขค่าที่เลือกในแต่ละฟิลด์ต้องมีการกำหนดประเภทรหัสที่สอดคล้องกัน ในความคิดของฉัน ข้อผิดพลาดนี้ค่อนข้างเกิดขึ้นบ่อย โดยเฉพาะกับ CMS ที่ใช้ Apache MySql ผู้คนสามารถเรียนรู้เพิ่มเติมได้ที่: http://bugs.mysql.com/bug.php?id=57926
ในกรณีนี้เราสามารถใช้วิธีแปลงเป็นประเภทการเข้ารหัสที่เหมาะสมได้
ตัวอย่างเช่น ในกรณีต่อไปนี้:
ในการสืบค้นข้างต้น หาก column1 ตั้งค่าการจัดเรียงเป็น Unicode-UTF8 หรือ _latin1 เป็นต้น สิ่งที่เลือกจาก column2 จะต้องถูกแปลงเป็นโค้ดที่เกี่ยวข้อง เราสามารถบังคับสไตล์ได้ดังนี้:
เราเห็นข้อเสียเปรียบในวิธีการบายพาสนี้: เราต้องรู้ว่าโค้ดที่เรียงกันคือ _latin1 ในความคิดของฉัน วิธีที่ดีกว่าในการหลีกเลี่ยงคือการใช้ฟังก์ชันการเข้ารหัสและถอดรหัสแบบ hex และ unhex
มีฟังก์ชันอื่นๆ อีกมากมายที่สามารถใช้แทน hex และ unhex ได้