Second-Order SQL Injection از طریق دادهی ذخیرهشدهی قبلی
وقتی دادهای که در یک درخواست «امن» ذخیره شده، در یک عملیات بعدی و متفاوت، بدون sanitize دوباره در یک کوئری استفاده میشود.
در این نوع، نقطهی ورود payload و نقطهی اجرای واقعی آن دو مکان کاملاً متفاوت در برنامه هستند؛ مثلاً نام کاربری حاوی کوتیشن در زمان ثبتنام ذخیره میشود (بدون خطا، چون این query با prepared statement درست انجام شده)، اما بعداً در یک گزارش داخلی که با رشتهچینی ساخته شده، همان نام کاربری دوباره استفاده و اینبار باعث injection میشود.
چرا تشخیص سخت است
تست مستقیم روی همان endpoint ذخیرهسازی هیچ نتیجهای نمیدهد؛ باید کل مسیر استفادهی بعدی آن داده (گزارشها، export، جستوجوی داخلی) را هم ردیابی کرد.
راهحل
Prepared Statements باید در *تمام* نقاطی که داده به کوئری میرسد اعمال شود، نه فقط نقطهی اول ورود داده؛ sanitize در یکجا کافی نیست.
تمرین عملی در آزمایشگاههای SQL Injection — Blind / Second-Order ›