hacktricks/pentesting-web/hacking-with-cookies/README.md

297 lines
24 KiB
Markdown
Raw Normal View History

2023-07-07 23:42:27 +00:00
# クッキーのハッキング
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
* **サイバーセキュリティ企業で働いていますか?** **HackTricksで会社を宣伝** したいですか?または、**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード** したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
2023-07-07 23:42:27 +00:00
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**テレグラムグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
脆弱性を見つけて修正を迅速化しましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。[**無料でお試しください**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
2023-07-07 23:42:27 +00:00
## クッキーの属性
### Expires & Max-Age
2023-07-07 23:42:27 +00:00
* `Expires`は、クッキーが削除される有効期限を設定します。
* `Max-age`は、クッキーが削除されるまでの時間を秒単位で設定しますこれを使用してください、もはや2009年ではありません
### **Domain**
`Domain`属性は、**どのホストがクッキーを受け取ることができるか**を指定します。指定されていない場合、属性はクッキーを設定した**同じホスト**に**デフォルトで設定**されますが、**サブドメインは除外されます**。**`Domain`が指定されている場合、常にサブドメインが含まれます**。したがって、`Domain`を指定することは省略するよりも制限が少なくなります。ただし、サブドメインがユーザーに関する情報を共有する必要がある場合に役立ちます。
2023-07-07 23:42:27 +00:00
たとえば、`Domain=mozilla.org`と設定した場合、クッキーは`developer.mozilla.org`などのサブドメインで利用できます。しかし、指定しない場合、クッキーはサブドメインに送信されません。
**サブドメイン** `sub.example.com` **が** _domain_ **属性を持つクッキー**を設定した場合、**親ドメインへのリクエストで送信**されます。
### **Path**
`Path`属性は、`Cookie`ヘッダーを送信するためにリクエストされたURLに存在する必要がある**URLパス**を示します。`%x2F`"/")文字はディレクトリセパレータと見なされ、サブディレクトリも一致します。
2023-07-07 23:42:27 +00:00
#### 順序
2023-07-07 23:42:27 +00:00
同じ名前の2つのクッキーがある場合、送信されるのは次のものです。
2023-07-07 23:42:27 +00:00
* URLパスに一致する**最も長いパス**を持つもの
* 両方のパスが同じ場合は**最新のもの**
### SameSite
2023-07-07 23:42:27 +00:00
これにより、ブラウザに**クッキーが他のドメインから送信できるかどうか**を示します。3つの可能な値があります。
* **Strict**:クッキーはサードパーティのウェブサイトによるリクエストと共に送信されません。
* **Lax**クッキーはサードパーティのウェブサイトによって開始されたGETリクエストと共に送信されます。
2023-07-07 23:42:27 +00:00
* **None**:クッキーは任意のサードパーティドメインから送信されます。
| **リクエストタイプ** | **例のコード** | **クッキーが送信される場合** |
| ---------------- | ---------------------------------- | --------------------- |
| リンク | \<a href="...">\</a> | NotSet\*, Lax, None |
| プリレンダリング | \<link rel="prerender" href=".."/> | NotSet\*, Lax, None |
| フォームGET | \<form method="GET" action="..."> | NotSet\*, Lax, None |
| フォームPOST | \<form method="POST" action="..."> | NotSet\*, None |
| iframe | \<iframe src="...">\</iframe> | NotSet\*, None |
| AJAX | $.get("...") | NotSet\*, None |
| 画像 | \<img src="..."> | NetSet\*, None |
2023-07-07 23:42:27 +00:00
[Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/)からの表を若干修正しました。\
_SameSite_属性を持つクッキーは、ログインセッションが必要なCSRF攻撃を緩和します。
**\*注意Chrome802019年2月以降、SameSite属性のないクッキーのデフォルト動作はlaxになります** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/))。\
2023-07-07 23:42:27 +00:00
一時的に、この変更を適用した後、Chromeの**SameSiteポリシーのないクッキーは最初の2分間はNone**として扱われ、その後はトップレベルのクロスサイトPOSTリクエストではLaxとして扱われます。
## Cookieフラグ
### HttpOnly
これにより、**クライアント**がクッキーにアクセスできなくなります(例えば、**Javascript**経由での`document.cookie`など)。
#### **バイパス方法**
* ページがリクエストの応答としてクッキーを送信している場合(例えば、**PHPinfo**ページなど、XSSを悪用してこのページにリクエストを送信し、応答からクッキーを**盗む**ことができます([https://hackcommander.github.io/pentesting-article-1/](https://hackcommander.github.io/pentesting-article-1/)で例を確認してください)。
* サーバーからの応答として、**TRACE** **HTTP**リクエストをバイパスすることができますこのHTTPメソッドが利用可能な場合。この技術は**クロスサイトトラッキング**と呼ばれます。
* この技術は、**モダンブラウザではTRACEリクエストをJSから送信できない**ようにすることで回避されます。ただし、IE6.0 SP2に対して`TRACE`ではなく`\r\nTRACE`を送信するなど、特定のソフトウェアでこれを回避する方法が見つかっています。
2023-07-07 23:42:27 +00:00
* 別の方法は、ブラウザのゼロデイ脆弱性を悪用することです。
* **HttpOnlyクッキーを上書き**することができます。Cookie Jarオーバーフローアタックを実行することで
{% content-ref url="cookie-jar-overflow.md" %}
[cookie-jar-overflow.md](cookie-jar-overflow.md)
{% endcontent-ref %}
* [**Cookie Smuggling**](./#cookie-smuggling)攻撃を使用してこれらのクッキーを外部に流出させることができます。
### Secure
リクエストは、通常**HTTPS**を介して送信される場合にのみクッキーを送信します。
2023-07-07 23:42:27 +00:00
## クッキーの接頭辞
**`__Secure-`接頭辞**セキュアなページHTTPSから`secure`フラグと共に設定する必要があります。
**`__Host-`接頭辞**セキュアなページHTTPSから`secure`フラグと共に設定する必要があり、ドメインが指定されていない(したがって、サブドメインに送信されない)必要があり、パスは`/`である必要があります。
`__Host-`接頭辞のクッキーは、スーパードメイン(サブドメインからドメインへのクッキー)またはサブドメイン(ドメインからサブドメインへのクッキー)に送信することはできないため、アプリケーションのクッキーを分離したい場合は、すべてを`__Host-`で接頭辞付けすることは悪い考えではありません。
2023-07-07 23:42:27 +00:00
## クッキー攻撃
2023-07-07 23:42:27 +00:00
もし、セッションID、ユーザー名、メールアドレスなどの機密データを含むカスタムクッキーを見つけた場合、それを悪用することを試みるべきです。
2023-07-07 23:42:27 +00:00
### クッキーのデコード
クッキーがベースエンコーディングBase64などなどを使用している場合、それを**デコード**し、**内容を変更**し、任意のユーザーを**なりすます**ことができるかもしれません。
2023-07-07 23:42:27 +00:00
### セッションハイジャック
2023-07-07 23:42:27 +00:00
クッキーを盗み、それを使用してアプリケーション内のユーザーをなりすます。
2023-07-07 23:42:27 +00:00
### セッションフィクセーション
攻撃者はウェブページからクッキーを取得し、被害者に対して同じクッキーを使用して**ログインするようにリンクを送信**します。ユーザーがログイン時にクッキーが変更されない場合、これは有用です。攻撃者はクッキーを介してユーザーをなりすますことができます。
2021-10-19 00:01:07 +00:00
もし、サブドメインで**XSSを見つけた**か、サブドメインを**制御している**場合は、次を参照してください:
2021-10-19 00:01:07 +00:00
{% content-ref url="cookie-tossing.md" %}
[cookie-tossing.md](cookie-tossing.md)
{% endcontent-ref %}
2023-07-07 23:42:27 +00:00
### セッション寄付
攻撃者は自分のセッションを被害者に送信します。被害者は自分がすでにログインしていると見なし、自分のアカウント内にいると思うでしょうが、**実際には攻撃者のアカウント内で操作が行われます**。
2021-10-19 00:01:07 +00:00
もし、サブドメインで**XSSを見つけた**か、サブドメインを**制御している**場合は、次を参照してください:
2021-10-19 00:01:07 +00:00
{% content-ref url="cookie-tossing.md" %}
[cookie-tossing.md](cookie-tossing.md)
{% endcontent-ref %}
2022-07-03 20:56:45 +00:00
### [JWT Cookie](../hacking-jwt-json-web-tokens.md)
2023-07-07 23:42:27 +00:00
前のリンクをクリックして、JWTの可能な欠陥について説明したページにアクセスしてください。
2023-07-07 23:42:27 +00:00
### 空のクッキー
2023-07-07 23:42:27 +00:00
ブラウザは、名前が空のクッキーを許可します。
```js
document.cookie = "a=v1"
document.cookie = "=test value;" // empty name
document.cookie = "b=v2"
```
2023-07-07 23:42:27 +00:00
これにより、送信されるCookieヘッダーは次のようになります
```
a=v1; test value; b=v2;
```
興味深いことに、もし何らかの方法で**空のクッキーを設定することができるベクトル**がある場合、**他のどのクッキーでも制御することができます**。
```js
function setCookie(name, value) {
2023-07-07 23:42:27 +00:00
document.cookie = `${name}=${value}`;
}
setCookie("", "a=b"); // this sets the empty cookie to a=b
```
ブラウザ内部では、これは空の名前付きクッキーとして設定されていますが、**送信されるクッキーヘッダー**に結果が表示されます:
```
a=b;
```
2023-07-07 23:42:27 +00:00
意味するところは、すべてのWebサーバーは、cookie `a`が値`b`に設定されたものとして解析します。
2023-07-07 23:42:27 +00:00
### Chromeのバグ - document.cookieの破損 <a href="#chrome-bugdocumentcookie-corruption" id="chrome-bugdocumentcookie-corruption"></a>
もしセットされたcookieにUnicodeサロゲートコードポイントが含まれている場合、`document.cookie`は永久に破損し、空の文字列を返します。
```js
document.cookie
// "a=b;"
document.cookie = "\ud800=meep";
document.cookie
// ""
```
2023-07-07 23:42:27 +00:00
### クッキーのスマグリング
JavaのウェブサーバーであるJetty、TomCat、Undertow、およびPythonのウェブフレームワークであるZope、さらにはcherrypy、web.py、aiohttp server、bottle、およびwebobなどのPythonウェブサーバー/フレームワークを含むいくつかのウェブサーバーは、RFC2965のサポートが残っているため、クッキー文字列を**正しく解析しない**ことがわかっています。RFC2965は、クォートされた文字列の定義にRFC2616を使用する古いクッキーの引用メカニズムです。
具体的には、**これらのサーバーは、ダブルクォートdquotedのクッキー値に遭遇した場合でも、セミコロンが出現するまでクッキー文字列の読み取りを続けます**。これは問題です、なぜなら**セミコロンはクッキー文字列内のキーと値のペアを区切るために使用されるべきだからです**。
2023-07-07 23:42:27 +00:00
例えば、**ブラウザがRENDER\_TEXT、JSESSIONID、およびASDFの3つのクッキーを送信した場合**、
```basic
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
```
2023-07-07 23:42:27 +00:00
これらのサーバーは、それらを**単一のクッキー値**の一部として解釈します。3つの個別のクッキーではなく。
2023-07-07 23:42:27 +00:00
これにより、セキュリティリスクが発生します。攻撃者がクロスサイトスクリプティングXSSアクセスを取得した場合、このバグを使用してHttpOnlyクッキーなどの**機密クッキーを外部に漏洩**することができます。
2023-07-07 23:42:27 +00:00
### クッキーインジェクション
JavaのUndertow、PythonのZope、およびPythonの標準ライブラリhttp.cookie.SimpleCookieおよびhttp.cookie.BaseCookieを使用している多くのWebサーバーは、**クッキーを誤って解析し、次のクッキー名/値ペアを開始するための間違った区切り文字を使用**していることが判明しています。これにより、攻撃者は**1つのクッキー値のみを制御しながら複数のクッキーを偽装**することができます。
2023-07-07 23:42:27 +00:00
**Undertow**の場合、セミコロンを待たずに、**引用符で囲まれた**クッキー値の終わりの直後に次のクッキーの解析を開始します。
```bash
LANGUAGE="en-us" CSRF_TOKEN="SPOOFED_VALUE"
```
2023-07-07 23:42:27 +00:00
**Zope**は、次のクッキーを**カンマ**で解析し始めます。
```bash
LANGUAGE=en-us,CSRF_TOKEN=SPOOFED_VALUE
```
2023-07-07 23:42:27 +00:00
そして、**PythonのSimpleCookie**と**BaseCookie**は、次のクッキーを**スペース**文字で解析し始めます:
```
LANGUAGE=en-us CSRF_TOKEN=SPOOFED_VALUE
```
2023-07-07 23:42:27 +00:00
結果として、**cherrypy**、**web.py**、**aiohttp**サーバー、**bottle**、および**webob**Pyramid、TurboGearsなどのサーバーは、このタイプの攻撃に対して脆弱です。
2023-07-07 23:42:27 +00:00
この問題には重大な**セキュリティ上の影響**があります。たとえば、Webアプリケーションが**クッキーベースのCSRF保護**を使用している場合、攻撃者は偽の**CSRFトークンクッキー**を注入してこの保護をバイパスすることができます。さらに、Pythonのhttp.cookieパッケージの最後の重複するクッキー名は、以前のクッキーを上書きするため、このタイプの攻撃は特に容易です。
2023-07-07 23:42:27 +00:00
さらに、**`__Secure-`**および**`__Host-`**クッキーのスプーフィングは、安全でないコンテキストで悪用される可能性があります。また、クッキーがバックエンドサーバーに渡される構成では、クッキーの注入により、バックエンドサーバーがスプーフィングに対して脆弱であるがフロントエンドサーバーが脆弱でない場合、認可バイパスが発生する可能性があります。
2023-07-07 23:42:27 +00:00
### 追加の脆弱なクッキーチェック
2023-07-07 23:42:27 +00:00
#### **基本的なチェック**
2023-07-07 23:42:27 +00:00
* **クッキー**は、**ログイン**するたびに**同じ**です。
* ログアウトして同じクッキーを使用してみてください。
* 同じクッキーを使用して、2つのデバイスまたはブラウザで同じアカウントにログインしようとしてみてください。
* クッキーに情報が含まれているかどうかを確認し、それを変更してみてください。
* ほぼ同じユーザー名で複数のアカウントを作成し、類似点が見えるかどうかを確認してください。
* 存在する場合、"**remember me**"オプションをチェックして動作を確認してください。脆弱性がある場合は、常に**remember me**のクッキーのみを使用してください。
2023-07-07 23:42:27 +00:00
* パスワードを変更した後でも、以前のクッキーが機能するかどうかを確認してください。
2023-07-07 23:42:27 +00:00
#### **高度なクッキー攻撃**
2023-07-07 23:42:27 +00:00
クッキーがログイン時に変わらない(またはほぼ変わらない)場合、おそらくクッキーはアカウントのいくつかのフィールド(おそらくユーザー名)に関連しています。その場合、次のことができます:
* 非常に**類似した**ユーザー名で多くの**アカウント**を作成し、アルゴリズムがどのように機能しているかを推測してみてください。
* **ユーザー名をブルートフォース**してみてください。クッキーがユーザー名の認証方法として保存される場合、ユーザー名が「**Bmin**」のアカウントを作成し、クッキーの各ビットをブルートフォースしてみてください。試すクッキーの1つは「**admin**」に属するクッキーです。
2023-07-07 23:42:27 +00:00
* **Padding Oracle**を試してみてください(クッキーの内容を復号化できます)。**padbuster**を使用してください。
2023-07-07 23:42:27 +00:00
**Padding Oracle - Padbusterの例**
```bash
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
```
2023-07-07 23:42:27 +00:00
Padbusterは複数の試行を行い、どの条件がエラー条件無効な条件であるかを尋ねます。
2023-07-07 23:42:27 +00:00
その後、クッキーの復号化を開始します(数分かかる場合があります)。
2023-07-07 23:42:27 +00:00
攻撃が成功した場合、任意の文字列を暗号化することができます。たとえば、**user=administrator**を**暗号化**したい場合は、次のようにしてください。
```
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
```
この実行では、文字列**user=administrator**が内部に正しく暗号化およびエンコードされたクッキーが取得されます。
**CBC-MAC**
2023-07-07 23:42:27 +00:00
クッキーには値が含まれ、CBCを使用して署名される可能性があります。その場合、値の整合性は、同じ値を使用してCBCを使用して作成された署名です。IVとしてヌルベクトルを使用することが推奨されているため、このタイプの整合性チェックは脆弱性を持つ可能性があります。
2023-07-07 23:42:27 +00:00
**攻撃**
2023-07-07 23:42:27 +00:00
1. ユーザー名**administ**の署名を取得する= **t**
2. ユーザー名**rator\x00\x00\x00 XOR t**の署名を取得する= **t'**
3. クッキーに値**administrator+t'**を設定する(**t'**は**rator\x00\x00\x00 XOR tXOR t**の有効な署名になります= **rator\x00\x00\x00**
**ECB**
2023-07-07 23:42:27 +00:00
クッキーがECBを使用して暗号化されている場合、脆弱性がある可能性があります。\
ログインするときに受け取るクッキーは常に同じでなければなりません。
**検出と攻撃方法:**
ほぼ同じデータユーザー名、パスワード、メールなどを持つ2つのユーザーを作成し、与えられたクッキーの中にパターンがあるかどうかを確認してください。
2023-07-07 23:42:27 +00:00
例えば「aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa」という名前のユーザーを作成し、クッキーにパターンがあるかどうかを確認しますECBは同じキーでブロックごとに暗号化するため、ユーザー名が暗号化されると同じ暗号化されたバイトが表示される可能性があります
パターンがあるはずです使用されているブロックのサイズで。したがって、「a」の暗号化されたパターンを削除することで、ユーザー名「admin」のクッキーを取得できます。
2023-07-07 23:42:27 +00:00
## 参考文献
* [https://blog.ankursundara.com/cookie-bugs/](https://blog.ankursundara.com/cookie-bugs/)
2022-04-28 16:01:33 +00:00
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
最も重要な脆弱性を見つけて修正できるようになります。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステムまで、技術スタック全体で問題を見つけます。[**無料でお試しください**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
* **サイバーセキュリティ企業**で働いていますか? HackTricksであなたの会社を宣伝したいですかまたは、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたりしたいですか[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
2023-07-07 23:42:27 +00:00
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう、私たちの独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクション
* [**公式のPEASSHackTricks swag**](https://peass.creator-spring.com)を手に入れましょう
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**を**フォロー**してください。
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
2022-04-28 16:01:33 +00:00
</details>