diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index abe382dcf..be4d4275a 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -837,9 +837,14 @@
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
-- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
-- [iOS Exploiting](binary-exploitation/ios-exploiting.md)
+- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
+ - [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md)
+ - [ios CVE-2021-30807-IOMobileFrameBuffer](binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md)
+ - [ios Corellium](binary-exploitation/ios-exploiting/ios-corellium.md)
+ - [ios Heap Exploitation](binary-exploitation/ios-exploiting/ios-example-heap-exploit.md)
+ - [ios Physical UAF - IOSurface](binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md)
+
# ð€ AI
- [AI Security](AI/README.md)
diff --git a/src/pentesting-web/race-condition.md b/src/pentesting-web/race-condition.md
index 0304963f4..998251cbb 100644
--- a/src/pentesting-web/race-condition.md
+++ b/src/pentesting-web/race-condition.md
@@ -1,58 +1,58 @@
-# ã¬ãŒã¹ã³ã³ãã£ã·ã§ã³
+# Race Condition
{{#include ../banners/hacktricks-training.md}}
> [!WARNING]
-> ãã®æè¡ãæ·±ãçè§£ããããã«ã¯ã[https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)ã®å
ã®ã¬ããŒãã確èªããŠãã ããã
+> ãã®ææ³ãæ·±ãçè§£ããã«ã¯ãå
ã®ã¬ããŒãã[https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)ã§ç¢ºèªããŠãã ãã
-## ã¬ãŒã¹ã³ã³ãã£ã·ã§ã³æ»æã®åŒ·å
+## Race Condition æ»æã®åŒ·å
-ã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ãå©çšããéã®äž»ãªé害ã¯ã**åŠçæéã«ã»ãšãã©å·®ããªãç¶æ
ã§ãè€æ°ã®ãªã¯ãšã¹ããåæã«åŠçãããããšã確å®ã«ããããšâçæ³çã«ã¯1msæªæº**ã§ãã
+race condition ãå©çšããéã®äž»ãªé害ã¯ãè€æ°ã®ãªã¯ãšã¹ããã»ãŒåæã«åŠçãããããã«ããããšã§ãåŠçæéã®å·®ã**éåžžã«å°ããããš â çæ³çã«ã¯1msæªæº**ã§ããããšãä¿èšŒããç¹ã§ãã
-ããã§ã¯ããªã¯ãšã¹ããåæãããããã®ããã€ãã®æè¡ã玹ä»ããŸãã
+ããã§ã¯ãªã¯ãšã¹ããåæãããããã®ããã€ãã®ææ³ã玹ä»ããŸã:
-#### HTTP/2 ã·ã³ã°ã«ãã±ããæ»æ vs. HTTP/1.1 ã©ã¹ããã€ãåæ
+#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
-- **HTTP/2**: åäžã®TCPæ¥ç¶ã§2ã€ã®ãªã¯ãšã¹ããéä¿¡ããããšããµããŒããããããã¯ãŒã¯ã®ãžãã¿ãŒã®åœ±é¿ã軜æžããŸãããã ãããµãŒããŒåŽã®å€åã«ããã2ã€ã®ãªã¯ãšã¹ãã§ã¯äžè²«ããã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ã®æªçšã«ã¯äžååãªå ŽåããããŸãã
-- **HTTP/1.1 'ã©ã¹ããã€ãåæ'**: 20-30ã®ãªã¯ãšã¹ãã®ã»ãšãã©ã®éšåãäºåã«éä¿¡ããå°ããªæçãä¿æããŠäžç·ã«éä¿¡ããããšã§ããµãŒããŒãžã®åæå°çãå®çŸããŸãã
+- **HTTP/2**: åäžã®TCPæ¥ç¶äžã§2ã€ã®ãªã¯ãšã¹ããéãããšãã§ãããããã¯ãŒã¯ã®ãžãã¿ã®åœ±é¿ãäœæžããŸãããã ãããµãŒããŒåŽã®å·®ç°ã«ãããåžžã«race conditionãåçŸããã«ã¯2ã€ã®ãªã¯ãšã¹ãã ãã§ã¯äžååãªããšããããŸãã
+- **HTTP/1.1 'Last-Byte Sync'**: 20ã30ã®ãªã¯ãšã¹ãã®ã»ãšãã©ã®éšåãäºåéä¿¡ããå°ããªæçã ããä¿çã«ããŠãããããããåæã«éä¿¡ããããšã§ããµãŒããŒåŽã§åæå°çãå®çŸããŸãã
-**ã©ã¹ããã€ãåæã®æºå**ã«ã¯ä»¥äžãå«ãŸããŸãïŒ
+**Preparation for Last-Byte Sync** involves:
-1. ã¹ããªãŒã ãçµäºããã«æçµãã€ããé€ããããããŒãšããã£ããŒã¿ãéä¿¡ããŸãã
-2. ååéä¿¡åŸã«100msåŸ
æ©ããŸãã
-3. TCP_NODELAYãç¡å¹ã«ããŠãNagleã®ã¢ã«ãŽãªãºã ãå©çšããŠæçµãã¬ãŒã ããããåŠçããŸãã
-4. æ¥ç¶ãæž©ããããã«ãã³ã°ãéä¿¡ããŸãã
+1. ããããšæ¬æããŒã¿ããæåŸã®ãã€ããé€ããéšåãéä¿¡ããã¹ããªãŒã ãçµäºããªãã
+2. ååéä¿¡åŸã«100msåŸ
æ©ããã
+3. æçµãã¬ãŒã ã®ãããåã®ããã« TCP_NODELAY ãç¡å¹ã«ã㊠Nagle's algorithm ãå©çšããã
+4. æ¥ç¶ããŠã©ãŒã ã¢ããããããã« ping ãéãã
-ãã®åŸãä¿æããããã¬ãŒã ãéä¿¡ãããšãWiresharkã§ç¢ºèªã§ããããã«ãåäžã®ãã±ããã§å°çããã¯ãã§ãããã®æ¹æ³ã¯ãéåžžRCæ»æã«é¢äžããªãéçãã¡ã€ã«ã«ã¯é©çšãããŸããã
+ä¿çããŠãããã¬ãŒã ããã®åŸéä¿¡ãããšãããããåäžãã±ããã§å°çããã¯ãã§ãWireshark ã§ç¢ºèªã§ããŸãããã®ææ³ã¯éåžž RC æ»æã«é¢äžããªã static files ã«ã¯é©çšã§ããŸããã
### ãµãŒããŒã¢ãŒããã¯ãã£ãžã®é©å¿
-ã¿ãŒã²ããã®ã¢ãŒããã¯ãã£ãçè§£ããããšã¯éèŠã§ããããã³ããšã³ããµãŒããŒã¯ãªã¯ãšã¹ããç°ãªãæ¹æ³ã§ã«ãŒãã£ã³ã°ããå¯èœæ§ããããã¿ã€ãã³ã°ã«åœ±é¿ãäžããŸããç¡é¢ä¿ãªãªã¯ãšã¹ããéããŠãµãŒããŒåŽã®æ¥ç¶ãäºåã«æž©ããããšã§ããªã¯ãšã¹ãã®ã¿ã€ãã³ã°ãæ£åžžåããããšãã§ããŸãã
+ã¿ãŒã²ããã®ã¢ãŒããã¯ãã£ãçè§£ããããšãéèŠã§ããFront-end servers ã¯ãªã¯ãšã¹ããç°ãªãçµè·¯ã§ã«ãŒãã£ã³ã°ããå¯èœæ§ããããã¿ã€ãã³ã°ã«åœ±é¿ãäžããŸããæå³ã®ãªããªã¯ãšã¹ãã§ãµãŒããŒåŽã®æ¥ç¶ãäºåã«ãŠã©ãŒã ã¢ããããŠããããšã§ããªã¯ãšã¹ãã®ã¿ã€ãã³ã°ãåäžåãããå ŽåããããŸãã
-#### ã»ãã·ã§ã³ããŒã¹ã®ããã¯ã®åŠç
+#### Session-Based Locking ã®æ±ã
-PHPã®ã»ãã·ã§ã³ãã³ãã©ãŒã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯ãã»ãã·ã§ã³ããšã«ãªã¯ãšã¹ããã·ãªã¢ã©ã€ãºããè匱æ§ãé ãå¯èœæ§ããããŸããåãªã¯ãšã¹ãã«ç°ãªãã»ãã·ã§ã³ããŒã¯ã³ã䜿çšããããšã§ããã®åé¡ãåé¿ã§ããŸãã
+PHP ã® session handler ã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯ãã»ãã·ã§ã³åäœã§ãªã¯ãšã¹ããã·ãªã¢ã©ã€ãºãããããè匱æ§ãé ããããšããããŸããåãªã¯ãšã¹ãã§ç°ãªã session tokens ã䜿ãããšã§ãã®åé¡ãåé¿ã§ããŸãã
-#### ã¬ãŒããŸãã¯ãªãœãŒã¹å¶éã®å
æ
+#### ã¬ãŒãããªãœãŒã¹å¶éã®å
æ
-æ¥ç¶ã®æž©ãã广çã§ãªãå ŽåããããŒãªã¯ãšã¹ãã®æŽªæ°ŽãéããŠãŠã§ããµãŒããŒã®ã¬ãŒããŸãã¯ãªãœãŒã¹å¶éã®é
å»¶ãæå³çã«åŒãèµ·ããããšã§ãã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ã«é©ãããµãŒããŒåŽã®é
å»¶ãèªçºããã·ã³ã°ã«ãã±ããæ»æãä¿é²ããããšãã§ããŸãã
+æ¥ç¶ã®ãŠã©ãŒã ã¢ããã广ãçºæ®ããªãå ŽåããããŒãªã¯ãšã¹ãã倧éã«éã£ãŠ web servers ã®ã¬ãŒãããªãœãŒã¹å¶éã«ããé
å»¶ãæå³çã«èªçºãããããšã§ãsingle-packet attack ãå®è¡ãããããµãŒããŒåŽã®é
å»¶ãçã¿åºããå ŽåããããŸãã
-## æ»æã®äŸ
+## Attack Examples
-- **Tubo Intruder - HTTP2 ã·ã³ã°ã«ãã±ããæ»æ (1ãšã³ããã€ã³ã)**: **Turbo intruder**ã«ãªã¯ãšã¹ããéä¿¡ã§ããŸãïŒ`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`ïŒããªã¯ãšã¹ãå
ã§**`%s`**ã®å€ããã«ãŒããã©ãŒã¹ãããå€ã«å€æŽã§ããŸããäŸãã°ã`csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`ã®ããã«ããããŠãããããããŠã³ãã**`examples/race-single-packer-attack.py`**ãéžæããŸãïŒ
+- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: You can send the request to **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), you can change in the request the value you want to brute force for **`%s`** like in `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` and then select the **`examples/race-single-packer-attack.py`** from the drop down:
-ç°ãªãå€ã**éä¿¡ãã**å Žåã¯ãã¯ãªããããŒãããã®ã¯ãŒããªã¹ãã䜿çšãããã®ã³ãŒãã§å€æŽã§ããŸãïŒ
+If you are going to **send different values**, you could modify the code with this one that uses a wordlist from the clipboard:
```python
passwords = wordlists.clipboard
for password in passwords:
engine.queue(target.req, password, gate='race1')
```
> [!WARNING]
-> ãŠã§ããHTTP2ããµããŒãããŠããªãå ŽåïŒHTTP1.1ã®ã¿ïŒã`Engine.THREADED`ãŸãã¯`Engine.BURP`ã䜿çšããŠãã ããã`Engine.BURP2`ã®ä»£ããã«ã
+> ãŠã§ãã HTTP2 ããµããŒãããŠãããïŒHTTP1.1 ã®ã¿ïŒå Žåã¯ã`Engine.BURP2` ã®ä»£ããã« `Engine.THREADED` ãŸã㯠`Engine.BURP` ã䜿çšããŠãã ããã
-- **Tubo Intruder - HTTP2ã·ã³ã°ã«ãã±ããæ»æïŒè€æ°ã®ãšã³ããã€ã³ãïŒ**: 1ã€ã®ãšã³ããã€ã³ãã«ãªã¯ãšã¹ããéä¿¡ãããã®åŸä»ã®ãšã³ããã€ã³ãã«è€æ°ã®ãªã¯ãšã¹ããéä¿¡ããŠRCEãããªã¬ãŒããå¿
èŠãããå Žåã`race-single-packet-attack.py`ã¹ã¯ãªãããæ¬¡ã®ããã«å€æŽã§ããŸã:
+- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: 1 endpoint ã«ãªã¯ãšã¹ããéãããã®åŸä»ã®è€æ°ã® endpoint ã«ãªã¯ãšã¹ããéã£ãŠ RCE ãããªã¬ãŒããå¿
èŠãããå Žåã`race-single-packet-attack.py` ã¹ã¯ãªãããæ¬¡ã®ããã«å€æŽã§ããŸã:
```python
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
@@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt)
# send all the queued requests for this attempt
engine.openGate(currentAttempt)
```
-- **Repeater**ã§ããBurp Suiteã®æ°ããã**Send group in parallel**ããªãã·ã§ã³ã䜿çšã§ããŸãã
-- **limit-overrun**ã®å Žåãã°ã«ãŒãã«**åããªã¯ãšã¹ãã50å**远å ããã ãã§æžã¿ãŸãã
-- **connection warming**ã®ããã«ã**ã°ã«ãŒã**ã®**æå**ã«ãŠã§ããµãŒããŒã®ééçéšåãžã®**ãªã¯ãšã¹ã**ã**远å **ããããšãã§ããŸãã
-- **delaying**ããã»ã¹ã®ããã«ã**1ã€ã®ãªã¯ãšã¹ããšå¥ã®ãªã¯ãšã¹ãã®é**ã«**远å ã®ãªã¯ãšã¹ããæ¿å
¥**ããããšãã§ããŸãã
-- **multi-endpoint** RCã®å Žåã**é ããç¶æ
**ã«éä¿¡ããã**ãªã¯ãšã¹ã**ãæåã«éä¿¡ãããã®åŸã«**é ããç¶æ
ãæªçšãã50ã®ãªã¯ãšã¹ã**ãéä¿¡ããããšãã§ããŸãã
+- **Repeater** ã§ããBurp Suite ã®æ°ãã '**Send group in parallel**' ãªãã·ã§ã³ããå©çšã§ããŸãã
+- **limit-overrun** ã®å Žåãã°ã«ãŒãã« **same request 50 times** ã远å ããã ãã§ããã§ãã
+- **connection warming** ã®å Žåã**group** ã® **beginning** ã«ãŠã§ããµãŒããŒã®ééçãªéšåãžåãã **requests** ãããã€ã **add** ããããšãã§ããŸãã
+- 2 ãµãã¹ããŒãã®ã¹ãããã§ããã **request** ã®åŠçãšæ¬¡ã® **request** ã®åŠçã® **between** ã«åŠçã **delaying** ãããå Žåã¯ãäž¡æ¹ã® **requests** ã®éã«è¿œå ã® **requests** ã **add extra requests between** ããŠãã ããã
+- **multi-endpoint** RC ã®å ŽåããŸã **goes to the hidden state** ãã **request** ãéãããã®çŽåŸã« **exploits the hidden state** ãã **50 requests** ãç¶ããŠéä¿¡ã§ããŸãã
-- **Automated python script**: ãã®ã¹ã¯ãªããã®ç®çã¯ããŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ã倿Žããæ°ããã¡ãŒã«ã®æ€èšŒããŒã¯ã³ãæåŸã®ã¡ãŒã«ã«å±ããŸã§ç¶ç¶çã«ç¢ºèªããããšã§ãïŒããã¯ãã³ãŒãå
ã§ã¡ãŒã«ã倿Žã§ããRCãèŠãããããã§ãæ€èšŒãå€ãã¡ãŒã«ã«éä¿¡ãããå¯èœæ§ããã£ãããã§ããæåã®ã¡ãŒã«ã§å€æ°ããã§ã«èšå®ãããŠããŸããïŒã\
-ãobjetivoããšããåèªãåä¿¡ããã¡ãŒã«ã«èŠã€ãããšã倿Žãããã¡ãŒã«ã®æ€èšŒããŒã¯ã³ãåãåã£ãããšãããããæ»æãçµäºããŸãã
+- **Automated python script**: ãã®ã¹ã¯ãªããã®ç®çã¯ããŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ã倿Žãã€ã€ããã®æ€èšŒãå®äºãããŸã§ç¶ç¶çã«ç¢ºèªããããšã§ããæ°ããã¡ãŒã«ã®æ€èšŒããŒã¯ã³ãæåŸã®ã¡ãŒã«ã¢ãã¬ã¹ã«å±ããŸã§åŸ
ã¡ãŸãïŒããã¯ã³ãŒãå
ã§ãã¡ãŒã«ã倿Žã§ãããæ€èšŒãå€ãã¡ãŒã«ã«éãããŠããŸã RC ã確èªãããããã§ãã¡ãŒã«ã瀺ã倿°ãæåã®å€ã§æ¢ã«èšå®ãããŠããããã§ãïŒã\
+åä¿¡ããã¡ãŒã«ã®äžã« "objetivo" ãšããåèªãèŠã€ãã£ããã倿Žããã¡ãŒã«ã®æ€èšŒããŒã¯ã³ãåãåã£ãããšã確èªã§ããã®ã§ãæ»æãçµäºããŸãã
```python
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
# Script from victor to solve a HTB challenge
@@ -217,22 +217,22 @@ h2_conn.close_connection()
response = requests.get(url, verify=False)
```
-### æ¹åãããã·ã³ã°ã«ãã±ããæ»æ
+### Single Packet Attack ã®æ¹å
-å
ã®ç ç©¶ã§ã¯ããã®æ»æã«ã¯1,500ãã€ãã®å¶éããããšèª¬æãããŠããŸãããããã[**ãã®æçš¿**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)ã§ã¯ã**IPå±€ã®ãã©ã°ã¡ã³ããŒã·ã§ã³ã䜿çšããŠã·ã³ã°ã«ãã±ããæ»æã®1,500ãã€ãã®å¶éãTCPã®**65,535 BãŠã£ã³ããŠå¶éã«æ¡åŒµããæ¹æ³**ã説æãããŠããïŒåäžã®ãã±ãããè€æ°ã®IPãã±ããã«åå²ããç°ãªãé åºã§éä¿¡ããããšã§ïŒããã¹ãŠã®ãã©ã°ã¡ã³ãããµãŒããŒã«å°éãããŸã§ãã±ããã®åæ§æãé²ãããšãå¯èœã§ãããã®æè¡ã«ãããç ç©¶è
ã¯çŽ166msã§10,000ãªã¯ãšã¹ããéä¿¡ããããšãã§ããŸããã
+ãªãªãžãã«ã®ç ç©¶ã§ã¯ããã®æ»æã¯1,500ãã€ãã®å¶éããããšèª¬æãããŠããŸãããããã[**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)ã§ã¯ãIPã¬ã€ã€ã®ãã©ã°ã¡ã³ããŒã·ã§ã³ïŒåäžã®ãã±ãããè€æ°ã®IPãã±ããã«åå²ïŒã䜿çšãããã±ãããå¥é åºã§éä¿¡ããããšã§ãsingle packet attack ã®1,500ãã€ãã®å¶éãTCPã®**65,535 BãŠã£ã³ããŠå¶é**ãŸã§æ¡åŒµã§ããæ¹æ³ã説æãããŠããŸããããã«ããããã¹ãŠã®ãã©ã°ã¡ã³ãããµãŒãã«å±ããŸã§ãã±ããã®åæ§æãé²ãããšãã§ããŸãããã®ææ³ã«ãããç ç©¶è
ã¯çŽ166msã§10,000ä»¶ã®ãªã¯ãšã¹ããéä¿¡ã§ããŸããã
-ãã®æ¹åã«ãããåæã«å°çããå¿
èŠãããæ°çŸ/æ°åã®ãã±ãããå¿
èŠãšããRCæ»æãããä¿¡é Œæ§ã®é«ããã®ã«ãªããŸããããœãããŠã§ã¢ã®å¶éãããå¯èœæ§ããããŸããApacheãNginxãGoãªã©ã®äžè¬çãªHTTPãµãŒããŒã«ã¯ã`SETTINGS_MAX_CONCURRENT_STREAMS`ã®èšå®ããããã100ã128ã250ãšå³æ Œã«èšå®ãããŠããŸããããããNodeJSãnghttp2ã®ãããªä»ã®ãµãŒããŒã¯ç¡å¶éã§ãã\
-ããã¯åºæ¬çã«ãApacheãåäžã®TCPæ¥ç¶ãã100ã®HTTPæ¥ç¶ããèæ
®ããªãããšãæå³ãïŒãã®RCæ»æãå¶éããŸãïŒã
+ãã®æ¹åã«ãããæ°çŸãæ°åã®ãã±ãããåæã«å°çããããšãèŠæ±ããRCã«ãããŠæ»æã®ä¿¡é Œæ§ã¯åäžããŸããããœãããŠã§ã¢åŽã®å¶çŽããããŸããApacheãNginxãGo ã®ãããªäžè¬çãªHTTPãµãŒããŒã¯ `SETTINGS_MAX_CONCURRENT_STREAMS` ããããã100ã128ã250 ã«å³æ Œã«èšå®ãããŠããŸããäžæ¹ãNodeJS ã nghttp2 ã®ãããªãã®ã¯ç¡å¶éã§ãã\
+ããã¯åºæ¬çã« Apache ãåäžã®TCPæ¥ç¶ããã®HTTPæ¥ç¶ã100ä»¶ããæ±ããªãããšãæå³ãïŒãã®RCæ»æãå¶éããŸãïŒã
-ãã®æè¡ã䜿çšããããã€ãã®äŸã¯ããªããžããª[https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main)ã§èŠã€ããããšãã§ããŸãã
+ãã®ææ³ã䜿ã£ãããã€ãã®äŸã¯ãªããžã㪠https://github.com/Ry0taK/first-sequence-sync/tree/main ã§ç¢ºèªã§ããŸãã
-## çã®BF
+## Raw BF
-åã®ç ç©¶ã®åã«ãRCãåŒãèµ·ããããã«ãã±ãããã§ããã ãæ©ãéä¿¡ããããšããããã€ãã®ãã€ããŒãã䜿çšãããŸããã
+åè¿°ã®ç 究以åã¯ãRCãåŒãèµ·ããããã«ãã±ãããå¯èœãªéãé«éã§éä¿¡ããããšãã以äžã®ãããªãã€ããŒãã䜿çšãããŠããŸããã
-- **ãªããŒã¿ãŒ:** åã®ã»ã¯ã·ã§ã³ã®äŸã確èªããŠãã ããã
-- **䟵å
¥è
**: **ãªã¯ãšã¹ã**ã**䟵å
¥è
**ã«éä¿¡ãã**ãªãã·ã§ã³ã¡ãã¥ãŒå
ã§ã¹ã¬ããæ°ã**30**ã«èšå®ãããã€ããŒããšããŠ**Null payloads**ãéžæãã**30**ãçæããŸãã
-- **ã¿ãŒã䟵å
¥è
**
+- **Repeater:** åã®ã»ã¯ã·ã§ã³ã®äŸãåç
§ããŠãã ããã
+- **Intruder**: **request**ã**Intruder**ã«éä¿¡ãã**Options menu**å
ã§**number of threads**ã**30**ã«èšå®ãããã€ããŒããšããŠ**Null payloads**ãéžæããŠ**30**ãçæããŸãã
+- **Turbo Intruder**
```python
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
@@ -283,71 +283,71 @@ asyncio.run(main())
### Limit-overrun / TOCTOU
-ããã¯ã**ã¢ã¯ã·ã§ã³ãå®è¡ã§ããåæ°ãå¶éããå Žæã«**çŸãã**è匱æ§**ã®æãåºæ¬çãªã¿ã€ãã®ã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ã§ããäŸãã°ããŠã§ãã¹ãã¢ã§åãå²åŒã³ãŒããäœåºŠã䜿çšããããšã§ããéåžžã«ç°¡åãªäŸã¯[**ãã®ã¬ããŒã**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43)ã[**ãã®ãã°**](https://hackerone.com/reports/759247)**ã«èŠãããŸãã**
+ããã¯ãã¢ã¯ã·ã§ã³ã®å®è¡åæ°ãå¶éããå Žæã«**vulnerabilities**ã**appear**ãããæãåºæ¬çãªã¿ã€ãã®race conditionã§ããäŸãã°ãåãå²åŒã³ãŒãããŠã§ãã¹ãã¢ã§äœåºŠã䜿ãããšãæããããŸããç°¡åãªäŸã¯[**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43)ã[**this bug**](https://hackerone.com/reports/759247)**.**
-ãã®çš®ã®æ»æã«ã¯å€ãã®ããªãšãŒã·ã§ã³ããããŸããäŸãã°ïŒ
+There are many variations of this kind of attack, including:
-- ã®ããã«ãŒããè€æ°åå©çšãã
-- ååãè€æ°åè©äŸ¡ãã
-- ã¢ã«ãŠã³ãæ®é«ãè¶
ããŠçŸéãåŒãåºããã転éããããã
-- åäžã®CAPTCHA解決çãåå©çšãã
-- ã¢ã³ããã«ãŒããã©ãŒã¹ã¬ãŒãå¶éãåé¿ãã
+- Redeeming a gift card multiple times
+- Rating a product multiple times
+- Withdrawing or transferring cash in excess of your account balance
+- Reusing a single CAPTCHA solution
+- Bypassing an anti-brute-force rate limit
### **Hidden substates**
-è€éãªã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ãæªçšããããšã¯ãé ãããŸãã¯**æå³ããªããã·ã³ã®ãµãã¹ããŒã**ãšçžäºäœçšããããã®çãæ©äŒãå©çšããããšãå«ãããšããããããŸããããã«ã¢ãããŒãããæ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
+è€é㪠race condition ãæªçšããéã¯ãçãæ©äŒãå©çšã㊠hidden ãŸã㯠**unintended machine substates** ãšããåãããããšãçãããšãå€ãã§ããã¢ãããŒãæ¹æ³ã¯ä»¥äžã®éãã§ã:
-1. **æœåšçãªé ãããµãã¹ããŒããç¹å®ãã**
-- ãŠãŒã¶ãŒãããã¡ã€ã«ããã¹ã¯ãŒããªã»ããããã»ã¹ãªã©ãéèŠãªããŒã¿ã倿ŽãŸãã¯çžäºäœçšãããšã³ããã€ã³ããç¹å®ããããšããå§ããŸãã以äžã«çŠç¹ãåœãŠãŸãïŒ
-- **ã¹ãã¬ãŒãž**ïŒã¯ã©ã€ã¢ã³ãåŽã®ããŒã¿ãæ±ããšã³ããã€ã³ããããããµãŒããŒåŽã®æ°žç¶ããŒã¿ãæäœãããšã³ããã€ã³ããåªå
ããŸãã
-- **ã¢ã¯ã·ã§ã³**ïŒæ¢åã®ããŒã¿ã倿Žããæäœãæ¢ããŸããããã¯æ°ããããŒã¿ã远å ããæäœããããæªçšå¯èœãªæ¡ä»¶ãäœæããå¯èœæ§ãé«ãã§ãã
-- **ããŒã€ã³ã°**ïŒæåããæ»æã¯éåžžãåãèå¥åïŒäŸïŒãŠãŒã¶ãŒåããªã»ããããŒã¯ã³ïŒã«åºã¥ãæäœãå«ã¿ãŸãã
-2. **åæãããŒãã³ã°ã宿œãã**
-- ç¹å®ãããšã³ããã€ã³ãã«å¯ŸããŠã¬ãŒã¹ã³ã³ãã£ã·ã§ã³æ»æããã¹ãããæåŸ
ãããçµæããã®éžè±ã芳å¯ããŸããäºæããªãå¿çãã¢ããªã±ãŒã·ã§ã³ã®åäœã®å€åã¯è匱æ§ã瀺ãå¯èœæ§ããããŸãã
-3. **è匱æ§ã瀺ã**
-- è匱æ§ãæªçšããããã«å¿
èŠãªæå°éã®ãªã¯ãšã¹ãæ°ã«æ»æãçµã蟌ã¿ãŸããéåžžã¯2åã§ãããã®ã¹ãããã§ã¯ãæ£ç¢ºãªã¿ã€ãã³ã°ãé¢äžãããããè€æ°åã®è©Šè¡ãèªååãå¿
èŠã«ãªãããšããããŸãã
+1. **Identify Potential Hidden Substates**
+- ãŸããuser profiles ã password reset ã®ãããªéèŠãªããŒã¿ã倿Žã»æäœãã endpoints ãç¹å®ããŸããæ³šç®ç¹:
+- **Storage**: client-side ãæ±ããã®ããã server-side ã®æ°žç¶ããŒã¿ãæäœãã endpoints ãåªå
ããã
+- **Action**: æ¢åããŒã¿ã倿Žããæäœãæ¢ããæ°èŠããŒã¿ã远å ããæäœãã exploitable conditions ãçã¿ãããã
+- **Keying**: æåããæ»æã¯éåžžãåãèå¥åïŒäŸ: username ã reset tokenïŒã§ããŒä»ããããæäœãé¢ä¿ããã
+2. **Conduct Initial Probing**
+- ç¹å®ãã endpoints ã«å¯Ÿã㊠race condition æ»æã§ãã¹ãããæåŸ
ãããçµæããã®éžè±ã芳å¯ãããäºæããªãã¬ã¹ãã³ã¹ãã¢ããªæåã®å€å㯠vulnerability ã®å
åãšãªãã
+3. **Demonstrate the Vulnerability**
+- æ»æãæå°ã®ãªã¯ãšã¹ãæ°ïŒå€ãã®å Žå 2 åïŒã«çµã£ãŠ vulnerability ãå®èšŒãããæ£ç¢ºãªã¿ã€ãã³ã°ãå¿
èŠãªããããã®æ®µéã§ã¯è€æ°åã®è©Šè¡ãèªååãå¿
èŠã«ãªãããšãããã
-### æéã«ææãªæ»æ
+### Time Sensitive Attacks
-ãªã¯ãšã¹ãã®ã¿ã€ãã³ã°ã®ç²ŸåºŠã¯è匱æ§ãæããã«ããããšãã§ããç¹ã«ã¿ã€ã ã¹ã¿ã³ãã®ãããªäºæž¬å¯èœãªæ¹æ³ãã»ãã¥ãªãã£ããŒã¯ã³ã«äœ¿çšãããå Žåã«é¡èã§ããäŸãã°ãã¿ã€ã ã¹ã¿ã³ãã«åºã¥ããŠãã¹ã¯ãŒããªã»ããããŒã¯ã³ãçæãããšãåæãªã¯ãšã¹ãã«å¯ŸããŠåäžã®ããŒã¯ã³ãèš±å¯ãããå¯èœæ§ããããŸãã
+ãªã¯ãšã¹ãã®ã¿ã€ãã³ã°ã粟å¯ã«åãããããšã§ vulnerabilities ãé²åããããšããããç¹ã« timestamps ã®ãããªäºæž¬å¯èœãªææ³ã§ security tokens ãçæããŠããå Žåã«é¡èã§ãããäŸãã°ãtimestamp ããŒã¹ã§ password reset tokens ãçæããŠãããšãåæã«è¡ã£ããªã¯ãšã¹ãã§åäžã® token ãçæãããå¯èœæ§ãããã
-**æªçšããã«ã¯ïŒ**
+**To Exploit:**
-- åäžãã±ããæ»æã®ãããªæ£ç¢ºãªã¿ã€ãã³ã°ã䜿çšããŠãåæã«ãã¹ã¯ãŒããªã»ãããªã¯ãšã¹ããè¡ããŸããåäžã®ããŒã¯ã³ã¯è匱æ§ã瀺ããŸãã
+- 粟å¯ãªã¿ã€ãã³ã°ïŒåäžãã±ããæ»æãªã©ïŒã§åæã« password reset ãªã¯ãšã¹ããéããåäžã® token ãè¿ãã° vulnerability ã瀺ãã
-**äŸïŒ**
+**Example:**
-- åæã«2ã€ã®ãã¹ã¯ãŒããªã»ããããŒã¯ã³ããªã¯ãšã¹ãããããããæ¯èŒããŸããããŒã¯ã³ãäžèŽããå ŽåãããŒã¯ã³çæã«æ¬ é¥ãããããšã瀺åããŸãã
+- åæã« 2 ã€ã® password reset token ãèŠæ±ããŠæ¯èŒãããäžèŽããã° token çæã®æ¬ é¥ã瀺åããã
-**ããã確èªããŠãã ãã** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **ã詊ããŠã¿ãŠãã ããã**
+**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.**
## Hidden substates case studies
### Pay & add an Item
-ãã®[**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)ã確èªããŠã**æ¯æã**ãè¡ãã**远å ã®**ã¢ã€ãã ã**æ¯æããã«è¿œå ãã**æ¹æ³ãèŠãŠãã ããã
+ãã®æåïŒstore ã§ **pay** ããŠæ¯æãäžèŠã®**远å ã¢ã€ãã **ã**add**ããæ¹æ³ïŒã¯[**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)ã§ç¢ºèªã§ããŸãã
### Confirm other emails
-ã¢ã€ãã¢ã¯ã**ã¡ãŒã«ã¢ãã¬ã¹ã確èªããåæã«å¥ã®ãã®ã«å€æŽãã**ããšã§ããã©ãããã©ãŒã ã倿Žãããæ°ãããã®ã確èªãããã©ããã調ã¹ãããšã§ãã
+çãã¯ã**åæã« email address ã verify ãã€ã€å¥ã®ãã®ã« change ããŠããã©ãããã©ãŒã ãæ°ããã¢ãã¬ã¹ã確èªãããã©ããã確ããã**ããšã§ãã
### Change email to 2 emails addresses Cookie based
-[**ãã®ç ç©¶**](https://portswigger.net/research/smashing-the-state-machine)ã«ãããšãGitlabã¯ãã®æ¹æ³ã§ä¹ã£åãããè匱æ§ãããã**äžã€ã®ã¡ãŒã«ã®**ã¡ãŒã«ç¢ºèªããŒã¯ã³ã**å¥ã®ã¡ãŒã«ã«éä¿¡ãã**å¯èœæ§ããããŸãã
+According to [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab was vulnerable to a takeover this way because it might **send** the **email verification token of one email to the other email**.
-**ããã確èªããŠãã ãã** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **ã詊ããŠã¿ãŠãã ããã**
+**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.**
### Hidden Database states / Confirmation Bypass
-**2ã€ã®ç°ãªãæžã蟌ã¿**ã**ããŒã¿ããŒã¹**å
ã«**æ
å ±ã远å ããããã«**䜿çšãããå Žåã**æåã®ããŒã¿ã®ã¿ãããŒã¿ããŒã¹ã«æžã蟌ãŸãã**å°ããªæéã®éšåããããŸããäŸãã°ããŠãŒã¶ãŒãäœæããéã«ã**ãŠãŒã¶ãŒå**ãš**ãã¹ã¯ãŒã**ã**æžã蟌ãŸã**ããã®åŸã«æ°ããäœæãããã¢ã«ãŠã³ãã確èªããããã®**ããŒã¯ã³**ãæžã蟌ãŸããŸããããã¯ã**ã¢ã«ãŠã³ãã確èªããããã®ããŒã¯ã³ãnullã§ãã**å°ããªæéãããããšãæå³ããŸãã
+ãã **2 different writes** ã **database** å
ã« **information** ã **add** ããããã«äœ¿ããããšãdatabase ã« **only the first data has been written** çãæé垯ãçãããäŸãã°ããŠãŒã¶äœææã« **username** ãš **password** ã **written** ããããã®åŸã«æ°èŠã¢ã«ãŠã³ãã確èªãã **token** ãæžã蟌ãŸããããšããé åºã ãšããã®é㯠**token to confirm an account is null** ãšããç¶æ
ã«ãªãã
-ãããã£ãŠã**ã¢ã«ãŠã³ããç»é²ãã空ã®ããŒã¯ã³**ïŒ`token=`ãŸãã¯`token[]=`ãŸãã¯ä»ã®ããªãšãŒã·ã§ã³ïŒã䜿çšããŠã¢ã«ãŠã³ããããã«ç¢ºèªããããã®è€æ°ã®ãªã¯ãšã¹ããéä¿¡ããããšã§ã**ã¡ãŒã«ãå¶åŸ¡ããŠããªãã¢ã«ãŠã³ãã確èªãã**ããšãã§ããå¯èœæ§ããããŸãã
+Therefore **registering an account and sending several requests with an empty token** (`token=` or `token[]=` or any other variation) to confirm the account right away could allow to c**onfirm an account** where you don't control the email.
-**ããã確èªããŠãã ãã** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **ã詊ããŠã¿ãŠãã ããã**
+**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.**
### Bypass 2FA
-以äžã®æ¬äŒŒã³ãŒãã¯ãã»ãã·ã§ã³ãäœæãããŠããéã«**2FAã匷å¶ãããŠããªã**éåžžã«çãæéããããããã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ã«å¯ŸããŠè匱ã§ãïŒ
+The following pseudo-code is vulnerable to race condition because in a very small time the **2FA is not enforced** while the session is created:
```python
session['userid'] = user.userid
if user.mfa_enabled:
@@ -355,24 +355,26 @@ session['enforce_mfa'] = True
# generate and send MFA code to user
# redirect browser to MFA code entry form
```
-### OAuth2 æ°žç¶çãªæç¶æ§
+### OAuth2 ã®æ°žç¶çãªä¿æ
-ããã€ãã® [**OAUth ãããã€ããŒ**](https://en.wikipedia.org/wiki/List_of_OAuth_providers) ããããŸãããããã®ãµãŒãã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ãäœæãããããã€ããŒãç»é²ãããŠãŒã¶ãŒãèªèšŒããããšãå¯èœã«ããŸãããã®ããã«ã¯ã**ã¯ã©ã€ã¢ã³ã**ã **ããªãã®ã¢ããªã±ãŒã·ã§ã³** ã« **ããã€ãã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ãèš±å¯ãã** å¿
èŠããããŸãã\
-ãããŸã§ãgoogle/linkedin/github ãªã©ã®äžè¬çãªãã°ã€ã³ã§ã"_ã¢ããªã±ãŒã·ã§ã³ \ ãããªãã®æ
å ±ã«ã¢ã¯ã»ã¹ããããšèããŠããŸããèš±å¯ããŸããïŒ_" ãšããããŒãžã衚瀺ãããŸãã
+There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). ãããã®ãµãŒãã¹ã§ã¯ã¢ããªã±ãŒã·ã§ã³ãäœæãããããã€ãã«ç»é²ãããŠãããŠãŒã¶ãŒãèªèšŒããããšãã§ããŸãã
+ãã®ããã«ã**client** 㯠**ããªãã®ã¢ããªã±ãŒã·ã§ã³ãèš±å¯**ããŠã**OAUth provider** å
ã®ããŒã¿ã®äžéšãžã¢ã¯ã»ã¹ã§ããããã«ããå¿
èŠããããŸãã\
+ãããŸã§ã¯ google/linkedin/github... çã§ããããäžè¬çãªãã°ã€ã³ã§ã次ã®ãããªããŒãžã衚瀺ãããŸãïŒ"_Application \ wants to access you information, do you want to allow it?_"
-#### `authorization_code` ã«ãããã¬ãŒã¹ã³ã³ãã£ã·ã§ã³
+#### Race Condition in `authorization_code`
-**åé¡**ã¯ãããªãã **ãããåãå
¥ãã** ãšãæªæã®ããã¢ããªã±ãŒã·ã§ã³ã« **`authorization_code`** ãèªåçã«éä¿¡ããããšãã«çºçããŸãããã®åŸããã® **ã¢ããªã±ãŒã·ã§ã³ã¯ OAUth ãµãŒãã¹ãããã€ããŒã®ã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ãæªçšããŠãããªãã®ã¢ã«ãŠã³ãã® **`authorization_code`** ããè€æ°ã® AT/RT** (_èªèšŒããŒã¯ã³/ãªãã¬ãã·ã¥ããŒã¯ã³_) ãçæããŸããåºæ¬çã«ãããªããã¢ããªã±ãŒã·ã§ã³ã«ããŒã¿ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããäºå®ãæªçšã㊠**è€æ°ã®ã¢ã«ãŠã³ããäœæããŸã**ããã®åŸãããããªãã **ã¢ããªã±ãŒã·ã§ã³ã«ããŒã¿ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããªããªã£ãå Žåã1çµã® AT/RT ã¯åé€ãããŸãããä»ã®ãã®ã¯ãŸã æå¹ã§ã**ã
+The **problem** appears when you **accept it** and automatically sends an **`authorization_code`** to the malicious application. Then, this **application abuses a Race Condition in the OAUth service provider to generate more that one AT/RT** (_Authentication Token/Refresh Token_) from the **`authorization_code`** for your account. åºæ¬çã«ã¯ãããªããã¢ããªã±ãŒã·ã§ã³ã«ããŒã¿ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããäºå®ãæªçšã㊠**è€æ°ã®ã¢ã«ãŠã³ããäœæ** ããŸãã ãã®åŸãããã¢ããªã±ãŒã·ã§ã³ãžã®ã¢ã¯ã»ã¹èš±å¯ãåãæ¶ããŠãã1çµã® AT/RT ã¯åé€ããããããããŸããããä»ã®ãã®ã¯äŸç¶ãšããŠæå¹ãªãŸãŸæ®ããŸãã
-#### `Refresh Token` ã«ãããã¬ãŒã¹ã³ã³ãã£ã·ã§ã³
+#### Race Condition in `Refresh Token`
-äžåºŠ **æå¹ãª RT** ã **ååŸãããšãè€æ°ã® AT/RT ãçæããããã«ãããæªçšããããšããããšãã§ããŸã**ããããŠã**ãŠãŒã¶ãŒãæªæã®ããã¢ããªã±ãŒã·ã§ã³ã«ããŒã¿ãžã®ã¢ã¯ã»ã¹ã®æš©éããã£ã³ã»ã«ããŠãã**è€æ°ã® RT ã¯ãŸã æå¹ã§ã**ã
+Once you have **obtained a valid RT** you could try to **abuse it to generate several AT/RT** and **even if the user cancels the permissions** for the malicious application to access his data, **several RTs will still be valid.**
-## **WebSockets ã«ããã RC**
+## **RC in WebSockets**
-[**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) ã§ã¯ã**䞊è¡ããŠ** WebSocket ã¡ãã»ãŒãžãéä¿¡ã㊠**Web Sockets ã«ãããã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ãæªçšãã** PoC ã Java ã§èŠã€ããããšãã§ããŸãã
+- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) you can find a PoC in Java to send websocket messages in **parallel** to abuse **Race Conditions also in Web Sockets**.
+- With Burpâs WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Start from the official example and tune `config()` (thread count) for concurrency; this is often more reliable than batching on a single connection when racing serverâside state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
-## åèæç®
+## References
- [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
- [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html)
@@ -380,5 +382,8 @@ session['enforce_mfa'] = True
- [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
- [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions)
- [https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)
+- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine)
+- [WebSocketTurboIntruder â GitHub](https://github.com/d0ge/WebSocketTurboIntruder)
+- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py)
{{#include ../banners/hacktricks-training.md}}
diff --git a/src/pentesting-web/websocket-attacks.md b/src/pentesting-web/websocket-attacks.md
index 11ac2b15e..4f3c02991 100644
--- a/src/pentesting-web/websocket-attacks.md
+++ b/src/pentesting-web/websocket-attacks.md
@@ -1,22 +1,22 @@
-# WebSocket Attacks
+# WebSocket æ»æ
{{#include ../banners/hacktricks-training.md}}
-## WebSocketãšã¯
+## WebSocketsãšã¯
-WebSocketæ¥ç¶ã¯ãæåã®**HTTP**ãã³ãã·ã§ã€ã¯ãéããŠç¢ºç«ããã**é·æé**ã®æ¥ç¶ãç®çãšããŠããããã©ã³ã¶ã¯ã·ã§ã³ã·ã¹ãã ãå¿
èŠãšããã«ãã€ã§ãåæ¹åã®ã¡ãã»ãŒãžã³ã°ãå¯èœã«ããŸããããã«ãããWebSocketã¯**äœé
å»¶ãŸãã¯ãµãŒããŒèµ·åã®éä¿¡**ãå¿
èŠãšããã¢ããªã±ãŒã·ã§ã³ã«ç¹ã«æå©ã§ãã
+WebSocketæ¥ç¶ã¯æåã®**HTTP**ãã³ãã·ã§ã€ã¯ãéããŠç¢ºç«ããã**é·æéæç¶**ããããã«èšèšãããŠããããã©ã³ã¶ã¯ã·ã§ã³åã®ä»çµã¿ãå¿
èŠãšããããã€ã§ãåæ¹åã¡ãã»ãŒãžã³ã°ãå¯èœã«ãªããŸããããã«ãããWebSocketsã¯**äœã¬ã€ãã³ã·ãŸãã¯ãµãŒããŒèµ·ç¹ã®éä¿¡**ãå¿
èŠãšããã¢ããªã±ãŒã·ã§ã³ïŒäŸãã°ã©ã€ãéèããŒã¿ã¹ããªãŒã ïŒã«ç¹ã«é©ããŠããŸãã
### WebSocketæ¥ç¶ã®ç¢ºç«
-WebSocketæ¥ç¶ã®ç¢ºç«ã«é¢ãã詳现ãªèª¬æã¯[**ãã¡ã**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)ã§ã¢ã¯ã»ã¹ã§ããŸããèŠçŽãããšãWebSocketæ¥ç¶ã¯éåžžã以äžã«ç€ºãããã«ã¯ã©ã€ã¢ã³ãåŽã®JavaScriptãä»ããŠéå§ãããŸã:
+WebSocketæ¥ç¶ã®ç¢ºç«ã«é¢ãã詳现ãªèª¬æã¯[**ãã¡ã**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)ã§åç
§ã§ããŸããèŠçŽãããšãWebSocketæ¥ç¶ã¯éåžžã¯ã©ã€ã¢ã³ããµã€ãã®JavaScriptãä»ããŠä»¥äžã®ããã«éå§ãããŸã:
```javascript
var ws = new WebSocket("wss://normal-website.com/ws")
```
-`wss`ãããã³ã«ã¯**TLS**ã§ä¿è·ãããWebSocketæ¥ç¶ã瀺ãã`ws`ã¯**ä¿è·ãããŠããªã**æ¥ç¶ã瀺ããŸãã
+`wss` ãããã³ã«ã¯ **TLS** ã§ä¿è·ããã WebSocket æ¥ç¶ã瀺ãã`ws` 㯠**æªä¿è·** ã®æ¥ç¶ã瀺ããŸãã
-æ¥ç¶ã®ç¢ºç«äžã«ããã©ãŠã¶ãšãµãŒããŒã®éã§HTTPãä»ããŠãã³ãã·ã§ã€ã¯ãè¡ãããŸãããã³ãã·ã§ã€ã¯ããã»ã¹ã§ã¯ããã©ãŠã¶ããªã¯ãšã¹ããéä¿¡ãããµãŒããŒãå¿çããŸãã以äžã®äŸã«ç€ºãããŠããŸãïŒ
+æ¥ç¶ã®ç¢ºç«æã«ã¯ãHTTP ãä»ããŠãã©ãŠã¶ãšãµãŒããŒéã§ãã³ãã·ã§ã€ã¯ãè¡ãããŸãããã³ãã·ã§ã€ã¯ã®ããã»ã¹ã§ã¯ããã©ãŠã¶ããªã¯ãšã¹ããéä¿¡ããµãŒããŒãå¿çããŸãã以äžã®äŸã®ããã«ç€ºãããŸã:
-ãã©ãŠã¶ããã³ãã·ã§ã€ã¯ãªã¯ãšã¹ããéä¿¡ïŒ
+ãã©ãŠã¶ããã³ãã·ã§ã€ã¯ãªã¯ãšã¹ããéä¿¡ããŸã:
```javascript
GET /chat HTTP/1.1
Host: normal-website.com
@@ -26,53 +26,53 @@ Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
```
-ãµãŒããŒã®ãã³ãã·ã§ã€ã¯å¿ç:
+Serverã®handshake response:
```javascript
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
```
-æ¥ç¶ã¯ç¢ºç«ããããšãåæ¹åã§ã¡ãã»ãŒãžäº€æã®ããã«ãªãŒãã³ã®ãŸãŸã«ãªããŸãã
+æ¥ç¶ã確ç«ããããšãäž¡æ¹åã®ã¡ãã»ãŒãžäº€æã®ããã«æ¥ç¶ã¯éãããŸãŸã«ãªããŸãã
**WebSocketãã³ãã·ã§ã€ã¯ã®éèŠãªãã€ã³ã:**
-- `Connection`ããã³`Upgrade`ããããŒã¯WebSocketãã³ãã·ã§ã€ã¯ã®éå§ã瀺ããŸãã
-- `Sec-WebSocket-Version`ããããŒã¯ãéåžž`13`ã®åžæããWebSocketãããã³ã«ããŒãžã§ã³ã瀺ããŸãã
-- Base64ãšã³ã³ãŒããããã©ã³ãã å€ã`Sec-WebSocket-Key`ããããŒã«éä¿¡ãããåãã³ãã·ã§ã€ã¯ããŠããŒã¯ã§ããããšãä¿èšŒãããã£ãã·ã³ã°ãããã·ã«ããåé¡ãé²ããŸãããã®å€ã¯èªèšŒã®ããã§ã¯ãªããå¿çã誀ã£ãŠæ§æããããµãŒããŒããã£ãã·ã¥ã«ãã£ãŠçæãããŠããªãããšã確èªããããã®ãã®ã§ãã
-- ãµãŒããŒã®å¿çã«ããã`Sec-WebSocket-Accept`ããããŒã¯`Sec-WebSocket-Key`ã®ããã·ã¥ã§ãããWebSocketæ¥ç¶ãéããšãããµãŒããŒã®æå³ãæ€èšŒããŸãã
+- `Connection` ãš `Upgrade` ããããŒã¯ WebSocket ãã³ãã·ã§ã€ã¯ã®éå§ã瀺ããŸãã
+- `Sec-WebSocket-Version` ããããŒã¯æãŸãã WebSocket ãããã³ã«ã®ããŒãžã§ã³ïŒé垞㯠`13`ïŒã瀺ããŸãã
+- `Sec-WebSocket-Key` ããããŒã«ã¯ Base64 ãšã³ã³ãŒããããã©ã³ãã å€ãéä¿¡ãããåãã³ãã·ã§ã€ã¯ãäžæã§ããããšãä¿èšŒããŸããããã«ãããã£ãã·ã¥ãããã·ã«ããåé¡ãé²ãã®ã«åœ¹ç«ã¡ãŸãããã®å€ã¯èªèšŒã®ããã®ãã®ã§ã¯ãªããã¬ã¹ãã³ã¹ã誀èšå®ããããµãŒãããã£ãã·ã¥ã«ãã£ãŠçæããããã®ã§ã¯ãªãããšã確èªããããã®ãã®ã§ãã
+- ãµãŒãã®ã¬ã¹ãã³ã¹ã«å«ãŸãã `Sec-WebSocket-Accept` ããããŒã¯ `Sec-WebSocket-Key` ã®ããã·ã¥ã§ããããµãŒãã WebSocket æ¥ç¶ãéãæå³ãããããšãæ€èšŒããŸãã
-ãããã®æ©èœã¯ããã³ãã·ã§ã€ã¯ããã»ã¹ãå®å
šã§ä¿¡é Œæ§ãããããšãä¿èšŒããå¹ççãªãªã¢ã«ã¿ã€ã éä¿¡ãžã®éãéããŸãã
+ãããã®æ©èœã«ããããã³ãã·ã§ã€ã¯ããã»ã¹ã¯å®å
šãã€ä¿¡é Œæ§ã®é«ããã®ãšãªããå¹ççãªãªã¢ã«ã¿ã€ã éä¿¡ã®åºç€ãç¯ãããŸãã
-### Linuxã³ã³ãœãŒã«
+### Linux ã³ã³ãœãŒã«
-`websocat`ã䜿çšããŠWebSocketãšã®çã®æ¥ç¶ã確ç«ã§ããŸãã
+`websocat` ã䜿ã£ãŠ websocket ãšã®çã®æ¥ç¶ã確ç«ã§ããŸãã
```bash
websocat --insecure wss://10.10.10.10:8000 -v
```
-ãŠã§ããœã±ãããµãŒããŒãäœæããã«ã¯:
+ãŸã㯠websocat ãµãŒããŒãäœæããã«ã¯ïŒ
```bash
websocat -s 0.0.0.0:8000 #Listen in port 8000
```
-### MitM websocket connections
+### MitM websocket æ¥ç¶
-ããã¯ã©ã€ã¢ã³ããçŸåšã®ããŒã«ã«ãããã¯ãŒã¯ãã**HTTP websocket**ã«æ¥ç¶ããŠããããšãããã£ãå Žåã[ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing)ã詊ã¿ãŠãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®éã§MitMæ»æãå®è¡ããããšãã§ããŸãã\
-ã¯ã©ã€ã¢ã³ããæ¥ç¶ããããšããŠãããšãã«ã次ã®ããã«äœ¿çšã§ããŸã:
+çŸåšã®ããŒã«ã«ãããã¯ãŒã¯äžã§clientã**HTTP websocket**ã«æ¥ç¶ããŠããã®ãèŠã€ããå Žåã[ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing)ã詊ããŠãclientãšserverã®éã§MitM attackãå®è¡ã§ããŸãã\
+clientãæ¥ç¶ã詊ã¿ããšã次ã«ä»¥äžã䜿çšã§ããŸã:
```bash
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
-### Websockets enumeration
+### Websockets åæ
-**ããŒã«** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **ã䜿çšããŠãWebSocketã®æ¢ç¥ã®** **è匱æ§** **ãèªåçã«çºèŠããã£ã³ã¬ãŒããªã³ãã£ã³ã°ãæ€çŽ¢ã§ããŸãã**
+èªåçã« websockets ã®æ¢ç¥ã®è匱æ§ãæ€åºããã£ã³ã¬ãŒããªã³ããæ€çŽ¢ããã«ã¯ã**ããŒã«** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) ã䜿çšã§ããŸãã
-### Websocket Debug tools
+### Websocket ãããã°ããŒã«
-- **Burp Suite** ã¯ãéåžžã®HTTPéä¿¡ãšéåžžã«äŒŒãæ¹æ³ã§MitM WebSocketéä¿¡ããµããŒãããŠããŸãã
-- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suiteæ¡åŒµæ©èœ** ã¯ã**å±¥æŽ**ãååŸãã**ã€ã³ã¿ãŒã»ãã·ã§ã³ã«ãŒã«**ãèšå®ãã**ããããšçœ®æ**ã«ãŒã«ã䜿çšãã**Intruder**ã**AutoRepeater**ã䜿çšããããšã§ãBurpã§ã®WebSocketéä¿¡ãããè¯ã管çã§ããããã«ããŸãã
-- [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**"ã®ç¥ã§ããã®Node.jsã§æžãããããŒã«ã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®ãã¹ãŠã®WebSocketããã³Socket.IOéä¿¡ã**ãã£ããã£ãã€ã³ã¿ãŒã»ãããã«ã¹ã¿ã **ã¡ãã»ãŒãžãéä¿¡ãã衚瀺ããããã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã
-- [**wsrepl**](https://github.com/doyensec/wsrepl) ã¯ããããã¬ãŒã·ã§ã³ãã¹ãå°çšã«èšèšããã**ã€ã³ã¿ã©ã¯ãã£ãWebSocket REPL**ã§ãã**åä¿¡WebSocketã¡ãã»ãŒãžã芳å¯ããæ°ããã¡ãã»ãŒãžãéä¿¡ãã**ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸãããã®éä¿¡ã**èªåå**ããããã®äœ¿ãããããã¬ãŒã ã¯ãŒã¯ãåããŠããŸãã
-- [**https://websocketking.com/**](https://websocketking.com/) ã¯ã**WebSocket**ã䜿çšããŠä»ã®Webãšéä¿¡ããããã®**Web**ã§ãã
-- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) ã¯ãä»ã®éä¿¡/ãããã³ã«ã®çš®é¡ã®äžã§ã**WebSocket**ã䜿çšããŠä»ã®Webãšéä¿¡ããããã®**Web**ãæäŸããŸãã
+- **Burp Suite** ã¯ãéåžžã® HTTP éä¿¡ãšéåžžã«äŒŒãæ¹æ³ã§ MitM ã«ãã websockets éä¿¡ããµããŒãããŸãã
+- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite extension** ã«ããã**history** ã®ååŸã**interception rules** ã®èšå®ã**match and replace** ã«ãŒã«ã®å©çšã**Intruder** ã **AutoRepeater** ã®äœ¿çšãªã©ãBurp å
ã§ã® Websocket éä¿¡ãããé©åã«ç®¡çã§ããŸãã
+- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Short for "**WebSocket/Socket.io Proxy**"ãNode.js ã§æžããããã®ããŒã«ã¯ãã¯ã©ã€ã¢ã³ããšãµãŒãéã®ãã¹ãŠã® WebSocket ãš Socket.IO éä¿¡ããã£ããã£ãã€ã³ã¿ãŒã»ãããã«ã¹ã¿ã ã¡ãã»ãŒãžã®éä¿¡ãããã³è¡šç€ºããããã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã
+- [**wsrepl**](https://github.com/doyensec/wsrepl) ã¯ãpenetration testing åãã«èšèšããã interactive websocket REPL ã§ããåä¿¡ websocket ã¡ãã»ãŒãžã®èгå¯ãæ°ããã¡ãã»ãŒãžã®éä¿¡ãããã³ãã®éä¿¡ãèªååããããã®äœ¿ãããããã¬ãŒã ã¯ãŒã¯ãæäŸããŸãã
+- [**https://websocketking.com/**](https://websocketking.com/) 㯠websockets ã䜿ã£ãŠä»ã® web ãšéä¿¡ããããã® web ã§ãã
+- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) ã¯ãä»ã®ãããã³ã«ãšåæ§ã«ãwebsockets ã䜿ã£ãŠä»ã® web ãšéä¿¡ããããã® web ãæäŸããŸãã
## Decrypting Websocket
@@ -81,33 +81,150 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
## Websocket Lab
-[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) ã«ã¯ãWebSocketã䜿çšããŠWebãèµ·åããããã®ã³ãŒããããã[**ãã®æçš¿**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) ã§èª¬æãèŠã€ããããšãã§ããŸãã
+In [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) you have a code to launch a web using websockets and in [**this post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) you can find an explanation.
## Websocket Fuzzing
-Burpæ¡åŒµæ©èœ [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) ã¯ãWebSocketã¡ãã»ãŒãžã®ãã¡ãžã³ã°ãå¯èœã«ããŸããããã®ããšã«ã€ããŠã®è©³çްã¯[**ãã¡ã**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner)ã§èªãããšãã§ããŸãã
+Burp ã®æ¡åŒµ [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) ã¯çŸåš WebSocket ã¡ãã»ãŒãžã® fuzz ããµããŒãããŠããŸãã詳现㯠[**here**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner) ãåç
§ããŠãã ããã
+
+### WebSocket Turbo Intruder (Burp extension)
+
+PortSwigger ã® WebSocket Turbo Intruder ã¯ãTurbo Intruder ã¹ã¿ã€ã«ã® Python ã¹ã¯ãªãããšé«ã¬ãŒãã® fuzzing ã WebSockets ã«æäŸããŸããBApp Store ããœãŒã¹ããã€ã³ã¹ããŒã«ã§ããŸãã以äžã® 2 ã€ã®ã³ã³ããŒãã³ããå«ã¿ãŸã:
+
+- Turbo Intruder: ã«ã¹ã¿ã ãšã³ãžã³ã䜿çšããŠåäžã® WS ãšã³ããã€ã³ãã«å¯ŸããŠé«ããªã¥ãŒã ã®ã¡ãã»ãŒãžéä¿¡ãè¡ããŸãã
+- HTTP Middleware: ããŒã«ã«ã® HTTP ãšã³ããã€ã³ããå
¬éããããã£ãæ°žç¶çãªæ¥ç¶äžã§ WS ã¡ãã»ãŒãžãšããŠè»¢éãããããä»»æã® HTTP ããŒã¹ã®ã¹ãã£ãã WS ããã¯ãšã³ãããããŒãã§ããããã«ããŸãã
+
+WS ãšã³ããã€ã³ãã fuzz ããé¢é£ããã¬ã¹ãã³ã¹ããã£ã«ã¿ããããã®åºæ¬çãªã¹ã¯ãªãããã¿ãŒã³:
+```python
+def queue_websockets(upgrade_request, message):
+connection = websocket_connection.create(upgrade_request)
+for i in range(10):
+connection.queue(message, str(i))
+
+def handle_outgoing_message(websocket_message):
+results_table.add(websocket_message)
+
+@MatchRegex(r'{\"user\":\"Hal Pline\"')
+def handle_incoming_message(websocket_message):
+results_table.add(websocket_message)
+```
+åäžã®ã¡ãã»ãŒãžãè€æ°ã®ã¬ã¹ãã³ã¹ãåŒãèµ·ããå Žåããã€ãºãæžããããã«`@MatchRegex(...)`ã®ãããªãã³ã¬ãŒã¿ã䜿çšããã
+
+### HTTPã®èåŸã«ããWSãããªããž (HTTP Middleware)
+
+æ°žç¶çãªWSæ¥ç¶ãã©ããããHTTP bodiesãWS messagesãšããŠè»¢éããŠãHTTP scannersã«ããèªåãã¹ããè¡ãïŒ
+```python
+def create_connection(upgrade_request):
+connection = websocket_connection.create(upgrade_request)
+return connection
+
+@MatchRegex(r'{\"user\":\"You\"')
+def handle_incoming_message(websocket_message):
+results_table.add(websocket_message)
+```
+次ã«ããŒã«ã«ã«HTTPãéä¿¡ããŸã; ããã£ã¯WSã¡ãã»ãŒãžãšããŠè»¢éãããŸã:
+```http
+POST /proxy?url=https%3A%2F%2Ftarget/ws HTTP/1.1
+Host: 127.0.0.1:9000
+Content-Length: 16
+
+{"message":"hi"}
+```
+ããã«ãããWSããã¯ãšã³ããæäœãã€ã€ãâè峿·±ãâã€ãã³ãïŒäŸ: SQLi errorsãauth bypassãcommand injection behaviorïŒããã£ã«ã¿ã§ããŸãã
+
+### Socket.IOã®åŠçïŒãã³ãã·ã§ã€ã¯ãããŒãããŒããã€ãã³ãïŒ
+
+Socket.IOã¯WSã®äžã«ç¬èªã®ãã¬ãŒãã³ã°ã远å ããŸããå¿
é ã®ã¯ãšãªãã©ã¡ãŒã¿ `EIO`ïŒäŸ: `EIO=4`ïŒã§æ€åºããŸããPing (`2`) ãš Pong (`3`) ã§ã»ãã·ã§ã³ãç¶æãã`"40"`ã§äŒè©±ãéå§ãããã®åŸ `42["message","hello"]` ã®ãããªã€ãã³ããemitããŸãã
+
+Intruderã®äŸ:
+```python
+import burp.api.montoya.http.message.params.HttpParameter as HttpParameter
+
+def queue_websockets(upgrade_request, message):
+connection = websocket_connection.create(
+upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4")))
+connection.queue('40')
+connection.queue('42["message","hello"]')
+
+@Pong("3")
+def handle_outgoing_message(websocket_message):
+results_table.add(websocket_message)
+
+@PingPong("2", "3")
+def handle_incoming_message(websocket_message):
+results_table.add(websocket_message)
+```
+HTTPã¢ããã¿ã®ããªã¢ã³ã:
+```python
+import burp.api.montoya.http.message.params.HttpParameter as HttpParameter
+
+def create_connection(upgrade_request):
+connection = websocket_connection.create(
+upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4")))
+connection.queue('40')
+connection.decIn()
+return connection
+
+@Pong("3")
+def handle_outgoing_message(websocket_message):
+results_table.add(websocket_message)
+
+@PingPong("2", "3")
+def handle_incoming_message(websocket_message):
+results_table.add(websocket_message)
+```
+### Socket.IOçµç±ã§ã® serverâside prototype pollution ã®æ€åº
+
+PortSwigger ã®å®å
šãªæ€åºææ³ã«åŸãã以äžã®ãã㪠payload ãéã£ãŠ Express ã®å
éšãæ±æããŠã¿ãŠãã ãã:
+```json
+{"__proto__":{"initialPacket":"Polluted"}}
+```
+ãã greetings ãæåãå€ããïŒäŸ: echo ã« "Polluted" ãå«ãŸããïŒãªãããµãŒããŒåŽã®ãããã¿ã€ããæ±æãããå¯èœæ§ãé«ãã§ãã圱é¿ã¯å°éå¯èœãªã·ã³ã¯æ¬¡ç¬¬ãªã®ã§ãNode.js ã® prototype pollution ã»ã¯ã·ã§ã³ã«ãã gadgets ãšç
§åããŠãã ãããåç
§:
+
+- Check [NodeJS â __proto__ & prototype Pollution](deserialization/nodejs-proto-prototype-pollution/README.md) for sinks/gadgets and chaining ideas.
+
+### WebSocket race conditions with Turbo Intruder
+
+ããã©ã«ãã®ãšã³ãžã³ã¯1ã€ã®æ¥ç¶ã§ã¡ãã»ãŒãžããããåŠçããŸãïŒã¹ã«ãŒãããã¯é«ãããã¬ãŒã¹æ€åºã«ã¯äžåãïŒãTHREADED ãšã³ãžã³ã䜿ããšè€æ°ã® WS æ¥ç¶ãçæããŠãã€ããŒãã䞊åéä¿¡ããããžãã¯ã¬ãŒã¹ïŒdoubleâspendãtoken reuseãstate desyncïŒãèªçºã§ããŸãããŸãã¯äŸã®ã¹ã¯ãªããããå§ãã`config()` ã§åæå®è¡æ°ã調æŽããŠãã ããã
+
+- Learn methodology and alternatives in [Race Condition](race-condition.md) (see âRC in WebSocketsâ).
+
+### WebSocket DoS: malformed frame âPing of Deathâ
+
+ãããã§éåžžã«å€§ããªãã€ããŒãé·ã宣èšãããããã£ãéããªã WS ãã¬ãŒã ãäœæããŸããããã€ãã® WS ãµãŒãã¯é·ããä¿¡çšããŠãããã¡ãäºåå²ãåœãŠããããã`Integer.MAX_VALUE` è¿ãã«èšå®ãããš OutâOfâMemory ãåŒãèµ·ããããªã¢ãŒãã® unauth DoS ãæãå¯èœæ§ããããŸããäŸã®ã¹ã¯ãªãããåç
§ããŠãã ããã
+
+### CLI and debugging
+
+- Headless fuzzing: `java -jar WebSocketFuzzer-.jar `
+- Enable the WS Logger to capture and correlate messages using internal IDs.
+- Use `inc*`/`dec*` helpers on `Connection` to tweak message ID handling in complex adapters.
+- Decorators like `@PingPong`/`@Pong` and helpers like `isInteresting()` reduce noise and keep sessions alive.
+
+### Operational safety
+
+é«ã¬ãŒãã® WS ãã¡ãžã³ã°ã¯å€æ°ã®æ¥ç¶ãéããæ¯ç§æ°åä»¶ã®ã¡ãã»ãŒãžãéä¿¡ããå¯èœæ§ããããŸããmalformed frames ãé«é »åºŠã®éä¿¡ã¯å®éã® DoS ãåŒãèµ·ããå ŽåããããŸããèš±å¯ãããç¯å²ã§ã®ã¿å®è¡ããŠãã ããã
## Cross-site WebSocket hijacking (CSWSH)
-**ã¯ãã¹ãµã€ãWebSocketãã€ãžã£ãã¯**ããŸãã¯**ã¯ãã¹ãªãªãžã³WebSocketãã€ãžã£ãã¯**ã¯ãWebSocketãã³ãã·ã§ã€ã¯ã«åœ±é¿ãäžããç¹å®ã®ã±ãŒã¹ã®**[ã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªïŒCSRFïŒ](csrf-cross-site-request-forgery.md)**ãšããŠç¹å®ãããŸãããã®è匱æ§ã¯ãWebSocketãã³ãã·ã§ã€ã¯ã**CSRFããŒã¯ã³**ãé¡äŒŒã®ã»ãã¥ãªãã£å¯Ÿçãªãã«**HTTPã¯ãããŒ**ã®ã¿ã§èªèšŒããããšãã«çºçããŸãã
+**Cross-site WebSocket hijacking**, also known as **cross-origin WebSocket hijacking**, 㯠WebSocket ãã³ãã·ã§ã€ã¯ã«åœ±é¿ãã **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** ã®ç¹å®ã®ã±ãŒã¹ãšèŠãªãããŸãããã®è匱æ§ã¯ WebSocket ãã³ãã·ã§ã€ã¯ã **HTTP cookies** ã®ã¿ã§èªèšŒããã**CSRF tokens** ãªã©ã®é¡äŒŒã®ã»ãã¥ãªãã£å¯Ÿçãååšããªãå Žåã«çºçããŸãã
-æ»æè
ã¯ãè匱ãªã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠã¯ãã¹ãµã€ãWebSocketæ¥ç¶ãéå§ãã**æªæã®ããWebããŒãž**ããã¹ãããããšã§ãããæªçšã§ããŸãããã®çµæããã®æ¥ç¶ã¯ã¢ããªã±ãŒã·ã§ã³ãšã®è¢«å®³è
ã®ã»ãã·ã§ã³ã®äžéšãšããŠæ±ãããã»ãã·ã§ã³åŠçã¡ã«ããºã ã«ãããCSRFä¿è·ã®æ¬ åŠãå©çšããŸãã
+æ»æè
ã¯è匱ãªã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠã¯ãã¹ãµã€ãã® WebSocket æ¥ç¶ãéå§ãã **malicious web page** ããã¹ãããããšã§ãããæªçšã§ããŸãããã®çµæããã®æ¥ç¶ã¯è¢«å®³è
ã®ã¢ããªã±ãŒã·ã§ã³ã«ãããã»ãã·ã§ã³ã®äžéšãšããŠæ±ãããã»ãã·ã§ã³åŠçã«ããã CSRF ä¿è·ã®æ¬ åŠãçªãããŸãã
-ãã®æ»æãæ©èœããããã®èŠä»¶ã¯æ¬¡ã®ãšããã§ãïŒ
+ãã®æ»æãæç«ããããã®æ¡ä»¶ã¯æ¬¡ã®éãã§ã:
-- WebSocketã®**èªèšŒã¯ã¯ãããŒã«åºã¥ããŠããå¿
èŠããããŸã**
-- ã¯ãããŒã¯æ»æè
ã®ãµãŒããŒããã¢ã¯ã»ã¹å¯èœã§ãªããã°ãªããïŒéåžžã¯**`SameSite=None`**ãæå³ãïŒãFirefoxã§**Firefox Total Cookie Protection**ãæå¹ã§ãªããChromeã§**ãµãŒãããŒãã£ã®ã¯ãããŒããããã¯ãããŠããªã**å¿
èŠããããŸãã
-- WebSocketãµãŒããŒã¯æ¥ç¶ã®ãªãªãžã³ããã§ãã¯ããŠã¯ãããŸããïŒãŸãã¯ããããã€ãã¹å¯èœã§ãªããã°ãªããŸããïŒ
+- websocket **authentication must be cookie based**
+- cookie ãæ»æè
ãµãŒãããã¢ã¯ã»ã¹å¯èœã§ããããšïŒé垞㯠**`SameSite=None`** ãæå³ããŸãïŒãFirefox ã§ **Firefox Total Cookie Protection** ãæå¹ã§ãªãããšãChrome ã§ **blocked third-party cookies** ããããã¯ãããŠããªãããš
+- websocket ãµãŒããæ¥ç¶ã® Origin ããã§ãã¯ããŠããªãããšïŒãŸãã¯ããããã€ãã¹å¯èœã§ããããšïŒ
-ãŸãïŒ
+Also:
-- èªèšŒãããŒã«ã«æ¥ç¶ïŒlocalhostãŸãã¯ããŒã«ã«ãããã¯ãŒã¯ãžã®æ¥ç¶ïŒã«åºã¥ããŠããå ŽåãçŸåšã®ä¿è·ããããçŠæ¢ããŠããªããããæ»æã¯**å¯èœã§ã**ïŒ[ãã¡ãã§è©³çްã確èª](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)ïŒ
+- If the authentication is based on a local connection (to localhost or to a local network) the attack **will be possible** as no current protection forbids it (check [more info here](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/))
### Simple Attack
-**WebSocket**æ¥ç¶ã**確ç«**ããéã«ã**ã¯ãããŒ**ã**ãµãŒããŒ**ã«**éä¿¡**ãããããšã«æ³šæããŠãã ããã**ãµãŒããŒ**ã¯ãéä¿¡ãããã¯ãããŒã«åºã¥ããŠå**ç¹å®ã®**ãŠãŒã¶ãŒããã®**WebSocket**ã»ãã·ã§ã³ã«**é¢é£ä»ãã**ããã«ããã䜿çšããŠããå¯èœæ§ããããŸãã
+æ¥ç¶ã**establishing**ããéã**websocket** ã®**cookie**ã¯**sent**ãããŠãµãŒãã«å±ãç¹ã«æ³šæããŠãã ããã**server** ã¯éä¿¡ããã cookie ã«åºã¥ããŠå**specific**ãª**user** ãšãã® **websocket** **session based on the sent cookie** ãé¢é£ä»ããŠããå¯èœæ§ããããŸãã
-次ã«ãäŸãã°**WebSocket**ãµãŒããŒããŠãŒã¶ãŒã®äŒè©±ã®**å±¥æŽ**ãè¿ãå Žåã**"READY"**ãšããã¡ãã»ãŒãžãéä¿¡ããããšãæ¥ç¶ã確ç«ãã**åçŽãªXSS**ïŒ**ã¯ãããŒ**ã¯è¢«å®³è
ãŠãŒã¶ãŒãèªèšŒããããã«**èªåçã«éä¿¡ãããŸã**ïŒã**"READY"**ãéä¿¡ããããšã§ã**äŒè©±ã®å±¥æŽ**ã**ååŸ**ã§ããããã«ãªããŸãã
+äŸãã°ãmsg ã« "**READY"** ãéããããš**websocket** **server** ããŠãŒã¶ã®äŒè©±å±¥æŽã **sends back the history of the conversation** ãããããªå Žåãæ¥ç¶ã確ç«ãã **simple XSS**ïŒè¢«å®³è
ãèªå¯ããããã« **cookie** 㯠**sent** **automatically** ãããŸãïŒã§ "**READY**" ã **sending** ããã°äŒè©±ã®å±¥æŽã **retrieve** ã§ããŠããŸããŸãã
```html
```
-### ã¯ãã¹ãªãªãžã³ + ç°ãªããµããã¡ã€ã³ã®ã¯ãããŒ
+### ç°ãªã subdomain ãçšãã Cross Origin + Cookie
-ãã®ããã°æçš¿ [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) ã§ã¯ãæ»æè
ã **ãµããã¡ã€ã³** ã®ãã¡ã€ã³ã§ **ä»»æã®Javascriptãå®è¡** ããããšã«æåããŸããããã㯠**ãµããã¡ã€ã³** ã§ãã£ãããã**ã¯ãããŒ** ã **éä¿¡ãã**ã**WebsocketãOriginãæ£ãããã§ãã¯ããªãã£ã** ãããéä¿¡ãå¯èœã«ãªãã**ããŒã¯ã³ãçã** ããšãã§ããŸããã
+In this blog post [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) ã§ã¯ãæ»æè
ã¯ãweb socket éä¿¡ãè¡ãããŠãããã¡ã€ã³ã®**subdomain å
ã§ä»»æã® Javascript ãå®è¡ããããšã«æåããŸãã**ãããã**subdomain**ã ã£ãããã**cookie**ã**éä¿¡ãããŠãã**ããŸã**Websocket ã Origin ãé©åã«ãã§ãã¯ããŠããªãã£ã**ãããéä¿¡ãå¯èœãšãªãããããã**tokens ãçãããšãã§ããŸãã**ã
### ãŠãŒã¶ãŒããããŒã¿ãçã
-ãªãããŸããããŠã§ãã¢ããªã±ãŒã·ã§ã³ãã³ããŒãïŒäŸãã° .html ãã¡ã€ã«ïŒãWebsocketéä¿¡ãè¡ãããŠããã¹ã¯ãªããå
ã«ãã®ã³ãŒãã远å ããŸã:
+ãªãããŸã察象㮠Web ã¢ããªã±ãŒã·ã§ã³ïŒäŸ: .html ãã¡ã€ã«ïŒãã³ããŒããwebsocket éä¿¡ãè¡ãããŠãã script å
ã«æ¬¡ã®ã³ãŒãã远å ããŸã:
```javascript
//This is the script tag to load the websocket hooker
;
@@ -148,34 +265,35 @@ xhttp.send()
return messageEvent
}
```
-`wsHook.js`ãã¡ã€ã«ã[https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook)ããããŠã³ããŒããã**ãŠã§ããã¡ã€ã«ã®ãã©ã«ãå
ã«ä¿åããŠãã ãã**ã\
-ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãå
¬éãããŠãŒã¶ãŒãããã«æ¥ç¶ããããšã§ãwebsocketãä»ããŠéä¿¡ããã³åä¿¡ãããã¡ãã»ãŒãžãçãããšãã§ããŸãã
+ãŸãã`wsHook.js` ãã¡ã€ã«ã [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) ããããŠã³ããŒããã**web ãã¡ã€ã«ãšåããã©ã«ãã«ä¿åããŠãã ãã**ã\
+ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãå
¬éããŠãŠãŒã¶ãæ¥ç¶ããããšãwebsocket çµç±ã§éåä¿¡ãããã¡ãã»ãŒãžãçãããšãã§ããŸã:
```javascript
sudo python3 -m http.server 80
```
### CSWSH Protections
-CSWSHæ»æã¯ã**ãŠãŒã¶ãŒãæªæã®ããããŒãžã«æ¥ç¶ã**ããã®ããŒãžããŠãŒã¶ãŒããã§ã«æ¥ç¶ããŠãããŠã§ãããŒãžã«**ãŠã§ããœã±ããæ¥ç¶ãéã**ãšããäºå®ã«åºã¥ããŠããããªã¯ãšã¹ãããŠãŒã¶ãŒã®ã¯ãããŒãéä¿¡ããããããŠãŒã¶ãŒãšããŠèªèšŒãããŸãã
+CSWSH æ»æã¯ã**ãŠãŒã¶ãŒãæªæã®ããããŒãžã«ã¢ã¯ã»ã¹ã**ããã®ããŒãžããŠãŒã¶ãŒãæ¢ã«æ¥ç¶ããŠãã Web ããŒãžã«å¯Ÿã㊠**websocket connection ãéã**ããªã¯ãšã¹ãããŠãŒã¶ãŒã® cookies ãéä¿¡ããããã«æ»æè
ã«ãªãããŸããŠèªèšŒã§ããŠããŸãããšããäºå®ã«åºã¥ããŠããŸãã
-çŸåšããã®åé¡ãé²ãã®ã¯éåžžã«ç°¡åã§ãïŒ
+çŸåšã§ã¯ããã®åé¡ãé²ãã®ã¯æ¯èŒçç°¡åã§ãïŒ
-- **ãŠã§ããœã±ãããµãŒããŒããªãªãžã³ããã§ãã¯ãã**: ãŠã§ããœã±ãããµãŒããŒã¯ãäºæããªãããŒãžãæ¥ç¶ããã®ãé²ãããã«ãåžžã«ãŠãŒã¶ãŒãã©ãããæ¥ç¶ããŠãããã確èªããå¿
èŠããããŸãã
-- **èªèšŒããŒã¯ã³**: èªèšŒãã¯ãããŒã«åºã¥ãããã®ã§ã¯ãªãããŠã§ããœã±ããæ¥ç¶ã¯æ»æè
ã«ã¯ç¥ãããŠããªããŠãŒã¶ãŒã®ããã«ãµãŒããŒã«ãã£ãŠçæãããããŒã¯ã³ã«åºã¥ãããšãã§ããŸãïŒäŸãã°ãanti-CSRFããŒã¯ã³ã®ããã«ïŒã
-- **SameSite Cookie屿§**: `SameSite`ã®å€ã`Lax`ãŸãã¯`Strict`ã®ã¯ãããŒã¯ãå€éšã®æ»æè
ã®ããŒãžãã被害è
ã®ãµãŒããŒã«éä¿¡ãããªããããã¯ãããŒã«åºã¥ãèªèšŒã¯æåããŸãããChromeã¯çŸåšããã®ãã©ã°ãæå®ãããŠããªãã¯ãããŒã«**`Lax`**ã®å€ãèšå®ããŠãããããã©ã«ãã§ãããããå®å
šã«ããŠããŸãããã ããã¯ãããŒãäœæãããŠããæåã®2åéã¯**`None`**ã®å€ãæã¡ããã®éãããæéäžã¯è匱ã§ãïŒãã®å¯Ÿçã¯ãã€ãåé€ãããããšãæåŸ
ãããŠããŸãïŒã
-- **Firefoxã®ããŒã¿ã«ã¯ãããŒãããã¯ã·ã§ã³**: ããŒã¿ã«ã¯ãããŒãããã¯ã·ã§ã³ã¯ãã¯ãããŒãäœæããããµã€ãã«éé¢ããããšã«ãã£ãŠæ©èœããŸããåºæ¬çã«ãåãµã€ãã«ã¯ç¬èªã®ã¯ãããŒã¹ãã¬ãŒãžããŒãã£ã·ã§ã³ãããã第äžè
ããŠãŒã¶ãŒã®ãã©ãŠãžã³ã°å±¥æŽãçµã³ã€ããã®ãé²ããŸããããã«ããã**CSWSHã¯äœ¿çšäžå¯èœ**ã«ãªããŸããæ»æè
ã®ãµã€ãã¯ã¯ãããŒã«ã¢ã¯ã»ã¹ã§ããŸããã
-- **Chromeã®ãµãŒãããŒãã£ã¯ãããŒã®ãããã¯**: ããã«ããã`SameSite=None`ã§ãã£ãŠããèªèšŒããããŠãŒã¶ãŒã®ã¯ãããŒããŠã§ããœã±ãããµãŒããŒã«éä¿¡ãããã®ãé²ãããšãã§ããŸãã
+- **Websocket server checking the origin**: websocket ãµãŒããŒã¯ãäºæããªãããŒãžããã®æ¥ç¶ãé²ãããã«ãåžžã«ã©ãããæ¥ç¶ãæ¥ãŠãããïŒOriginïŒã確èªããã¹ãã§ãã
+- **Authentication token**: èªèšŒã cookie ã«äŸåããã代ããã«ãæ»æè
ãç¥ããªããµãŒããŒçºè¡ã®ããŒã¯ã³ïŒanti-CSRF ããŒã¯ã³ã®ãããªïŒã§ websocket æ¥ç¶ãèªèšŒããæ¹æ³ã«ã§ããŸãã
+- **SameSite Cookie attribute**: `SameSite` ã `Lax` ãŸã㯠`Strict` ã«èšå®ããã cookies ã¯ãå€éšã®æ»æè
ããŒãžãã被害è
ãµãŒããŒãžéä¿¡ãããªããããcookie ããŒã¹ã®èªèšŒã¯æåããŸããããªã Chrome ã¯ãã®ãã©ã°ãæå®ãããŠããªã cookies ã«å¯ŸããŠããã©ã«ãã§ **`Lax`** ãä»äžããããå®å
šã«ããŠããŸãããã ããcookie äœæåŸæåã® 2 åéã¯å€ã **`None`** ãšãªãããã®éå®çãªæéã¯è匱ã«ãªãïŒãã®æªçœ®ã¯å°æ¥çã«å€æŽãããå¯èœæ§ããããŸãïŒã
+- **Firefox Total Cookie Protection**: Total Cookie Protection ã¯ãcookie ãäœæããããµã€ãããšã«åé¢ããããšã§æ©èœããŸããåºæ¬çã«åãµã€ãã¯èªèº«ã® cookie ä¿åé åãæã¡ããµãŒãããŒãã£ããŠãŒã¶ãŒã®é²èЧ履æŽãçµã³ã€ããããšãé²ããŸããããã«ããæ»æè
ã®ãµã€ã㯠cookies ã«ã¢ã¯ã»ã¹ã§ããªããªãã**CSWSH ã¯å©çšäžèœ**ã«ãªããŸãã
+- **Chrome third-party cookies block**: ããã `SameSite=None` ã®å Žåã§ããèªèšŒæžã¿ãŠãŒã¶ãŒã® cookie ã websocket ãµãŒããŒãžéä¿¡ãããªãããã«ããããšãã§ããŸãã
## Race Conditions
-WebSocketsã«ãããã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ãååšããŸãã[ãã®æ
å ±ã確èªããŠè©³çްãåŠãã§ãã ãã](race-condition.md#rc-in-websockets)ã
+Race Conditions in WebSockets ãååšããŸãã詳现㯠[check this information to learn more](race-condition.md#rc-in-websockets) ãåç
§ããŠãã ããã
## Other vulnerabilities
-Web Socketsã¯**ãµãŒããŒåŽãšã¯ã©ã€ã¢ã³ãåŽã«ããŒã¿ãéä¿¡ããã¡ã«ããºã **ã§ããããµãŒããŒãšã¯ã©ã€ã¢ã³ããæ
å ±ãã©ã®ããã«åŠçãããã«ãã£ãŠã**Web Socketsã¯XSSãSQLiããŸãã¯ãŠã§ãã®äžè¬çãªè匱æ§ããŠã§ããœã±ããããã®ãŠãŒã¶ãŒã®å
¥åã䜿çšããŠæªçšããããã«äœ¿çšãããå¯èœæ§ããããŸãã**
+Web Sockets ã¯ãµãŒããŒåŽããã³ã¯ã©ã€ã¢ã³ãåŽã«ããŒã¿ãéä¿¡ããä»çµã¿ã§ããããããµãŒããŒãã¯ã©ã€ã¢ã³ããæ
å ±ãã©ã®ããã«æ±ããã«ãã£ãŠãwebsocket çµç±ã®ãŠãŒã¶ãŒå
¥åãå©çšã㊠XSSãSQLiããã®ä»ã®äžè¬ç㪠web è匱æ§ãæªçšã§ããå ŽåããããŸãã
## **WebSocket Smuggling**
-ãã®è匱æ§ã«ããã**ãªããŒã¹ãããã·ã®å¶éãåé¿ãã**ããšãã§ãã**ãŠã§ããœã±ããéä¿¡ã確ç«ããã**ãšä¿¡ã蟌ãŸããããšãã§ããŸãïŒããšããããçå®ã§ãªããŠãïŒãããã«ãããæ»æè
ã¯**é ããããšã³ããã€ã³ãã«ã¢ã¯ã»ã¹ãã**ããšãã§ããå¯èœæ§ããããŸãã詳现ã«ã€ããŠã¯ã次ã®ããŒãžã確èªããŠãã ããïŒ
+ãã®è匱æ§ã«ããã**reverse proxies ã®å¶éãåé¿**ãããããã·ã«å¯Ÿã㊠**websocket communication ã確ç«ããããšä¿¡ã蟌ãŸãã**ïŒå®éã«ã¯ç¢ºç«ãããŠããªãå Žåã§ãïŒããšã§ãæ»æè
ã **é ãããšã³ããã€ã³ãã«ã¢ã¯ã»ã¹**ã§ããå¯èœæ§ããããŸããè©³çŽ°ã¯æ¬¡ã®ããŒãžãåç
§ããŠãã ããïŒ
+
{{#ref}}
h2c-smuggling.md
@@ -185,5 +303,13 @@ h2c-smuggling.md
- [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
- [https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)
+- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine)
+- [WebSocket Turbo Intruder â BApp Store](https://portswigger.net/bappstore/ba292c5982ea426c95c9d7325d9a1066)
+- [WebSocketTurboIntruder â GitHub](https://github.com/d0ge/WebSocketTurboIntruder)
+- [Turbo Intruder background](https://portswigger.net/research/turbo-intruder-embracing-the-billion-request-attack)
+- [Server-side prototype pollution â safe detection methods](https://portswigger.net/research/server-side-prototype-pollution#safe-detection-methods-for-manual-testers)
+- [WS RaceCondition PoC (Java)](https://github.com/redrays-io/WS_RaceCondition_PoC)
+- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py)
+- [PingOfDeathExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/PingOfDeathExample.py)
{{#include ../banners/hacktricks-training.md}}