
يفك تشفير ويزيل توقيع ملفات تعريف الارتباط الجلسة الضعيفة من أطر Django وFlask وLaravel وExpress وJWT. يدعم أدوات فك التشفير المستندة إلى HMAC، وقوائم كلمات base64، وخطوط أنابيب الأتمتة للكشف السريع عن الثغرات.
CookieMonster هي أداة سطر أوامر وواجهة برمجة تطبيقات لفك تشفير وتعديل ملفات تعريف الارتباط (الكوكيز) الضعيفة الخاصة بالجلسات من عدة أطر عمل مختلفة. وهي مصممة للعمل في خطوط الأنابيب الآلية التي يجب أن تكون قادرة على معالجة كمية كبيرة من هذه الكوكيز بكفاءة لاكتشاف الثغرات الأمنية بسرعة. بالإضافة إلى ذلك، CookieMonster قابلة للتوسع ويمكنها بسهولة دعم صيغ جديدة للكوكيز.
من الجدير التأكيد على أن CookieMonster يكتشف الثغرات الأمنية في مستخدمي الأطر، وليس عادةً في الأطر نفسها. يمكن لهؤلاء المستخدمين حل الثغرات التي تم اكتشافها عبر CookieMonster عن طريق تكوين الإطار لاستخدام مفتاح سري قوي.
| الإطار | مدعوم | ملاحظات |
|---|---|---|
| رموز الويب JSON | ✅ | HS256, HS384, HS512 |
| Django | ✅ | الخوارزميات الشائعة |
| Flask | ✅ | الخوارزميات الشائعة |
| Rack | ✅ | الخوارزميات الشائعة |
| Express (موقّع الكوكيز) | ✅ | الخوارزميات الشائعة |
| Laravel | ✅ | AES-CBC-128/256 (GCM غير مدعوم بعد) |
| itsdangerous | ✅ | URLSafeSerializer/URLSafeTimedSerializer (الملح الافتراضي) |
| أخرى | ❌ | ليس بعد! |
لتثبيت CookieMonster، قم بتثبيت Go ثم قم بتثبيت واجهة الأوامر:
go install github.com/iangcarroll/cookiemonster/cmd/cookiemonster@latest
CookieMonster يحتاج فقط إلى شيئين أساسيين: كوكيز لمحاولة إزالة توقيعه، وقائمة كلمات لاستخدامها. إذا لم يكن لديك قائمة كلمات، فإن CookieMonster يأتي بقائمة كلمات افتراضية من مشروع Flask-Unsign. تختلف قوائم كلمات CookieMonster قليلاً؛ يجب أن يكون كل سطر مشفرًا بـ base64. وذلك لأن مشاريع Python غالبًا ما تُدرج بايتات غير مرغوب فيها في هذه المفاتيح، ونحتاج إلى أن نكون قادرين على التعامل معها بشكل صحيح.
مثال على استخدام واجهة الأوامر مع كوكيز ثابتة، أو مع رابط URL:
% ./cookiemonster -cookie "gAJ9cQFYCgAAAHRlc3Rjb29raWVxAlgGAAAAd29ya2VkcQNzLg:1mgnkC:z5yDxzI06qYVAU3bkLaWYpADT4I"
🍪 CookieMonster 1.3.0
ℹ️ CookieMonster loaded the default wordlist; it has 38919 entries.
✅ Success! I discovered the key for this cookie with the django decoder; it is "changeme".
% ./cookiemonster -url "https://httpbingo.org/cookies/set?abc=gAJ9cQFYCgAAAHRlc3Rjb29raWVxAlgGAAAAd29ya2VkcQNzLg:1mgnkC:z5yDxzI06qYVAU3bkLaWYpADT4I"
🍪 CookieMonster 1.3.0
⚠️ I got a non-200 status code from this URL; it was 302.
ℹ️ CookieMonster loaded the default wordlist; it has 38919 entries.
✅ Success! I discovered the key for this cookie with the django decoder; it is "changeme".
CookieMonster قادر على دعم الكوكيز الموقعة باستخدام cookie-session، وهو شائع مع Express. ومع ذلك، فإنه يقوم بعدة أشياء غريبة تتطلب الحذر لاستخدام هذه الأداة. استجابة شائعة من تطبيق cookie-session قد تبدو هكذا:
set-cookie: session=eyJhbmltYWxzIjoibGlvbiJ9
set-cookie: session.sig=Vf2INocdJIqKWVfYGhXwPhQZNFI
لكي تمرر هذا إلى CookieMonster، يجب عليك تضمين اسم الكوكيز وكوكيز التوقيع. في هذا المثال، يمكنك استدعاء CookieMonster هكذا: cookiemonster -cookie session=eyJhbmltYWxzIjoibGlvbiJ9^Vf2INocdJIqKWVfYGhXwPhQZNFI (لاحظ الفاصل ^ واسم الكوكيز المسبوق). تقبل واجهة API نفس هذا التنسيق في monster.NewCookie.
CookieMonster يدعم إعادة التوقيع بشكل محدود بمجرد إزالة توقيع الكوكيز، باستخدام العلم -resign. يتضمن ذلك تعديل محتوى الكوكيز ليتوافق مع الإدخال الخاص بك، ثم إعادة حساب التوقيع باستخدام المفتاح الذي اكتشفناه. حاليًا، يمكنك القيام بذلك للكوكيز التي تم فك تشفيرها من Django؛ تأكد من تمرير الكوكيز الأصلية إلى -cookie، وتمرير إلى -resign سلسلة نصية غير مشفرة تريد أن تكون داخل الكوكيز. سيقوم CookieMonster بتشفير إدخالك بشكل صحيح ثم إعادة توقيع الكوكيز.
CookieMonster يعرض pkg/monster، مما يسمح للتطبيقات الأخرى بالاستفادة منه بسهولة. هذا أكثر كفاءة بكثير من تشغيل واجهة الأوامر إذا كنت تختبر العديد من الكوكيز. مثال على استخدامه أدناه.
import (
"github.com/iangcarroll/cookiemonster/pkg/monster"
"errors"
)
var (
//go:embed wordlists/my-wordlist.txt
monsterWordlist string
wl = monster.NewWordlist()
)
func init() {
if err := wl.LoadFromString(monsterWordlist); err != nil {
panic(err)
}
}
func MonsterRun(cookie string) (success bool, err error) {
c := monster.NewCookie(cookie)
if !c.Decode() {
return false, errors.New("could not decode")
}
if _, success := c.Unsign(wl, 100); !success {
return false, errors.New("could not unsign")
}
return true, nil
}
CookieMonster مبني بإلهام من عدة مصادر، ويأتي مع قوائم كلمات Flask-Unsign الممتازة.