افزایش امنیت WAF با مبهم‌سازی کدهای جاوا اسکریپت

استفاده از مبهم‌سازی (Obfuscation) در کدهای جاوا اسکریپت برای افزایش امنیت WAF و جلوگیری از مهندسی معکوس. در این مقاله یاد می‌گیرید چگونه از این تکنیک برای.....

انتشار: , زمان مطالعه: 7 دقیقه
افزایش امنیت WAF با مبهم‌سازی کدهای جاوا اسکریپت
دسته بندی: امنیت سایبری تعداد بازدید: 101

فایروال‌های اپلیکیشن تحت وب (WAF - Web Application Firewall) یکی از مهم‌ترین راهکارهای امنیتی برای محافظت از سرورها و وب‌سایت‌ها در برابر حملاتی مانند SQL Injection، Cross-Site Scripting (XSS)، CSRF و حملات ربات‌ها هستند. یکی از چالش‌های اصلی این سیستم‌ها، جلوگیری از مهندسی معکوس و سوءاستفاده مهاجمان از منطق پردازشی آن‌ها است.

برای مقابله با این تهدیدات، برخی از WAFها از مبهم‌سازی (Obfuscation) کدهای جاوا اسکریپت استفاده می‌کنند تا از افشای الگوریتم‌های پردازشی خود جلوگیری کنند. این مقاله به بررسی روش مبهم‌سازی مورد استفاده در برخی WAFها می‌پردازد و نحوه پیاده‌سازی آن را توضیح می‌دهد.

چرا WAF از مبهم‌سازی در جاوا اسکریپت استفاده می‌کند؟

وقتی کاربری یک وب‌سایت را باز می‌کند، بسیاری از WAFها ابتدا بررسی می‌کنند که آیا کاربر یک انسان است یا یک ربات. برای این کار، از تکنیک‌هایی مانند:

  • استفاده از جاوا اسکریپت برای تولید مقادیر تصادفی و ارسال آن‌ها به سرور
  • اجرای محاسبات مبهم‌شده در مرورگر کاربر
  • بررسی رفتار مرورگر و تعاملات کاربر

در صورتی که کد جاوا اسکریپت مستقیم و بدون رمزگذاری در دسترس باشد، یک مهاجم می‌تواند به راحتی آن را تجزیه و تحلیل کرده و الگوریتم‌های امنیتی WAF را دور بزند. برای جلوگیری از این کار، برخی از فایروال‌ها از تکنیک‌های مبهم‌سازی برای پنهان کردن منطق اصلی کد جاوا اسکریپت استفاده می‌کنند.

بررسی یک نمونه از کدهای مبهم‌شده در WAF

به عنوان نمونه، یک صفحه بررسی ربات در یک سیستم WAF ممکن است کدی مشابه زیر داشته باشد (این کد ، یک کد واقعی از سیستم ضد ربات آنتی ویروس IMUNIFY360 است):

<script>
(function(){
    var west=+((+!+[])+(+!+[]+!![]+!![]+[])+(+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(+!+[]+!![]+!![]+!![]+!![])+(+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(+!+[]+!![]+!![]+!![]+!![])+(+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])),
        east=+((+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+!+[]+!![]+!![]+[])+(+![])+(+!+[]+!![]+!![]+!![]+!![]+!![]+[])+(+![])+(+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(+!+[]+!![]+!![]+!![]+!![])),
        x=function(){try{return !!window.addEventListener;}catch(e){return !!0;} },
        y=function(y,z){x() ? document.addEventListener('DOMContentLoaded',y,z) : document.attachEvent('onreadystatechange',y);};
    y(function(){
        document.getElementById('wsidchk').value = west + east;
        document.getElementById('wsidchk-form').submit();
    }, false);
})();
</script>

این اسکریپت قبل از بارگذاری کامل صفحه، یک مقدار محاسبه‌شده را به فرم مخفی ارسال می‌کند. مقدار west و east از طریق عبارات مبهم‌سازی‌شده محاسبه شده و نتیجه آن به سرور ارسال می‌شود.

تحلیل تکنیک‌های مبهم‌سازی در این کد

در این کد، مبهم‌سازی با استفاده از تکنیک‌های تبدیل داده‌ها در جاوا اسکریپت انجام شده است. بیایید این کد را تجزیه و تحلیل کنیم.

1. تبدیل اعداد به عبارات بولی

در جاوا اسکریپت، می‌توان از تبدیل نوع (Type Coercion) برای تولید اعداد استفاده کرد:

  • +[] → مقدار 0 را برمی‌گرداند.
  • +!+[] → یعنی +!(+[]) که مقدار 1 را برمی‌گرداند.
  • !![] → مقدار true را دارد، و +!![] مقدار 1 را برمی‌گرداند.
  • !![]+!![] → مقدار true + true که معادل 1 + 1 = 2 است.

با ترکیب این عبارات، هر عدد دلخواه را می‌توان تولید کرد.

2. تولید عدد دلخواه

عدد 47 به روش زیر تولید شده است:

(+!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+!+[]+!![]+!![]+!![])

که مقدار 40 + 7 را تشکیل می‌دهد.

3. بررسی تعاملات مرورگر

تابع x بررسی می‌کند که آیا window.addEventListener پشتیبانی می‌شود یا خیر، که نشان می‌دهد کد روی یک مرورگر مدرن اجرا شده است.

4. ارسال مقدار مبهم‌شده به سرور

این مقدار در یک فرم مخفی (#wsidchk-form) قرار داده شده و سپس به طور خودکار ارسال می‌شود. سرور مقدار دریافتی را بررسی کرده و اگر مقدار مطابق با مقدار پیش‌بینی‌شده باشد، کاربر را به صفحه اصلی هدایت می‌کند.

چگونه این تکنیک امنیت را افزایش می‌دهد؟

استفاده از مبهم‌سازی جاوا اسکریپت در WAF باعث می‌شود که:

  1. مهاجمان نتوانند به راحتی الگوریتم بررسی ربات را درک کنند.
  2. برنامه‌های اتوماتیک و ربات‌ها قادر به شبیه‌سازی این رفتار نباشند.
  3. تحلیل و مهندسی معکوس مکانیزم‌های امنیتی WAF سخت‌تر شود.
  4. مقدار نهایی که به سرور ارسال می‌شود فقط در صورت اجرای صحیح اسکریپت در مرورگر تولید شود.

آموزش تولید کدهای جاوا اسکریپت مبهم برای امنیت WAF

در این بخش، یاد می‌گیریم که چگونه می‌توان کدهای جاوا اسکریپت را مبهم کرد تا از مهندسی معکوس و تحلیل توسط مهاجمان جلوگیری کنیم. این روش معمولاً در WAFها و دیگر سیستم‌های امنیتی استفاده می‌شود تا مهاجمان نتوانند به سادگی ساختار و عملکرد کد را درک کنند.

1. نحوه‌ی مبهم‌سازی اعداد در جاوا اسکریپت

یکی از تکنیک‌های رایج برای مبهم‌سازی در جاوا اسکریپت، استفاده از تبدیل‌های نوعی (Type Coercion) است. ما می‌توانیم اعداد را با استفاده از عملگرهای بولی و تبدیل‌های مخفی جاوا اسکریپت بسازیم.

چگونه یک عدد به صورت مبهم در جاوا اسکریپت ساخته می‌شود؟

جاوا اسکریپت دارای تبدیل‌های نوعی ضمنی است که می‌توان از آن‌ها برای تولید اعداد استفاده کرد:

  • +[] → مقدار 0 را برمی‌گرداند.
  • +!+[] → مقدار 1 را برمی‌گرداند.
  • !![] → مقدار true است، که +!![] مقدار 1 را برمی‌گرداند.
  • !![]+!![] → مقدار 2 را تولید می‌کند.

2. کد PHP برای تولید اعداد مبهم در جاوا اسکریپت

در اینجا یک کد PHP نوشته‌ایم که هر عددی را که وارد کنید، به فرمتی مبهم‌شده در جاوا اسکریپت تبدیل می‌کند.

<?php
// -------------------------------------------------------------------
// Programmer       : Ebrahim Shafiei (EbraSha)
// Email           : [email protected]
// -------------------------------------------------------------------

/**
 * Converts a number into an obfuscated JavaScript expression.
 *
 * @param int $num The number to convert.
 * @return string The obfuscated JavaScript expression.
 */
function numberToObfuscatedJS($num) {
	if ($num == 0) return "+[]"; // Zero is represented as +[]

	$result = [];
	$digits = str_split((string)$num); // Splitting number into digits

	foreach ($digits as $digit) {
		$jsExpr = "+!+[]"; // Represents 1 in JavaScript

		for ($i = 1; $i < $digit; $i++) {
			$jsExpr .= "+!![]"; // Adding 1 repeatedly
		}

		$result[] = "($jsExpr)"; // Wrapping each digit
	}

	return implode("+", $result); // Joining with +
}

// Getting input number
$number = 13660913; // Change this number as needed

// Generating the obfuscated JavaScript code
$jsCode = numberToObfuscatedJS($number);

// Outputting the final JavaScript code
echo $jsCode;

?>

 3. نحوه‌ی عملکرد این کد

این کد، عدد ورودی را می‌گیرد و آن را به فرمت مبهم جاوا اسکریپت تبدیل می‌کند. خروجی کد بالا برای عدد 13660913 به شکل زیر خواهد بود:

(+!+[])+(+!+[]+!![]+!![])+(+!+[]+!![]+!![]+!![]+!![]+!![])+(+!+[]+!![]+!![]+!![]+!![]+!![])+(+!+[])+(+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+!+[])+(+!+[]+!![]+!![])

این مقدار دقیقاً همان عدد 13660913 را برمی‌گرداند، اما خواندن و درک آن برای یک انسان یا یک ربات تحلیل‌گر بسیار سخت است.

4. نحوه‌ی استفاده در WAF و سیستم‌های امنیتی

این تکنیک را می‌توان در WAFها به شکل‌های مختلفی استفاده کرد:

  • مخفی‌سازی توکن‌های امنیتی در کد جاوا اسکریپت برای جلوگیری از سرقت.
  • جلوگیری از بررسی و تحلیل کد جاوا اسکریپت توسط ابزارهای مهندسی معکوس.
  • ایجاد بررسی‌های امنیتی مبهم که بدون اجرای کد در مرورگر واقعی، مقدار درستی را به سرور ارسال نکند.

5. نمونه‌ی استفاده از این تکنیک در یک فرم WAF

در ادامه نمونه‌ای از یک فرم مخفی در WAF آورده شده که از مقدار مبهم‌شده برای تأیید صحت کاربر استفاده می‌کند:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="robots" content="noindex, nofollow">
    <title>One moment, please...</title>
    <style>
    body {
        background: #F6F7F8;
        color: #303131;
        font-family: sans-serif;
        margin-top: 45vh;
        text-align: center;
    }
    </style>
</head>
<body>
    <h1>Please wait while your request is being verified...</h1>
    <form id="wsidchk-form" style="display:none;" action="/validate" method="POST">
        <input type="hidden" id="wsidchk" name="wsidchk"/>
    </form>
    <script>
    (function(){
        var obfuscatedValue = (+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+!+[]+!![]+!![]+!![]+!![]+!![]+[])+(+![])+(+!+[]+!![]+!![]+!![]+!![]+!![]+!![]+[]);

        document.getElementById('wsidchk').value = obfuscatedValue;
        document.getElementById('wsidchk-form').submit();
    })();
    </script>
</body>
</html>

🔹 چگونه این روش امنیت را افزایش می‌دهد؟

  • مقدار wsidchk در فرم مخفی فقط در صورتی مقدار صحیحی خواهد داشت که کد در مرورگر واقعی اجرا شود.
  • مهاجم نمی‌تواند به سادگی مقدار wsidchk را استخراج کند.
  • بدون اجرای جاوا اسکریپت، کاربر نمی‌تواند وارد شود.

در این مقاله یاد گرفتیم که چگونه می‌توان اعداد را برای استفاده در جاوا اسکریپت  مبهم کرد و از این روش در سیستم‌های امنیتی مانند WAF استفاده کرد. این تکنیک باعث می‌شود که: ✅ مهاجمان و ابزارهای مهندسی معکوس به سادگی نتوانند ساختار و مقادیر حساس را درک کنند.
فایروال‌های اپلیکیشن تحت وب (WAF) بتوانند به‌طور مؤثرتری از وب‌سایت‌ها در برابر ربات‌های مخرب و حملات محافظت کنند.
استفاده از این تکنیک‌ها در کنار دیگر راهکارهای امنیتی، لایه‌ی امنیتی قوی‌تری ایجاد کند.

🔒 مبهم‌سازی به تنهایی کافی نیست، اما در کنار روش‌های دیگر می‌تواند امنیت را بهبود دهد. 🚀


دیدگاه های مربوط به این مقاله (برای ارسال دیدگاه در سایت حتما باید عضو باشید و پروفایل کاربری شما تکمیل شده باشد)