آموزش XpathInjection یکی از مباحث مهم در حوزه امنیت وب و تست نفوذ است که معمولاً کمتر از SQL Injection به آن پرداخته میشود، اما در پروژههایی که از XML بهعنوان دیتابیس استفاده میکنند، میتواند بسیار خطرناک باشد. در این مقاله از زیرزمین سایبری، Xpath Injection را از پایه توضیح میدهیم و با مثالهای عملی نشان میدهیم این آسیبپذیری چگونه رخ میدهد و چرا باید جدی گرفته شود.
XPath یک زبان کوئرینویسی برای استخراج داده از اسناد XML است. همانطور که SQL برای دیتابیسهای رابطهای استفاده میشود، XPath نیز برای واکشی اطلاعات از ساختار XML کاربرد دارد. بسیاری از وباپلیکیشنها، مخصوصاً اپلیکیشنهای قدیمی یا سیستمهای سبک، از XML بهجای دیتابیسهای کلاسیک استفاده میکنند.
مشکل از جایی شروع میشود که دادهی ورودی کاربر بدون اعتبارسنجی داخل کوئری XPath قرار میگیرد؛ دقیقاً همان سناریویی که در SQL Injection هم دیدهایم.
Xpath Injection زمانی رخ میدهد که یک مهاجم بتواند ورودی دلخواه خود را وارد یک XPath Query کند و منطق کوئری را تغییر دهد. اگر مهاجم کنترل بخشی از کوئری را به دست بگیرد، میتواند اطلاعات بیشتری از XML استخراج کند یا حتی احراز هویت را دور بزند.
با اینکه XPath Injection از نظر مفهومی شبیه SQL Injection است، اما دو تفاوت مهم دارد. تفاوت اول این است که XPath فقط برای خواندن داده استفاده میشود و امکان درج یا ویرایش داده وجود ندارد. تفاوت دوم این است که XPath هیچ سیستم کنترل دسترسی داخلی ندارد؛ یعنی اگر نقطه تزریق پیدا شود، معمولاً کل سند XML قابل استخراج است.
به همین دلیل، در بسیاری از موارد Xpath Injection میتواند حتی خطرناکتر از SQL Injection باشد.
در این آموزش XpathInjection تمرکز ما روی XPath نسخه ۱ است، چون هنوز هم رایجترین نسخهای است که در وبسایتها استفاده میشود. بسیاری از اپلیکیشنهای PHP قدیمی، همچنان از XPath1 استفاده میکنند.
به کد PHP زیر توجه کنید که یک سیستم لاگین ساده برای ادمین را پیادهسازی کرده است:
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 استفاده میشود، اما:
به همین دلیل، دانستن آموزش XpathInjection برای هر کسی که در حوزه تست نفوذ، باگ بانتی یا امنیت وب فعالیت میکند، ضروری است.
مهمترین راهکار جلوگیری از Xpath Injection، عدم استفاده مستقیم از ورودی کاربر در XPath Query است. استفاده از اعتبارسنجی ورودی، محدود کردن کاراکترها و در صورت امکان، استفاده از روشهای امنتر برای جستجو در XML میتواند ریسک را تا حد زیادی کاهش دهد.
در این مقاله، بهصورت کامل و عملی با مفهوم آموزش XpathInjection آشنا شدیم، تفاوت آن با SQL Injection را بررسی کردیم و دیدیم چگونه یک کد ساده PHP میتواند منجر به افشای کامل دیتابیس XML شود. اگر در حوزه امنیت وب فعالیت میکنید، شناخت این آسیبپذیری یک الزام است، نه انتخاب.
19%
19%