.. | ||
cookie-bomb.md | ||
cookie-jar-overflow.md | ||
cookie-tossing.md | ||
README.md |
Cookies Hacking
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
Cookie Attributes
Cookies come with several attributes that control their behavior in the user's browser. Here’s a rundown of these attributes in a more passive voice:
Expires and Max-Age
Термін дії cookie визначається атрибутом Expires
. У свою чергу, атрибут Max-age
визначає час у секундах до видалення cookie. Вибирайте Max-age
, оскільки це відображає більш сучасні практики.
Domain
Хости, які отримують cookie, вказуються атрибутом Domain
. За замовчуванням це встановлено на хост, який видав cookie, без урахування його піддоменів. Однак, коли атрибут Domain
явно встановлений, він охоплює також піддомени. Це робить специфікацію атрибута Domain
менш обмежувальним варіантом, корисним для сценаріїв, де необхідно ділитися cookie між піддоменами. Наприклад, встановлення Domain=mozilla.org
робить cookie доступними на його піддоменах, таких як developer.mozilla.org
.
Path
Конкретний URL-адрес, який повинен бути присутнім у запитуваному URL, щоб заголовок Cookie
був надісланий, вказується атрибутом Path
. Цей атрибут розглядає символ /
як роздільник директорій, що дозволяє відповідати підкаталогам.
Ordering Rules
Коли два cookie мають однакову назву, вибір того, який надсилати, базується на:
- Cookie, що відповідає найдовшому шляху в запитуваному URL.
- Найновішому встановленому cookie, якщо шляхи ідентичні.
SameSite
- Атрибут
SameSite
визначає, чи надсилаються cookie на запити, що походять з доменів третіх сторін. Він пропонує три налаштування: - Strict: Обмежує надсилання cookie на запити з третіх сторін.
- Lax: Дозволяє надсилати cookie з GET-запитами, ініційованими веб-сайтами третіх сторін.
- None: Дозволяє надсилати cookie з будь-якого домену третьої сторони.
Пам'ятайте, що при налаштуванні cookie розуміння цих атрибутів може допомогти забезпечити їх правильну поведінку в різних сценаріях.
Request Type | Example Code | Cookies Sent When |
---|---|---|
Link | <a href="..."></a> | NotSet*, Lax, None |
Prerender | <link rel="prerender" href=".."/> | NotSet*, Lax, None |
Form GET | <form method="GET" action="..."> | NotSet*, Lax, None |
Form POST | <form method="POST" action="..."> | NotSet*, None |
iframe | <iframe src="..."></iframe> | NotSet*, None |
AJAX | $.get("...") | NotSet*, None |
Image | <img src="..."> | NetSet*, None |
Table from Invicti and slightly modified.
Cookie з атрибутом SameSite зменшить атаки CSRF, де потрібна активна сесія.
*Зверніть увагу, що з Chrome80 (лютий/2019) стандартна поведінка cookie без атрибута cookie samesite буде lax (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/).
Зверніть увагу, що тимчасово, після застосування цієї зміни, cookie без політики SameSite в Chrome будуть трактуватися як None протягом перших 2 хвилин, а потім як Lax для запиту POST на верхньому рівні з крос-доменом.
Cookies Flags
HttpOnly
Це запобігає клієнту отримувати доступ до cookie (через Javascript, наприклад: document.cookie
)
Bypasses
- Якщо сторінка надсилає cookie у відповідь на запити (наприклад, на сторінці PHPinfo), можна зловживати XSS, щоб надіслати запит на цю сторінку та вкрасти cookie з відповіді (перевірте приклад на https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/.
- Це можна обійти за допомогою TRACE HTTP запитів, оскільки відповідь сервера (якщо цей HTTP-метод доступний) відобразить надіслані cookie. Цю техніку називають Cross-Site Tracking.
- Цю техніку уникають сучасні браузери, не дозволяючи надсилати запит TRACE з JS. Однак деякі обходи цього були знайдені в специфічному програмному забезпеченні, наприклад, надсилаючи
\r\nTRACE
замістьTRACE
до IE6.0 SP2. - Інший спосіб - експлуатація вразливостей нульового дня браузерів.
- Можливо перезаписати cookie HttpOnly, виконуючи атаку переповнення Cookie Jar:
{% content-ref url="cookie-jar-overflow.md" %} cookie-jar-overflow.md {% endcontent-ref %}
- Можливо використовувати Cookie Smuggling атаку для ексфільтрації цих cookie
Secure
Запит надсилатиме cookie лише в HTTP-запиті, якщо запит передається через захищений канал (зазвичай HTTPS).
Cookies Prefixes
Cookie, що починаються з __Secure-
, повинні бути встановлені разом з прапором secure
з сторінок, які захищені HTTPS.
Для cookie, що починаються з __Host-
, повинні бути виконані кілька умов:
- Вони повинні бути встановлені з прапором
secure
. - Вони повинні походити з сторінки, захищеної HTTPS.
- Їм заборонено вказувати домен, що запобігає їх передачі на піддомени.
- Шлях для цих cookie повинен бути встановлений на
/
.
Важливо зазначити, що cookie, що починаються з __Host-
, не можуть бути надіслані на супердомен або піддомен. Це обмеження допомагає ізолювати cookie додатків. Таким чином, використання префікса __Host-
для всіх cookie додатків можна вважати хорошою практикою для підвищення безпеки та ізоляції.
Overwriting cookies
Отже, одне з захистів cookie з префіксом __Host-
- запобігти їх перезапису з піддоменів. Запобігаючи, наприклад, Cookie Tossing attacks. У доповіді Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities (paper) представлено, що було можливо встановити cookie з префіксом __HOST- з піддомену, обманюючи парсер, наприклад, додаючи "=" на початку або на початку та в кінці...:
Або в PHP було можливо додати інші символи на початку назви cookie, які будуть замінені на символи підкреслення, що дозволяє перезаписати cookie __HOST-
:
Cookies Attacks
Якщо кастомний cookie містить чутливі дані, перевірте його (особливо якщо ви берете участь у CTF), оскільки він може бути вразливим.
Decoding and Manipulating Cookies
Чутливі дані, вбудовані в cookie, завжди повинні бути перевірені. Cookie, закодовані в Base64 або подібних форматах, часто можуть бути декодовані. Ця вразливість дозволяє зловмисникам змінювати вміст cookie та видавати себе за інших користувачів, закодовуючи їх змінені дані назад у cookie.
Session Hijacking
Ця атака передбачає крадіжку cookie користувача для отримання несанкціонованого доступу до їх облікового запису в додатку. Використовуючи вкрадену cookie, зловмисник може видавати себе за законного користувача.
Session Fixation
У цьому сценарії зловмисник обманює жертву, щоб вона використовувала конкретну cookie для входу. Якщо додаток не призначає нову cookie під час входу, зловмисник, маючи оригінальну cookie, може видавати себе за жертву. Ця техніка залежить від того, що жертва входить з cookie, наданою зловмисником.
Якщо ви знайшли XSS у піддомені або контролюєте піддомен, прочитайте:
{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}
Session Donation
Тут зловмисник переконує жертву використовувати cookie сесії зловмисника. Жертва, вважаючи, що вона увійшла до свого облікового запису, ненавмисно виконує дії в контексті облікового запису зловмисника.
Якщо ви знайшли XSS у піддомені або контролюєте піддомен, прочитайте:
{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}
JWT Cookies
Натисніть на попереднє посилання, щоб отримати доступ до сторінки, що пояснює можливі недоліки в JWT.
JSON Web Tokens (JWT), що використовуються в cookie, також можуть мати вразливості. Для отримання детальної інформації про потенційні недоліки та способи їх експлуатації рекомендується звернутися до пов'язаного документа про злом JWT.
Cross-Site Request Forgery (CSRF)
Ця атака змушує увійшовшого користувача виконувати небажані дії на веб-додатку, в якому він наразі аутентифікований. Зловмисники можуть використовувати cookie, які автоматично надсилаються з кожним запитом до вразливого сайту.
Empty Cookies
(Перевірте додаткові деталі в оригінальному дослідженні) Браузери дозволяють створювати cookie без імені, що можна продемонструвати через JavaScript наступним чином:
document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
document.cookie = "b=v2"
Результат у заголовку cookie, що надсилається, - a=v1; test value; b=v2;
. Цікаво, що це дозволяє маніпулювати cookie, якщо встановлено cookie з порожнім ім'ям, потенційно контролюючи інші cookie, встановлюючи порожній cookie на конкретне значення:
function setCookie(name, value) {
document.cookie = `${name}=${value}`;
}
setCookie("", "a=b"); // Setting the empty cookie modifies another cookie's value
Це призводить до того, що браузер надсилає заголовок cookie, який кожен веб-сервер інтерпретує як cookie з назвою a
та значенням b
.
Chrome Bug: Проблема з кодовими точками сурогатного Юнікоду
У Chrome, якщо кодова точка сурогатного Юнікоду є частиною встановленого cookie, document.cookie
стає пошкодженим, повертаючи порожній рядок наступним чином:
document.cookie = "\ud800=meep";
Це призводить до того, що document.cookie
виводить порожній рядок, що вказує на постійну корупцію.
Викрадення куків через проблеми з парсингом
(Дивіться деталі в оригінальному дослідженні) Декілька веб-серверів, включаючи ті, що з Java (Jetty, TomCat, Undertow) та Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), неправильно обробляють рядки куків через застарілу підтримку RFC2965. Вони читають значення кука в подвійних лапках як одне значення, навіть якщо воно містить крапки з комою, які зазвичай повинні розділяти пари ключ-значення:
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
Вразливості ін'єкції куків
(Дивіться деталі в оригінальному дослідженні) Неправильний парсинг куків серверами, зокрема Undertow, Zope та тими, що використовують http.cookie.SimpleCookie
і http.cookie.BaseCookie
з Python, створює можливості для атак ін'єкції куків. Ці сервери не можуть правильно обмежити початок нових куків, що дозволяє зловмисникам підробляти куки:
- Undertow очікує новий куки відразу після цитованого значення без крапки з комою.
- Zope шукає кому, щоб почати парсинг наступного куки.
- Клас куків Python починає парсинг з символу пробілу.
Ця вразливість особливо небезпечна в веб-додатках, що покладаються на захист CSRF на основі куків, оскільки дозволяє зловмисникам ін'єктувати підроблені куки CSRF-токенів, потенційно обходячи заходи безпеки. Проблема ускладнюється обробкою Python дублікатів імен куків, де останнє входження перекриває попередні. Це також викликає занепокоєння щодо куків __Secure-
і __Host-
в небезпечних контекстах і може призвести до обходу авторизації, коли куки передаються на сервери, що піддаються підробці.
Додаткові перевірки вразливих куків
Основні перевірки
- Кук є однаковим щоразу, коли ви увійдете.
- Вийдіть з системи та спробуйте використати той самий кук.
- Спробуйте увійти з 2 пристроїв (або браузерів) до одного й того ж облікового запису, використовуючи той самий кук.
- Перевірте, чи містить кук будь-яку інформацію, і спробуйте змінити його.
- Спробуйте створити кілька облікових записів з майже однаковими іменами користувачів і перевірте, чи можете ви побачити подібності.
- Перевірте опцію "запам'ятати мене", якщо вона існує, щоб дізнатися, як вона працює. Якщо вона існує і може бути вразливою, завжди використовуйте кук запам'ятати мене без жодного іншого кука.
- Перевірте, чи працює попередній кук навіть після зміни пароля.
Розширені атаки на куки
Якщо кук залишається тим самим (або майже тим самим) під час входу, це, ймовірно, означає, що кук пов'язаний з якимось полем вашого облікового запису (ймовірно, з ім'ям користувача). Тоді ви можете:
- Спробувати створити багато облікових записів з дуже схожими іменами користувачів і спробувати вгадати, як працює алгоритм.
- Спробуйте брутфорсити ім'я користувача. Якщо кук зберігається лише як метод аутентифікації для вашого імені користувача, тоді ви можете створити обліковий запис з ім'ям користувача "Bmin" і брутфорсити кожен окремий біт вашого кука, оскільки один з куків, які ви спробуєте, буде належати "admin".
- Спробуйте Padding Oracle (ви можете розшифрувати вміст кука). Використовуйте padbuster.
Padding Oracle - приклади Padbuster
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
# When cookies and regular Base64
padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies auth=u7bvLewln6PJPSAbMb5pFfnCHSEd6olf
# If Base64 urlsafe or hex-lowercase or hex-uppercase --encoding parameter is needed, for example:
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2
Padbuster зробить кілька спроб і запитає вас, яка умова є умовою помилки (та, що не є дійсною).
Потім він почне розшифровувати cookie (це може зайняти кілька хвилин)
Якщо атака була успішно виконана, ви можете спробувати зашифрувати рядок на ваш вибір. Наприклад, якщо ви хочете encrypt user=administrator
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
Це виконання надасть вам cookie, правильно зашифрований і закодований зі строкою user=administrator всередині.
CBC-MAC
Можливо, cookie може мати певне значення і може бути підписаний за допомогою CBC. Тоді цілісність значення є підписом, створеним за допомогою CBC з тим же значенням. Оскільки рекомендується використовувати як IV нульовий вектор, цей тип перевірки цілісності може бути вразливим.
Атака
- Отримати підпис імені користувача administ = t
- Отримати підпис імені користувача rator\x00\x00\x00 XOR t = t'
- Встановити в cookie значення administrator+t' (t' буде дійсним підписом (rator\x00\x00\x00 XOR t) XOR t = rator\x00\x00\x00
ECB
Якщо cookie зашифровано за допомогою ECB, він може бути вразливим.
Коли ви входите, cookie, який ви отримуєте, завжди має бути однаковим.
Як виявити та атакувати:
Створіть 2 користувачів з майже однаковими даними (ім'я користувача, пароль, електронна пошта тощо) і спробуйте виявити певний шаблон у даному cookie.
Створіть користувача, наприклад, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" і перевірте, чи є якийсь шаблон у cookie (оскільки ECB шифрує з одним і тим же ключем кожен блок, ті ж зашифровані байти можуть з'явитися, якщо ім'я користувача зашифровано).
Має бути шаблон (з розміром використаного блоку). Отже, знаючи, як зашифровано купу "a", ви можете створити ім'я користувача: "a"*(розмір блоку)+"admin". Тоді ви могли б видалити зашифрований шаблон блоку "a" з cookie. І у вас буде cookie імені користувача "admin".
Посилання
- https://blog.ankursundara.com/cookie-bugs/
- https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
{% hint style="success" %}
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримати HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.