.. | ||
cookie-bomb.md | ||
cookie-jar-overflow.md | ||
cookie-tossing.md | ||
README.md |
Cookies Hacking
{% hint style="success" %}
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Überprüfe die Abonnementpläne!
- Tritt der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folge uns auf Twitter 🐦 @hacktricks_live.
- Teile Hacking-Tricks, indem du PRs zu den HackTricks und HackTricks Cloud GitHub-Repos einreichst.
Cookie-Attribute
Cookies verfügen über mehrere Attribute, die ihr Verhalten im Browser des Benutzers steuern. Hier ist eine Übersicht über diese Attribute in einer passiveren Stimme:
Expires und Max-Age
Das Ablaufdatum eines Cookies wird durch das Expires
-Attribut bestimmt. Im Gegensatz dazu definiert das Max-age
-Attribut die Zeit in Sekunden, bis ein Cookie gelöscht wird. Bevorzuge Max-age
, da es modernere Praktiken widerspiegelt.
Domain
Die Hosts, die ein Cookie empfangen sollen, werden durch das Domain
-Attribut festgelegt. Standardmäßig ist dies auf den Host eingestellt, der das Cookie ausgegeben hat, ohne seine Subdomains einzuschließen. Wenn das Domain
-Attribut jedoch ausdrücklich festgelegt wird, umfasst es auch Subdomains. Dies macht die Spezifikation des Domain
-Attributs zu einer weniger restriktiven Option, die nützlich ist, wenn das Teilen von Cookies über Subdomains erforderlich ist. Zum Beispiel macht die Einstellung Domain=mozilla.org
Cookies auf seinen Subdomains wie developer.mozilla.org
zugänglich.
Path
Ein spezifischer URL-Pfad, der in der angeforderten URL vorhanden sein muss, damit der Cookie
-Header gesendet wird, wird durch das Path
-Attribut angezeigt. Dieses Attribut betrachtet das /
-Zeichen als Verzeichnistrenner, was auch Übereinstimmungen in Unterverzeichnissen ermöglicht.
Reihenfolge-Regeln
Wenn zwei Cookies denselben Namen haben, wird dasjenige, das zum Senden ausgewählt wird, basierend auf:
- Dem Cookie, das den längsten Pfad in der angeforderten URL übereinstimmt.
- Dem zuletzt gesetzten Cookie, wenn die Pfade identisch sind.
SameSite
- Das
SameSite
-Attribut bestimmt, ob Cookies bei Anfragen von Drittanbieter-Domains gesendet werden. Es bietet drei Einstellungen: - Strict: Beschränkt das Cookie, um bei Anfragen von Drittanbietern gesendet zu werden.
- Lax: Erlaubt das Senden des Cookies mit GET-Anfragen, die von Drittanbieter-Websites initiiert werden.
- None: Erlaubt das Senden des Cookies von jeder Drittanbieter-Domain.
Denke daran, dass das Verständnis dieser Attribute bei der Konfiguration von Cookies helfen kann, um sicherzustellen, dass sie in verschiedenen Szenarien wie erwartet funktionieren.
Anfragetyp | Beispielcode | Cookies gesendet, wenn |
---|---|---|
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 |
Bild | <img src="..."> | NetSet*, None |
Tabelle von Invicti und leicht modifiziert.
Ein Cookie mit SameSite Attribut wird CSRF-Angriffe mildern, bei denen eine angemeldete Sitzung erforderlich ist.
*Beachte, dass ab Chrome80 (Februar 2019) das Standardverhalten eines Cookies ohne ein Cookie SameSite Attribut lax sein wird (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/).
Beachte, dass temporär, nach Anwendung dieser Änderung, die Cookies ohne eine SameSite Richtlinie in Chrome während der ersten 2 Minuten als None behandelt werden und dann als Lax für Top-Level-Cross-Site-POST-Anfragen.
Cookies-Flags
HttpOnly
Dies verhindert, dass der Client auf das Cookie zugreift (zum Beispiel über Javascript: document.cookie
)
Umgehungen
- Wenn die Seite die Cookies als Antwort auf eine Anfrage sendet (zum Beispiel auf einer PHPinfo-Seite), ist es möglich, XSS auszunutzen, um eine Anfrage an diese Seite zu senden und die Cookies aus der Antwort zu stehlen (siehe ein Beispiel in https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/).
- Dies könnte mit TRACE HTTP-Anfragen umgangen werden, da die Antwort des Servers (wenn diese HTTP-Methode verfügbar ist) die gesendeten Cookies widerspiegelt. Diese Technik wird als Cross-Site Tracking bezeichnet.
- Diese Technik wird von modernen Browsern vermieden, indem sie das Senden einer TRACE-Anfrage von JS nicht zulassen. Einige Umgehungen dafür wurden jedoch in spezifischer Software gefunden, wie das Senden von
\r\nTRACE
anstelle vonTRACE
an IE6.0 SP2. - Eine andere Möglichkeit ist die Ausnutzung von Zero-Day-Sicherheitsanfälligkeiten der Browser.
- Es ist möglich, HttpOnly-Cookies durch einen Cookie-Jar-Overflow-Angriff zu überschreiben:
{% content-ref url="cookie-jar-overflow.md" %} cookie-jar-overflow.md {% endcontent-ref %}
- Es ist möglich, den Cookie Smuggling Angriff zu verwenden, um diese Cookies zu exfiltrieren.
Secure
Die Anfrage sendet das Cookie nur, wenn die Anfrage über einen sicheren Kanal (typischerweise HTTPS) übertragen wird.
Cookies-Präfixe
Cookies, die mit __Secure-
beginnen, müssen zusammen mit dem secure
-Flag von Seiten gesetzt werden, die durch HTTPS gesichert sind.
Für Cookies, die mit __Host-
beginnen, müssen mehrere Bedingungen erfüllt sein:
- Sie müssen mit dem
secure
-Flag gesetzt werden. - Sie müssen von einer durch HTTPS gesicherten Seite stammen.
- Es ist verboten, eine Domain anzugeben, was ihre Übertragung an Subdomains verhindert.
- Der Pfad für diese Cookies muss auf
/
gesetzt werden.
Es ist wichtig zu beachten, dass Cookies, die mit __Host-
beginnen, nicht an Superdomains oder Subdomains gesendet werden dürfen. Diese Einschränkung hilft, Anwendungscookies zu isolieren. Daher kann die Verwendung des __Host-
-Präfixes für alle Anwendungscookies als gute Praxis zur Verbesserung der Sicherheit und Isolation angesehen werden.
Überschreiben von Cookies
Eine der Schutzmaßnahmen von __Host-
-präfixierten Cookies besteht darin, zu verhindern, dass sie von Subdomains überschrieben werden. Dies verhindert beispielsweise Cookie Tossing-Angriffe. In dem Vortrag Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities (Paper) wird präsentiert, dass es möglich war, __HOST- präfixierte Cookies von einer Subdomain zu setzen, indem man den Parser täuschte, zum Beispiel, indem man "=" am Anfang oder am Ende hinzufügte...:
Oder in PHP war es möglich, andere Zeichen am Anfang des Cookie-Namens hinzuzufügen, die durch Unterstriche ersetzt werden sollten, was es ermöglichte, __HOST-
Cookies zu überschreiben:
Cookies-Angriffe
Wenn ein benutzerdefiniertes Cookie sensible Daten enthält, überprüfe es (insbesondere wenn du an einem CTF teilnimmst), da es anfällig sein könnte.
Dekodierung und Manipulation von Cookies
Sensible Daten, die in Cookies eingebettet sind, sollten immer überprüft werden. Cookies, die in Base64 oder ähnlichen Formaten kodiert sind, können oft dekodiert werden. Diese Sicherheitsanfälligkeit ermöglicht es Angreifern, den Inhalt des Cookies zu ändern und sich als andere Benutzer auszugeben, indem sie ihre modifizierten Daten wieder in das Cookie kodieren.
Sitzungsübernahme
Dieser Angriff besteht darin, das Cookie eines Benutzers zu stehlen, um unbefugten Zugriff auf dessen Konto innerhalb einer Anwendung zu erlangen. Durch die Verwendung des gestohlenen Cookies kann ein Angreifer den legitimen Benutzer imitieren.
Sitzungsfixierung
In diesem Szenario bringt ein Angreifer ein Opfer dazu, ein bestimmtes Cookie zum Anmelden zu verwenden. Wenn die Anwendung beim Anmelden kein neues Cookie zuweist, kann der Angreifer, der das ursprüngliche Cookie besitzt, das Opfer imitieren. Diese Technik beruht darauf, dass das Opfer sich mit einem Cookie anmeldet, das vom Angreifer bereitgestellt wurde.
Wenn du ein XSS in einer Subdomain gefunden hast oder eine Subdomain kontrollierst, lies:
{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}
Sitzungsdonation
Hier überzeugt der Angreifer das Opfer, das Sitzungscookie des Angreifers zu verwenden. Das Opfer, das glaubt, in seinem eigenen Konto angemeldet zu sein, wird unbeabsichtigt Aktionen im Kontext des Kontos des Angreifers ausführen.
Wenn du ein XSS in einer Subdomain gefunden hast oder eine Subdomain kontrollierst, lies:
{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}
JWT Cookies
Klicke auf den vorherigen Link, um auf eine Seite zuzugreifen, die mögliche Schwächen in JWT erklärt.
JSON Web Tokens (JWT), die in Cookies verwendet werden, können ebenfalls Sicherheitsanfälligkeiten aufweisen. Für detaillierte Informationen zu potenziellen Schwächen und wie man sie ausnutzen kann, wird empfohlen, das verlinkte Dokument über das Hacken von JWT zu lesen.
Cross-Site Request Forgery (CSRF)
Dieser Angriff zwingt einen angemeldeten Benutzer, unerwünschte Aktionen in einer Webanwendung auszuführen, in der er derzeit authentifiziert ist. Angreifer können Cookies ausnutzen, die automatisch mit jeder Anfrage an die verwundbare Seite gesendet werden.
Leere Cookies
(Weitere Details im originalen Forschungsbericht) Browser erlauben die Erstellung von Cookies ohne Namen, was durch JavaScript wie folgt demonstriert werden kann:
document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
document.cookie = "b=v2"
Das Ergebnis im gesendeten Cookie-Header ist a=v1; test value; b=v2;
. Interessanterweise ermöglicht dies die Manipulation von Cookies, wenn ein Cookie mit leerem Namen gesetzt wird, wodurch möglicherweise andere Cookies kontrolliert werden können, indem das leere Cookie auf einen bestimmten Wert gesetzt wird:
function setCookie(name, value) {
document.cookie = `${name}=${value}`;
}
setCookie("", "a=b"); // Setting the empty cookie modifies another cookie's value
Dies führt dazu, dass der Browser einen Cookie-Header sendet, der von jedem Webserver als ein Cookie mit dem Namen a
und dem Wert b
interpretiert wird.
Chrome-Bug: Unicode-Surrogat-Codepunkt-Problem
In Chrome, wenn ein Unicode-Surrogat-Codepunkt Teil eines gesetzten Cookies ist, wird document.cookie
beschädigt und gibt anschließend einen leeren String zurück:
document.cookie = "\ud800=meep";
Dies führt dazu, dass document.cookie
einen leeren String ausgibt, was auf eine permanente Beschädigung hinweist.
Cookie-Smuggling aufgrund von Parsing-Problemen
(Weitere Details finden Sie in der originalen Forschung) Mehrere Webserver, einschließlich der von Java (Jetty, TomCat, Undertow) und Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), behandeln Cookie-Strings aufgrund veralteter RFC2965-Unterstützung falsch. Sie lesen einen doppelt zitierten Cookie-Wert als einen einzelnen Wert, selbst wenn er Semikolons enthält, die normalerweise Schlüssel-Wert-Paare trennen sollten:
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
Cookie Injection Vulnerabilities
(Check further details in theoriginal research) Die falsche Analyse von Cookies durch Server, insbesondere Undertow, Zope und solche, die Python's http.cookie.SimpleCookie
und http.cookie.BaseCookie
verwenden, schafft Möglichkeiten für Cookie-Injektionsangriffe. Diese Server versäumen es, den Beginn neuer Cookies ordnungsgemäß zu kennzeichnen, was es Angreifern ermöglicht, Cookies zu fälschen:
- Undertow erwartet ein neues Cookie sofort nach einem zitierten Wert ohne Semikolon.
- Zope sucht nach einem Komma, um mit der Analyse des nächsten Cookies zu beginnen.
- Die Cookie-Klassen von Python beginnen die Analyse bei einem Leerzeichen.
Diese Schwachstelle ist besonders gefährlich in Webanwendungen, die auf cookie-basiertem CSRF-Schutz basieren, da sie es Angreifern ermöglicht, gefälschte CSRF-Token-Cookies einzuschleusen, was potenziell Sicherheitsmaßnahmen umgeht. Das Problem wird durch die Handhabung von doppelten Cookie-Namen in Python verschärft, bei der das letzte Vorkommen frühere überschreibt. Es wirft auch Bedenken hinsichtlich __Secure-
und __Host-
Cookies in unsicheren Kontexten auf und könnte zu Autorisierungsumgehungen führen, wenn Cookies an Backend-Server weitergegeben werden, die anfällig für Spoofing sind.
Extra Vulnerable Cookies Checks
Basic checks
- Das Cookie ist jedes Mal, wenn Sie sich einloggen, gleich.
- Melden Sie sich ab und versuchen Sie, dasselbe Cookie zu verwenden.
- Versuchen Sie, sich mit 2 Geräten (oder Browsern) beim selben Konto mit demselben Cookie anzumelden.
- Überprüfen Sie, ob das Cookie Informationen enthält, und versuchen Sie, es zu ändern.
- Versuchen Sie, mehrere Konten mit fast demselben Benutzernamen zu erstellen, und überprüfen Sie, ob Sie Ähnlichkeiten sehen können.
- Überprüfen Sie die Option "remember me", falls vorhanden, um zu sehen, wie sie funktioniert. Wenn sie vorhanden ist und anfällig sein könnte, verwenden Sie immer das Cookie von remember me ohne ein anderes Cookie.
- Überprüfen Sie, ob das vorherige Cookie auch nach einer Passwortänderung funktioniert.
Advanced cookies attacks
Wenn das Cookie beim Einloggen gleich bleibt (oder fast gleich bleibt), bedeutet dies wahrscheinlich, dass das Cookie mit einem Feld Ihres Kontos (wahrscheinlich dem Benutzernamen) verbunden ist. Dann können Sie:
- Versuchen, viele Konten mit sehr ähnlichen Benutzernamen zu erstellen und versuchen zu erraten, wie der Algorithmus funktioniert.
- Versuchen, den Benutzernamen zu bruteforcen. Wenn das Cookie nur als Authentifizierungsmethode für Ihren Benutzernamen gespeichert wird, können Sie ein Konto mit dem Benutzernamen "Bmin" erstellen und jeden einzelnen Bit Ihres Cookies bruteforcen, da eines der Cookies, die Sie versuchen werden, das von "admin" sein wird.
- Versuchen Sie Padding Oracle (Sie können den Inhalt des Cookies entschlüsseln). Verwenden Sie padbuster.
Padding Oracle - Padbuster examples
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 wird mehrere Versuche unternehmen und Sie fragen, welche Bedingung die Fehlerbedingung ist (die, die nicht gültig ist).
Dann beginnt es, das Cookie zu entschlüsseln (es kann mehrere Minuten dauern).
Wenn der Angriff erfolgreich durchgeführt wurde, könnten Sie versuchen, eine Zeichenfolge Ihrer Wahl zu verschlüsseln. Zum Beispiel, wenn Sie encrypt user=administrator verschlüsseln möchten.
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
Diese Ausführung gibt Ihnen das Cookie korrekt verschlüsselt und kodiert mit dem String user=administrator darin.
CBC-MAC
Vielleicht könnte ein Cookie einen Wert haben und mit CBC signiert werden. Dann ist die Integrität des Wertes die Signatur, die durch die Verwendung von CBC mit demselben Wert erstellt wird. Da empfohlen wird, als IV einen Nullvektor zu verwenden, könnte diese Art der Integritätsprüfung anfällig sein.
Der Angriff
- Holen Sie sich die Signatur des Benutzernamens administ = t
- Holen Sie sich die Signatur des Benutzernamens rator\x00\x00\x00 XOR t = t'
- Setzen Sie im Cookie den Wert administrator+t' (t' wird eine gültige Signatur von (rator\x00\x00\x00 XOR t) XOR t = rator\x00\x00\x00 sein)
ECB
Wenn das Cookie mit ECB verschlüsselt ist, könnte es anfällig sein.
Wenn Sie sich anmelden, muss das Cookie, das Sie erhalten, immer dasselbe sein.
Wie man erkennt und angreift:
Erstellen Sie 2 Benutzer mit fast denselben Daten (Benutzername, Passwort, E-Mail usw.) und versuchen Sie, ein Muster im gegebenen Cookie zu entdecken.
Erstellen Sie einen Benutzer mit dem Namen "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" und überprüfen Sie, ob es ein Muster im Cookie gibt (da ECB mit demselben Schlüssel jeden Block verschlüsselt, könnten die gleichen verschlüsselten Bytes erscheinen, wenn der Benutzername verschlüsselt wird).
Es sollte ein Muster (mit der Größe eines verwendeten Blocks) geben. Wenn Sie wissen, wie eine Menge von "a" verschlüsselt ist, können Sie einen Benutzernamen erstellen: "a"*(Größe des Blocks)+"admin". Dann könnten Sie das verschlüsselte Muster eines Blocks von "a" aus dem Cookie löschen. Und Sie haben das Cookie des Benutzernamens "admin".
Referenzen
- https://blog.ankursundara.com/cookie-bugs/
- https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd
{% hint style="success" %}
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.