DOM-based XSS از طریق location.hash بدون رفتوبرگشت به سرور
وقتی کل مسیر آلودهشدن (source تا sink) فقط در جاوااسکریپت سمت کلاینت اتفاق میافتد و در لاگ سرور هم دیده نمیشود.
در DOM-based XSS، دادهی آلوده هرگز به سرور فرستاده نمیشود؛ یک اسکریپت سمت کلاینت مقداری مثل location.hash یا document.referrer را میخواند (source) و بدون sanitize در یک sink خطرناک مثل innerHTML یا eval() قرار میدهد.
نحوهی شناسایی
- کد جاوااسکریپت صفحه را برای sinkهای معروف (
innerHTML،document.write،eval،setTimeoutبا رشته) بگردید. - عقبتر بروید و ببینید مقدار از کدام source (URL hash، نام پارامتر، localStorage) میآید.
چرا شناسایی سختتر است
چون این ترافیک به سرور نمیرسد، هیچ WAF یا لاگ سمت سرور آن را نمیبیند؛ باید حتماً کد جاوااسکریپت واقعی را مرور کرد، نه فقط پاسخهای HTTP را.
راهحل
استفاده از textContent بهجای innerHTML هر جا ممکن است، یا sanitize با یک کتابخانهی معتبر قبل از هر sink خطرناک.