آموزش XpathInjection | بررسی کامل آسیب‌پذیری XPath Injection به زبان ساده

خواندن این مطلب

4 دقیقه

زمان میبرد!

آموزش XpathInjection | بررسی کامل آسیب‌پذیری XPath Injection به زبان ساده

آموزش XpathInjection یکی از مباحث مهم در حوزه امنیت وب و تست نفوذ است که معمولاً کمتر از SQL Injection به آن پرداخته می‌شود، اما در پروژه‌هایی که از XML به‌عنوان دیتابیس استفاده می‌کنند، می‌تواند بسیار خطرناک باشد. در این مقاله از زیرزمین سایبری، Xpath Injection را از پایه توضیح می‌دهیم و با مثال‌های عملی نشان می‌دهیم این آسیب‌پذیری چگونه رخ می‌دهد و چرا باید جدی گرفته شود.

XPath چیست و چرا مهم است؟

XPath یک زبان کوئری‌نویسی برای استخراج داده از اسناد XML است. همان‌طور که SQL برای دیتابیس‌های رابطه‌ای استفاده می‌شود، XPath نیز برای واکشی اطلاعات از ساختار XML کاربرد دارد. بسیاری از وب‌اپلیکیشن‌ها، مخصوصاً اپلیکیشن‌های قدیمی یا سیستم‌های سبک، از XML به‌جای دیتابیس‌های کلاسیک استفاده می‌کنند.

مشکل از جایی شروع می‌شود که داده‌ی ورودی کاربر بدون اعتبارسنجی داخل کوئری XPath قرار می‌گیرد؛ دقیقاً همان سناریویی که در SQL Injection هم دیده‌ایم.

XPath Injection چیست؟

Xpath Injection زمانی رخ می‌دهد که یک مهاجم بتواند ورودی دلخواه خود را وارد یک XPath Query کند و منطق کوئری را تغییر دهد. اگر مهاجم کنترل بخشی از کوئری را به دست بگیرد، می‌تواند اطلاعات بیشتری از XML استخراج کند یا حتی احراز هویت را دور بزند.

مطلب پیشنهادی:   فروم های دارک وب ۲۰۲۵

تفاوت Xpath Injection با SQL Injection

با اینکه XPath Injection از نظر مفهومی شبیه SQL Injection است، اما دو تفاوت مهم دارد. تفاوت اول این است که XPath فقط برای خواندن داده استفاده می‌شود و امکان درج یا ویرایش داده وجود ندارد. تفاوت دوم این است که XPath هیچ سیستم کنترل دسترسی داخلی ندارد؛ یعنی اگر نقطه تزریق پیدا شود، معمولاً کل سند XML قابل استخراج است.

به همین دلیل، در بسیاری از موارد Xpath Injection می‌تواند حتی خطرناک‌تر از SQL Injection باشد.

تمرکز این آموزش روی XPath1

در این آموزش XpathInjection تمرکز ما روی XPath نسخه ۱ است، چون هنوز هم رایج‌ترین نسخه‌ای است که در وب‌سایت‌ها استفاده می‌شود. بسیاری از اپلیکیشن‌های PHP قدیمی، همچنان از XPath1 استفاده می‌کنند.

مثال عملی Xpath Injection در PHP

به کد PHP زیر توجه کنید که یک سیستم لاگین ساده برای ادمین را پیاده‌سازی کرده است:

				
					<?php
include 'db.php';
$xml = new SimpleXMLElement($db);

// Get the password from POST data
$pass = isset($_POST['pass']) ?  $_POST['pass'] : "";

$query = '/user[name="admin" and password="'. $pass .'"]';
$is_admin = $xml->xpath($query);
if ($is_admin){
  echo "Welcome admin";
}
?>
				
			

در این کد، مقدار pass که مستقیماً از ورودی کاربر دریافت شده، بدون هیچ فیلتر یا اعتبارسنجی داخل XPath Query قرار گرفته است. این دقیقاً همان اشتباه مرگباری است که باعث ایجاد آسیب‌پذیری Xpath Injection می‌شود.

کوئری نهایی چگونه ساخته می‌شود؟

اگر کاربر یک پسورد عادی وارد کند، کوئری به شکل زیر ساخته می‌شود:

				
					/user[name="admin" and password="123456"]
				
			

اما حالا تصور کنید مهاجم مقدار زیر را به‌عنوان پسورد ارسال کند:

				
					admin" or "a"="a
				
			

در این حالت، کوئری نهایی به این شکل درمی‌آید:

				
					/user[name="admin" and password="admin" or "a"="a"]
				
			

از آنجایی که "a"="a" همیشه درست است، شرط احراز هویت کاملاً دور زده می‌شود و مهاجم بدون داشتن پسورد واقعی، به‌عنوان ادمین لاگین می‌کند.

فقط بایپس لاگین؟ نه، خیلی بیشتر!

Xpath Injection فقط برای دور زدن لاگین نیست. یکی از قابلیت‌های خطرناک XPath، امکان merge کردن نودها است. مهاجم می‌تواند به‌جای اینکه فقط نود user را دریافت کند، کل ریشه XML (/) را به نتیجه کوئری اضافه کند. به زبان ساده، یعنی کل دیتابیس XML لو می‌رود. در چنین حالتی، مهاجم می‌تواند:

  • تمام کاربران را استخراج کند
  • ساختار داخلی XML را بشناسد
  • اطلاعات حساس مثل رمزها یا توکن‌ها را به دست بیاورد

 

چرا Xpath Injection هنوز خطرناک است؟

با اینکه امروزه کمتر از XML استفاده می‌شود، اما:

  • سیستم‌های قدیمی هنوز فعال هستند
  • بسیاری از پروژه‌های سازمانی مهاجرت نکرده‌اند
  • برنامه‌نویسان تازه‌کار امنیت XPath را جدی نمی‌گیرند


به همین دلیل، دانستن آموزش XpathInjection برای هر کسی که در حوزه تست نفوذ، باگ بانتی یا امنیت وب فعالیت می‌کند، ضروری است.

چگونه از Xpath Injection جلوگیری کنیم؟

مهم‌ترین راهکار جلوگیری از Xpath Injection، عدم استفاده مستقیم از ورودی کاربر در XPath Query است. استفاده از اعتبارسنجی ورودی، محدود کردن کاراکترها و در صورت امکان، استفاده از روش‌های امن‌تر برای جستجو در XML می‌تواند ریسک را تا حد زیادی کاهش دهد.

جمع‌بندی

در این مقاله، به‌صورت کامل و عملی با مفهوم آموزش XpathInjection آشنا شدیم، تفاوت آن با SQL Injection را بررسی کردیم و دیدیم چگونه یک کد ساده PHP می‌تواند منجر به افشای کامل دیتابیس XML شود. اگر در حوزه امنیت وب فعالیت می‌کنید، شناخت این آسیب‌پذیری یک الزام است، نه انتخاب.

درباره نویسنده



نظرات کاربران



دیدگاهتان را بنویسید

مطالب مرتبط



محصولات جدید

19%
آموزش Docker
تومان
65,000
80,000
آموزش Api نویسی با Nodejs
تومان
356,000
19%
تست نفوذ با کالی لینوکس | PWK
تومان
65,000
80,000
آموزش NPM برای جاوا اسکریپت
تومان
4,560,000
آموزش کاربردی Vscode | مقدماتی تا پیشرفته
تومان
180,000
آموزش شبکه با گرایش امنیت
رایــگان

جستجو کنید ...

تبلیغات