رفتن به مطلب
بازگشایی انجمن! ×
GuardIran

پست های پیشنهاد شده

به نام خدا

در این سری آموزش ها، ابتدا توضیحاتی راجع به زبانXML  داده می شود، سپس در ادامه به بررسی(XPath)  XML Path language در XML میپردازیم و درنهایت به صورت عملی روش ها و تکنیک های Xpath Injection رو توضیح می دهیم.

این آموزش در 3 قسمت ارایه می شود: 

قسمت اول آموزش

قسمت دوم آموزش

قسمت سوم آموزش

دوستانی که سوال، نظر یا پیشنهادی در مورد آموزش ها دارند در بخش سوال و جواب های  انجمن مطرح کنند.

موفق باشید

 

GUARDIRAN SECURITY TEAM

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


قسمت اول

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

زبان XML

همانطور که مطلع هستید اگر ما بخواهیم حملات SQLInjection انجام بدیم نیاز به دانستن ساختار و دانش پایگاه داده مثل (جداول، سطرها، ستون و..) هستیم در حملات XPath Injection هم به همین صورت نیاز به درک اصطلاحات، ساختار و دانش اولیه در مورد XML است.

در پایین مقدمه ای برای درک اصطلاحات XML از سایت w3schools.com گرفته شده است.

  • XML مخفف زبان نشانه گذاری Extensible Markup Language است
  • XML یک زبان نشانه گذاری شبیه به HTML است.
  • XML برای ذخیره و انتقال اطلاعات طراحی شده است
  • تگ‌های XML از قبل تعریف نشده‌اند، خودتان‌ باید تگ ها را تعریف کنید.
  • XML به صورت خود توصیفی (self-descriptive) طراحی شده است.

 

XMLهیچ کاری انجام نمی‌دهد!

مثال زیر متنی است از طرف mary برای ajax با XML نوشته شده:

 

This is the hidden content, please

 

متن بالا یک متن خود‌ توصیفی است. این متن اطلاعاتی در مورد ارسال کننده (from)  و دریافت کننده  (to) دارد و همچنین دارای یک عنوان (heading) و یک پیغام (body) است.

اما این سند XML هنوز هیچ کاری انجام نمی‌دهد و تنها یکسری اطلاعات است که درون تگ‌ها قرار گرفته، یک نفر باید برای ارسال، دریافت یا نمایش این سند برنامه‌ای بنویسد.

 

توسط XML شما تگ‌ های خودتان را می‌سازید

تگ‌ های مثال بالا مثل <to> و <from> در هیچ استانداردی برای XML تعریف نشده‌اند. این تگ ‌ها توسط نویسنده این سند XML ساخته شده‌اند به دلیل این که زبان XML هیچ تگ از پیش تعریف شده‌ای ندارد.

تگ‌هایی که درون HTML استفاده می‌شوند از قبل تعریف شده‌اند. یک سند HTML فقط می‌تواند از تگ‌هایی استفاده کند که در استاندارد HTML تعریف شده باشند مثل <h1> ،<p>  و ...

XML اجازه می‌دهد که نویسنده خودش ، تگ ها و همچنین ساختار سند را تعریف کند.

 

تفاوت  بین XML  و HTML

  • XML برای توصیف داده‌ها و تمرکز بر محتوای داده‌ها طراحی شده است.
  • HTML برای نمایش داده‌ها و نحوه‌ ی نمایش داده‌ها طراحی شده است.
  • HTML مخصوص نمایش داده‌ ها است در حالی که XML مخصوص انتقال اطلاعات است.

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


XPath

قبل از یادگیری XPath، ابتدا باید XSL را که مخفف extensible Stylesheet Language است را درک کنیم که همانند CSS برای HTML است.

در اسناد HTML، تگ های از پیش تعریف شده مانند table، div، span و غیره... استفاده می شود. مرورگر می- داند که چگونه آن ها را (با استفاده از CSS) نمایش دهد.

همانطور که گفته شد در اسناد XML، تگ ها از پیش تعریف نمی شوند به منظور درک و به رسمیت شناختن یک سند XML، کنسرسیوم جهانی وب،  XSLرا توسعه داده است که می تواند به عنوان یک زبان Stylesheet مبتنی بر XML عمل کند. یک سند XSL مشخص می کند چگونه یک مرورگر باید سند XML را ارائه دهد.

 

بخش های اصلی XSL 

  •   XSL برای تبدیل اسناد XML به انواع دیگر سند استفاده می شود.
  •   XPath برای سرچ و بازیابی داده ها در اسناد XML استفاده می شود.
  •   XSL-FO برای فرمت XML اسناد استفاده می شود.

 

پس XPath یک زبان پرس و جو است که برای آدرس دهی و سرچ اطلاعات در یک سند XML استفاده می شود.

 

در هنگام کار با XPath، باید نکات زیر را در نظر داشته باشید:

  • XPath یک عنصر اصلی در استاندارد XSLT است  
  • XSLT نمی تواند بدون XPath کار کند.
  •  XPath مبتنی بر XQuery و XPointer است.

 

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


اصطلاحات  XPath

گره ها (nodes)

درXPath، هفت نوع گره وجود دارد: عنصر، ویژگی، متن، فضای نام، پردازش، نظر، و گره های سند.

  • Root
  •  Element
  •  Text
  • Attribute
  •  Comment
  • Processing Instruction
  •  Namespace

اسناد XML به عنوان درختان گره به محسوب می شوند. بالاترین عنصر درخت عنصر ریشه (root) است.

 

به سند XML زیر نگاه کنید:

This is the hidden content, please

 

مثال گره در سند XML بالا :

This is the hidden content, please

 

 ارزش های ریز (Atomic values)

مقادیر اتمی، گره های بدون فرزند یا والدین است.

مثال مقادیر ریز :

This is the hidden content, please

آیتم ها (Items)

آیتم ها، مقادیر اتمی یا گره ها هستند.

 

رابطه گره ها (Relationship of Nodes)

1.والدین (Parent)

هر عنصر و ویژگی یک والد دارد.

در مثال زیر: عنصر book، والدین title, author, year, price است.

This is the hidden content, please

 

 

 

2.فرزندان (Children)

گره های عنصر ممکن است صفر، یک یا چند فرزند داشته باشند.

در مثال زیر: title, author, year, price همه فرزندان عنصر عنصر book هستند.

This is the hidden content, please

 

 

3.هم نژاد (Siblings)

گره هایی که والدین مشابه دارند.

در مثال زیر: title, author, year, price همه هم نژاد هستند. 

This is the hidden content, please

 

4. اجداد (Ancestors)

والدین گره، پدر و مادر والدین و غیره

در مثال زیر:عنصر bookstore اجداد title, author, year, price و book است.

This is the hidden content, please

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


XPath Syntax

XPath از عبارات مسیر (path) برای انتخاب گره ها (nodes) در یک سند XML استفاده می کند.

این عبارات مسیر بسیار شبیه عبارات مسیری است که شما با سیستم فایل های کامپیوتری سنتی استفاده می کنید:

This is the hidden content, please

 

پر کار برد ترین اصطلاحات )دستورات( برای انتخاب مسیر ، به شرح زیر می باشد :

توضیحات

عبارت

انتخاب تمام گره ها از  "اسم گره"

اسم گره (node name)

انتخاب از گره ریشه اصلی

/

انتخاب گره ها از فایل جاری

//

انتخاب گره ی فعلی

.

انتخاب زیر مجموعه گره از گره ی فعلی

..

انتخاب ویژگی )متغیر(

@

 

جست جوی عبارات مشخص (Predicate)

برای پیدا کردن یک گره خاص یا گره ای که حاوی مقدار خاصی (استخراج گره ها به همراه مقدار های ذخیره شده) هستند استفاده می شود.

Predicate همیشه به شکل براکت [ ] هستند.

 

نمونه ی یک سند XML

 

 

This is the hidden content, please

 

در جدول زیر مثال هایی از سند بالا بیان شده است :

نتایج

مسیر ها به همراه دستورات

انتخاب المنت اول از مجموعه المنت های bookstore

/bookstore/book[1]

انتخاب آخرین کتاب از المنت هایbookstore  

/bookstore/book[last()]

انتخاب تمامی المنت های موجود به جز آخرین المنت

/bookstore/book[last()-1]

انتخاب اولین دو کتاب از مجموعه المنت هایbookstore  

/bookstore/book[position()<3]

انتخاب موضوع تمامی المنت هایی که دارای المنت lang هستند

//title[@lang]

انتخاب تمامی موضوعاتی که دارای المنت lang با مقدار en هستند

//title[@lang='en']

انتخاب تمامی کتاب هایی که قیمت آن ها بزرگ تر از 35.00 هستند در مجموع المنت های bookstore  

/bookstore/book[price>35.00]

انتخاب تمامی موضوعات کتاب ها در مجموعه bookstore  که قیمت آن ها بیشتر از 35.00 می باشد

 

/bookstore/book[price>35.00]/title

 

انتخاب مسیر های نامشخص (Selecting Unknown Nodes)

برای انتخاب گره های ناشناخته XML می توانیم از  wildcards XPath استفاده کرد.

 

 

توضیحات

Wildcard

در نظر گرفتن هر گره عنصر

*

در نظر گرفتن هر المنت در گره

@*

در نظر گرفتن هر گره در هر جایی

node()

 

انتخاب چندین مسیر (Selecting Several Paths)

با استفاده از عملگر |  میتوانیم به چندین مسیر درXPath  دست یابیم و استفاده کنیم .با این عملگر میتوانیم چندین مسیر را درXPath  انتخاب کنیم .

 

 

نتایج

مسیرها

انتخاب موضوعات و قیمت ها از المنت های درون المنت کتاب

//book/title | //book/price

انتخاب تمامی موضوعات و قیمت ها در سند

//title | //price

انتخاب تمامی موضوعات در المنت های کتاب در المنت های
bookstore  و قیمت ها در سند

/bookstore/book/title | //price

 

تا اینجا با مفهموم XPath آشنا شدید، در ادامه یک مثال از نحوه ی جست جوی عبارات با هم کار میکنیم تا مطلب بهتر درک شود.

 

اگر یک کد php به صورت زیر داشته باشیم:

This is the hidden content, please

 

این کد یک فایل XML به نام coffee.xml رو لود میکنه که دارای یک button جستجو است و وقتی روی اون کلیک شد نتایج از فایل coffee.xml  فراخوانی می شود درواقع ورودی ما همان کوئری میشود که ارسال می کنیم.

 

کدهای فایل coffee.xml  نیز به این صورت است:

 

This is the hidden content, please

 

 

مطابق جدولی که مربوط به Predicate میشد می توان هرکدام از دستورات رو در اینجا تست کرد برای مثال می خواهیم که اولین المنت از مجموعه المنت های Coffees رو جستجو کنیم:

 

This is the hidden content, please

 

با استفاده از تابع ()position نیز میتوانیم خروجی های متفاوت تری داشته باشیم مثلا میتوانیم دوتا المنت اول رو در خروجی نمایش دهیم:

This is the hidden content, please

 

خروجی دیگر دستورات نیز به همان صورتی است که در جدول مربوط به Predicate ذکر شده است.

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

پایان قسمت اول

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


قسمت دوم 

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

در قسمت اول به طور خلاصه با مبانی XML و XPath آشنا شدید. 

در ادامه به بررسی آسیب پذیری های XML و همچنین بایپس ها و متدهای تزریقی زبان پرس و جوی  XPath  می پردازیم. قبل از اینکه به مبحث XPath Injection بپردازم ابتدا چند مورد پیش نیاز رو توضیح خواهم داد.

عملگرهای منطقی  (logical operators)

عملگرهای منطقی، منطق بین مقادیر رو مشخص می کند که خروجی آن یک مقدارtrue / false)  Boolean) است.

 

عملگر

نام

&&

AND

||

OR

 

ترکیب شروط

عملوند اول
A

عملوند دوم
 B

نتیجه
A && B

نتیجه
A || B

True

True

True

True

True

False

False

True

False

True

False

True

False

False

False

False

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


مقدمه ای برای XPATH Injection

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

در یک سند xml نیز با استفاده از XPath querying پرس و جویی هایی به سمت فایل های XML که دیتابیس ما محسوب می شود انجام می گیرد.

تزریقات ما شبیه به SQL است با این تفاوت که کوئری ها و همچنین نتایج متفاوت است.

 

مثالی ساده از XPATH Injection

یک برنامه وب را که از XPath برای پرس و جوی یک سند XML و بازیابی استفاده می کند را در نظر بگیرید این سند به گونه ای عمل می کند که نام کاربری و رمز عبور را از مشتری دریافت می کند چنین برنامه ای می- تواند این مقادیر را به طور مستقیم در XPath query قرار دهد

برای مثال :

کد php

This is the hidden content, please

 

کد xml

This is the hidden content, please

 

و صفحه ی login ما نیز به صورت زیر است:

This is the hidden content, please

 

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

This is the hidden content, please

This is the hidden content, please

 

می بینید که id 1 با نام کاربری neo رو نمایش داد.

This is the hidden content, please

 

دلیل این کار چیست؟

query ما در کد php به این صورت است:

This is the hidden content, please

 

  ورودی که ما وارد کرده ایم به این صورت است:

This is the hidden content, please

 

This is the hidden content, please

 

در این ترکیب شروط تنها قسمت اول مورد مقایسه انجام گرفته است که true می باشد. اگر شرط ما درست باشد با تمامی یوزرهای درون دیتابیس XML مطابقت دارد یعنی تمام آن ها را برمیگرداند ولی برای اینکه خروجی کمتری داشته باشیم کد php به صورتی نوشته ایم که تنها یوزر اول نمایش داده شود.

This is the hidden content, please

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


تزریق در فایل XML با دانش صفر

گزینه های مورد بررسی :

1.       تست و تایید XPATHi

2.       تکرار روی گره ها + استخراج داده ها از گره ها

3.       استخراج داده از گره ها و المنت های هم نژاد

 

1.تست و تایید XPATHi

تست و تایید XPATHi مهمترین بخش است. وقتی ما یک ورودی را می بینیم، اولین چیزی که بررسی می- کنیم استفاده از متد های تست است:

This is the hidden content, please

در مورد XPATH یا SQLi و بسیاری از تزریق های دیگر از همین متدها استفاده خواهیم کرد بنابراین برای تایید اینکه آیا XPATHi است از متد ()position  استفاده میکنیم که مربوط به XPATH است:

 

This is the hidden content, please

اگر هر کدام از موارد بالا کار کرد، می توانید فرض کنید تزریق شما با یک تزریق XPATH انجام می شود.

 

2.تکرار روی گره ها + استخراج داده ها  از گره ها

کد xml ما به صورت زیر است:

This is the hidden content, please

یک کوئری SQL را به صورت زیر در نظر بگیرید:

This is the hidden content, please

 

اگر بخواهیم آن را به یک کوئری XPATH  تبدیل کنیم به این صورت عمل میکنیم:

This is the hidden content, please

 

همانطور که در پرس و جو بالا می بینید، ابتدا مسیر رو مشخص کردیم، سپس شرایط و سپس آنچه که ما می خواهیم استخراج کنیم را مشخص کرده ایم.

اگر به جای رشته عبارت ورودی [id='1'] ما از متد بایپس استفاده کنیم که در بالا توضیح داده شد به این صورت:

This is the hidden content, please

میتوانیم جزئیات مربوط به اولین کاربر را مشاهده کنیم.

 

فرض بر این است که ما شناسه کاربر (ID) را برای هر کاربر نمی شناسیم و می خواهیم نام های کاربری همه کاربران را بررسی کنیم، بنابراین می توانیم از متدposition ()  استفاده کنیم. یک مثال از متدposition ()  :

This is the hidden content, please

 

میخواهیم پرس و جویی که قبلا انجام دادیم را با استفاده از متد ()position  تزریق کنیم:

This is the hidden content, please

 

در اینجا گفته ایم که شناسه باید خالی باشد و نام کاربری اولین یوزر را دریافت کنیم اما این تزریق به ما اجازه نمی دهد که جزییات دیگری، مانند ستون های دیگر در SQL یا XPATH یا دیگر المنت های هم نژاد رو به دست آوریم زیرا در انتهای جستجو گفته ایم که تنها نام کاربری را دریافت کنیم.

 

 

3.استخراج داده از گره ها و المنت های هم نژاد

 

برای استخراح داده ها و المنت های هم نژاد از عملگر pipe استفاده می کنیم که دو کوئری رو باهم ترکیب می کند مثال :

This is the hidden content, please

 

خب در اینجا ما نام ستون رو برای کلمه عبور،  password قرار دادیم که فقط یک فرض بود اما گر نام ستون برای کلمه عبور “my-pass” باشد چگونه می توان آن را استخراج کرد؟ می توان از یک ترفند استفاده کنیم! اگر در قسمت 1 آموزش انتخاب مسیر های نامشخص را خوانده باشید می توانیم برای انتخاب گره یا عنصر ناشناخته از * استفاده کنیم:

This is the hidden content, please

 

راه های فوق بهترین راه برای استخراج داده از فایل های آسیب پذیر XML می باشند. به این صورت شما میتوانید اینجکت خود را انجام دهید و به داده های درون فایل های دست یابید.

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

پایان قسمت دوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


قسمت سوم 

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

توابع XML در  پایگاه داده MySQL

توابع ()ExtractValue و ()UpdateXML قابلیت XPath 1.0 را ارائه می کنند. عبارات XPath از این توابع برای پشتیبانی از متغیرهای کاربر و متغیرهای برنامه ذخیره شده محلی استفاده می کند.

در این قسمت بحث اصلی بر روی تابع ()ExtractValue است.

 

تابع ()ExtractValue

تابع ()ExtractValue  برای استخراج داده از یک رشته XML با استفاده از XPath استفاده می شود.

 

ورودی های تابع extract value به صورت زیر است:

This is the hidden content, please

در اینجا اگر کوئری  xpath ما به طور متناوب اشتباه باشد با خطای زیر مواجه میشویم:

 

This is the hidden content, please

چرا باید از این نوع متد inject استفاده کنیم ؟

در بعضی از وب اپلیکشن ها وقتی نتونیم تزریق خود را با متدهایی مثل death row انجام بدهیم و هیچ خروجی به ما نمایش داده نشود و برنامه نویس صحت ورودی ها را به درستی چک کند در این شرایط از این متد استفاده می کنیم و به پایگاه داده نفوذ می کنیم.

به طور مثال در کوئری زیر:

This is the hidden content, please

هیچ خروجی نشان داده نمی شود و نمی توانیم از تکنیک union select استفاده کنیم.در این شرایط است که باید از injection xpath استفاده کنیم.

 

در مثال بالا می بینیم که بعد از عدد 1 دابل کوتیشین امده است پس متوجه می شویم که تزریق ما باید از نوع رشته string باشد.

در نتیجه کوئری ما به شکل زیر میباشد:

This is the hidden content, please

 

و در ادامه تزریق خودمان را با استفاده از تزریق XPATH ادامه می دهیم

This is the hidden content, please

برای مثال دریافت اسم پایگاه داده از تزریق زیر استفاده می کنیم:

 

This is the hidden content, please

خروجی :  XPATH syntax error: ' database_name_here'

 

 

اگر بخواهیم اسم جداول را بدست بیاریم تزریق ما به شکل زیر می شود:

This is the hidden content, please

خروجی : XPATH syntax error: 'table_name_here'

 

در مثال بالا دلیل استفاده از limit این است که این در این تکنیک ما نمی توانیم اطاعات طولانی بیشتر از ۳۲ کاراکتر را استخراج کنیم

 به عنوان مثال در تزریق بالا مشخص شد که اسم جدول های ما به صورت زیر است:

  • Posts
  • Assets
  • Banner
  • Links
  • Users

 

سپس با استفاده از تزریق زیر میتوانیم ستون های مورد نظر خود را پیدا کنیم:

This is the hidden content, please

خروجی : XPATH syntax error: 'column_name_here'

خروجی تزریق فوق :

  • id
  • username
  • password

 

برای اینکه تعداد یوزرها رو بدانیم از راه حل زیر استفاده میکنیم :

This is the hidden content, please

خروجی :  XPATH syntax error: 'count_will_come_here'

 

و درنهایت با استفاده از تزریق زیر اطلاعاتی که مد نظر است را استخراج می کنیم :

This is the hidden content, please

خروجی : XPATH syntax error: 'Output_here'

 

 

تابع ()UpdateXML

UPDATEXML یک نمونه XMLType و یک جفت XPath را به عنوان آرگومان در نظر می گیرد و یک نمونه XMLType را با مقدار به روز شده برمی گرداند.

این تابع نیز مشابه تابع extractvalue عمل می کنید و نیازی به توضیح نیست با دیدن مراحل زیر فرق بین این دو تابع رو خواهید فهمید . 

 

ورودی های تابع extract value به صورت زیر است:

This is the hidden content, please

در اینجا اگر کوئری  xpath ما به طور متناوب اشتباه باشد با خطای زیر مواجه میشویم:

This is the hidden content, please

 

در ادامه تزریق خود را ادامه میدهیم

1-

This is the hidden content, please

2-

This is the hidden content, please

Output : XPATH syntax error: ':database_name_here'

 

3-

This is the hidden content, please

Output : XPATH syntax error: ':table_name_here'

 

5-

This is the hidden content, please

Output : XPATH syntax error: ':column_name_here'

 

6-

This is the hidden content, please

Output : XPATH syntax error: ':count_will_come_here'

 

7-

This is the hidden content, please

Output : XPATH syntax error: ':Output_here'

 

 

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

پایان قسمت سوم

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


منابع: 

This is the hidden content, please

This is the hidden content, please

 

سربلند و پیروز باشید.

 

نویسنده : P0S3ID0N

تیم امنیتی گاردایران

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


مهمان
این موضوع برای عدم ارسال قفل گردیده است.
×
×
  • ایجاد مورد جدید...