ในหลายกรณีเมื่อผู้บุกรุกใช้เครื่องมือฉีดพวกเขาพบว่าเครื่องมือไม่สามารถถอดรหัสชื่อตารางและชื่อเขตข้อมูลได้ นั่นเป็นเพราะเครื่องมือทั้งหมดมีพจนานุกรมของตัวเองซึ่งรวมถึงชื่อตารางและชื่อเขตข้อมูลหากผู้ดูแลระบบชื่อตารางและ ชื่อเขตข้อมูลมีการเปลี่ยนแปลงจนไม่อยู่ในพจนานุกรมนี้แล้วเครื่องมือที่เราใช้จะไม่สามารถเดาชื่อเขตข้อมูลและชื่อตารางได้ ในบทความต่อไปนี้ เราจะเริ่มต้นจากการวิเคราะห์การฉีดด้วยตนเองเพื่อสร้างแนวป้องกันจากการฉีด SQL
ผู้บุกรุกจะสร้างเงื่อนไขการตัดสินง่ายๆ เพื่อตรวจสอบว่าเพจมีช่องโหว่หรือไม่ ขั้นตอนทั่วไปมีดังนี้:
เพจที่จะตรวจพบที่นี่คือ http://127.0.0.1/111/view.asp?id=198
1 ผู้บุกรุก หากคุณต้องการแทรกไซต์ด้วยตนเอง คุณต้องตั้งค่าเบราว์เซอร์เพื่อให้แน่ใจว่าข้อความแสดงข้อผิดพลาดสามารถส่งคืนได้ในระหว่างการฉีดด้วยตนเอง ขั้นตอนมีดังนี้:
คลิกขวาที่เบราว์เซอร์แล้วเลือก "คุณสมบัติ" และเลือก " ขั้นสูง" ในกล่องโต้ตอบป๊อปอัป แท็บ ดังที่แสดงด้านล่าง:
รูปที่ 1
จากนั้นถอดตะขอที่อยู่ด้านหน้า "แสดงข้อความแสดงข้อผิดพลาด HTTP ที่จำง่าย" และสุดท้ายคลิกปุ่ม "นำไปใช้"
2. ผู้บุกรุกส่ง URL ต่อไปนี้ไปยังเบราว์เซอร์:
http://127.0.0.1/111/view.asp?id=198 และ 1=1
หากมีช่องโหว่ในการแทรก SQL ก็สามารถสอบถามฐานข้อมูลได้ 1 คือตัวตน ไม่สนใจ ดังนั้นเพจปกติจะถูกส่งกลับ เพจนี้เหมือนกับ http://127.0.0.1/111/view.asp?id=198 ในเวลานี้ ผู้บุกรุกจะตัดสินว่าไซต์นี้ คาดว่าจะฉีดได้ หากข้อความแสดงข้อผิดพลาดถูกส่งกลับ ผู้บุกรุกขั้นพื้นฐานบางรายอาจละทิ้งไซต์
3. ผู้บุกรุกส่ง URL ต่อไปนี้ไปยังเบราว์เซอร์เพิ่มเติม:
http://127.0.0.1/111/view.asp?id=198 และ 1=2
1=2 คือความไม่เท่าเทียมกันของข้อมูลประจำตัว หากไซต์รองรับการสืบค้นฐานข้อมูล ก็อาจจะส่งคืนข้อมูลดังแสดงในรูปด้านล่าง:
รูปที่ 2
โดยทั่วไป หากผู้บุกรุกปรากฏดังแสดงในรูปด้านบน ก็แน่นอนว่าไซต์นี้สามารถทำการโจมตีแบบ SQL Injection ได้
อย่างไรก็ตาม ในหลายกรณี ผู้บุกรุกสามารถระบุได้อย่างรวดเร็วว่าไซต์เป้าหมายมีช่องโหว่ในการแทรก SQL หรือไม่โดยใช้เครื่องหมายคำพูดเดี่ยว และส่ง URL ต่อไปนี้ไปยังเบราว์เซอร์:
http://127.0.0.1/111/view.asp? id=198'if การส่งคืนข้อมูลต่อไปนี้บ่งชี้ว่ามีโอกาสมากกว่าครึ่งหนึ่งที่ช่องโหว่การฉีดมีอยู่:
Microsoft OLE DB Provider สำหรับ ODBC Drivers error '80040e14'
[Microsoft] [ODBC Microsoft Access Driver] ข้อผิดพลาดทางไวยากรณ์ของสตริง อยู่ในนิพจน์แบบสอบถาม 'id =1' /list.asp บรรทัดที่ 50
4. ในขณะนี้ ผู้บุกรุกเริ่มสร้างคำสั่งการสืบค้น SQL พิเศษเพื่อสืบค้นชื่อตารางของฐานข้อมูลไซต์ และส่งคำสั่งต่อไปนี้ไปยัง URL:
http://127.0.0.1/ 111/view.asp?id= 198 และมีอยู่ (เลือก * จากผู้ดูแลระบบ)
คำสั่งนี้จะสอบถามฐานข้อมูลเพื่อดูว่ามีตารางผู้ดูแลระบบอยู่หรือไม่ หากมีอยู่แล้ว เพจปกติจะถูกส่งกลับ หากไม่มีตารางอยู่ แสดงว่าเกิดข้อผิดพลาด หน้าจะถูกส่งคืน โดยทั่วไปผู้บุกรุกจะทดสอบชื่อตารางที่ใช้กันทั่วไปก่อน ซึ่งเป็นชื่อตารางและชื่อฟิลด์ที่มีอยู่ในพจนานุกรมรหัสผ่านของเครื่องมือฉีดทั่วไป หากชื่อตารางไม่อยู่ในชื่อตารางที่ใช้กันทั่วไป ผู้บุกรุกจะใช้วิศวกรรมสังคมเพื่อเดาชื่อตาราง ในกรณีนี้ ผู้บุกรุกมีโอกาสน้อยที่จะเดาชื่อตาราง
5. หลังจากได้รับชื่อตารางแล้ว ผู้บุกรุกจะเริ่มสร้างคำสั่งแบบสอบถามเพื่อสอบถามชื่อฟิลด์ฐานข้อมูลและส่งคำสั่งต่อไปนี้ไปยัง URL:
http://127.0.0.1/111/view.asp?id=198 และ มีอยู่ (เลือกผู้ใช้จากผู้ดูแลระบบ)
นี้ คำสั่งคือการสอบถามตารางผู้ดูแลระบบในฐานข้อมูลว่ามีฟิลด์ผู้ใช้อยู่หรือไม่ หากไม่มี เพจปกติจะถูกส่งกลับ
7. ถัดไป ผู้บุกรุกจะเริ่มกำหนดค่าของฟิลด์ id และสร้างคำสั่งต่อไปนี้เพื่อสอบถามค่าของ id: http://127.0.0.1/111/view.asp?id=198 และมีอยู่ (เลือก id จากผู้ดูแลระบบ โดยที่ id=1 )
ส่งคืนหน้าที่ถูกต้องหากถูกต้อง และส่งคืนหน้าข้อผิดพลาดหากไม่ถูกต้อง
6. หลังจากเดาชื่อตารางและชื่อฟิลด์ได้แล้ว ผู้บุกรุกก็เริ่มสร้างคำสั่งแบบสอบถามเพื่อเดาความยาวบัญชีผู้ดูแลระบบและส่งคำสั่งต่อไปนี้ไปที่ URL:
http://127.0.0.1/111/view.asp?id =198 และมีอยู่ (เลือก id จาก admin โดยที่ len(user)<6 และ id=1)
คำสั่งนี้มีไว้เพื่อสอบถามช่วงความยาวของชื่อผู้ใช้ในช่อง user ซึ่งหมายความว่าความยาวจะน้อยกว่า 6 ถ้าเป็น ถูกต้องก็จะกลับหน้าปกติ ถ้าผิดก็จะกลับหน้า error
จำกัดขอบเขตให้แคบลง จากนั้นสร้างคำสั่งต่อไปนี้เพื่อกำหนดความยาวเฉพาะของชื่อผู้ใช้:
http://127.0.0.1/111/view.asp?id=198 และมีอยู่ (เลือก id จากผู้ดูแลระบบ โดยที่ len(user)= 5 และ id=1)
แก้ไข หากเกิดข้อผิดพลาด เพจปกติจะถูกส่งคืน หากเกิดข้อผิดพลาด เพจข้อผิดพลาดจะถูกส่งคืน
8. จากนั้น ผู้บุกรุกจะเข้าสู่ขั้นตอนสุดท้ายเพื่อสร้างคำสั่งเพื่อสอบถามชื่อผู้ใช้ของผู้ดูแลระบบ และส่งคำสั่งต่อไปนี้ไปยัง URL: http://127.0.0.1/111/view.asp?id=198 และมีอยู่ ( เลือก count(*) จาก admin โดยที่ left(user,1)='a')
คำสั่งนี้เป็นการเดาชื่อผู้ใช้จากด้านซ้ายของชื่อผู้ใช้เป็น a หากถูกต้องก็จะกลับสู่หน้าปกติ ถ้ามันผิดก็จะกลับไปที่หน้าข้อผิดพลาด เดาทีละรายการ ในตำแหน่งที่สองคำสั่งที่แก้ไขคือ (user,2)='ad' เป็นต้น
หลังจากที่ผู้บุกรุกได้รับชื่อผู้ใช้และรหัสผ่านแล้ว การฉีดยาก็ใกล้จะเสร็จสิ้นแล้ว
สำหรับวิธีการป้องกันนั้นง่ายมาก จากขั้นตอนข้างต้น เราจะเห็นว่า หากชื่อตารางและชื่อฟิลด์ไม่อยู่ในกลุ่มชื่อตารางและชื่อฟิลด์ที่ใช้กันทั่วไป ผู้บุกรุกจะใช้ Social Engineering เพื่อคาดเดา ชื่อตารางและชื่อฟิลด์ที่แก้ไขโดยผู้ดูแลระบบนั้นซับซ้อนพอ ผู้บุกรุกจะบุกเข้ามา หากผู้โจมตียังคงไม่บรรลุเป้าหมาย มีวิธีป้องกันง่ายๆ อีกวิธีหนึ่งคือดาวน์โหลดแพตช์ต่อต้านการฉีดจากอินเทอร์เน็ตและนำไปใช้ วิธีการคือการแก้ไขไฟล์ไซต์และเพิ่มคำสั่งการกรองเพื่อกรองข้อความที่ผู้บุกรุกส่งมาเพื่อป้องกันการแทรกซึม ใช่ ฉันจะไม่อธิบายหลักการให้คุณทราบที่นี่