HTTP Response Smuggling / Desync

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 μ§€μ›ν•˜κΈ°

이 κ²Œμ‹œλ¬Όμ˜ κΈ°μˆ μ€ λ‹€μŒ λΉ„λ””μ˜€μ—μ„œ κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€: https://www.youtube.com/watch?v=suxDcYViwao&t=1343s

HTTP μš”μ²­ λŒ€κΈ°μ—΄ 비동기화

μš°μ„ , 이 κΈ°μˆ μ€ HTTP Request Smuggling 취약점을 μ•…μš©ν•˜λ―€λ‘œ, 그것이 무엇인지 μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€:

이 기술과 일반적인 HTTP Request Smuggling의 μ£Όμš” 차이점은 ν¬μƒμžμ˜ μš”μ²­μ— 접두사λ₯Ό μΆ”κ°€ν•˜μ—¬ κ³΅κ²©ν•˜λŠ” λŒ€μ‹ , μš°λ¦¬λŠ” ν¬μƒμžκ°€ λ°›λŠ” 응닡을 μœ μΆœν•˜κ±°λ‚˜ μˆ˜μ •ν•  κ²ƒμ΄λΌλŠ” μ μž…λ‹ˆλ‹€. μ΄λŠ” HTTP Request Smuggling을 μ•…μš©ν•˜κΈ° μœ„ν•΄ 1.5개의 μš”μ²­μ„ λ³΄λ‚΄λŠ” λŒ€μ‹ , ν”„λ‘μ‹œ 응닡 λŒ€κΈ°μ—΄μ„ λΉ„λ™κΈ°ν™”ν•˜κΈ° μœ„ν•΄ 2개의 μ™„μ „ν•œ μš”μ²­μ„ λ³΄λƒ„μœΌλ‘œμ¨ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

μ΄λŠ” μš°λ¦¬κ°€ 응닡 λŒ€κΈ°μ—΄μ„ 비동기화할 수 있기 λ•Œλ¬Έμ— ν¬μƒμžμ˜ μ •λ‹Ήν•œ μš”μ²­μ˜ 응닡이 κ³΅κ²©μžμ—κ²Œ μ „μ†‘λ˜κ±°λ‚˜, ν¬μƒμžμ—κ²Œ μ‘λ‹΅ν•˜λŠ” λ‚΄μš©μ— κ³΅κ²©μžκ°€ μ œμ–΄ν•˜λŠ” μ½˜ν…μΈ λ₯Ό μ£Όμž…ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

HTTP νŒŒμ΄ν”„λΌμΈ 비동기화

HTTP/1.1은 이전 μš”μ²­μ„ 기닀리지 μ•Šκ³ λ„ λ‹€μ–‘ν•œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 쀑간에 ν”„λ‘μ‹œκ°€ μžˆλ‹€λ©΄, ν”„λ‘μ‹œμ˜ μž‘μ—…μ€ λ°±μ—”λ“œμ— μ „μ†‘λœ μš”μ²­κ³Ό κ·Έλ‘œλΆ€ν„° μ˜€λŠ” 응닡을 λ™κΈ°ν™”λœ μƒνƒœλ‘œ μœ μ§€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 응닡 λŒ€κΈ°μ—΄μ„ λΉ„λ™κΈ°ν™”ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ³΅κ²©μžκ°€ HTTP Response Smuggling 곡격을 보내고 초기 μš”μ²­κ³Ό λ°€λ°˜μž…λœ μš”μ²­μ— λŒ€ν•œ 응닡이 μ¦‰μ‹œ μ‘λ‹΅λ˜λ©΄, λ°€λ°˜μž…λœ 응닡은 ν¬μƒμžμ˜ 응닡 λŒ€κΈ°μ—΄μ— μ‚½μž…λ˜μ§€ μ•Šκ³  λ‹¨μˆœνžˆ 였λ₯˜λ‘œ νκΈ°λ©λ‹ˆλ‹€.

λ”°λΌμ„œ, λ°€λ°˜μž…λœ μš”μ²­μ΄ λ°±μ—”λ“œ μ„œλ²„μ—μ„œ μ²˜λ¦¬λ˜λŠ” 데 더 λ§Žμ€ μ‹œκ°„μ΄ 걸리도둝 ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ°€λ°˜μž…λœ μš”μ²­μ΄ 처리될 λ•Œμ―€μ—λŠ” κ³΅κ²©μžμ™€μ˜ 톡신이 μ’…λ£Œλ  κ²ƒμž…λ‹ˆλ‹€.

νŠΉμ • μƒν™©μ—μ„œ ν¬μƒμžκ°€ μš”μ²­μ„ λ³΄λƒˆκ³  λ°€λ°˜μž…λœ μš”μ²­μ΄ μ •λ‹Ήν•œ μš”μ²­λ³΄λ‹€ λ¨Όμ € μ‘λ‹΅λ˜λ©΄, λ°€λ°˜μž…λœ 응닡이 ν¬μƒμžμ—κ²Œ μ „μ†‘λ©λ‹ˆλ‹€. λ”°λΌμ„œ κ³΅κ²©μžλŠ” ν¬μƒμžκ°€ β€œμˆ˜ν–‰ν•œβ€ μš”μ²­μ„ μ œμ–΄ν•˜κ²Œ λ©λ‹ˆλ‹€.

κ²Œλ‹€κ°€, κ³΅κ²©μžκ°€ μš”μ²­μ„ μˆ˜ν–‰ν•˜κ³  ν¬μƒμž μš”μ²­μ— λŒ€ν•œ μ •λ‹Ήν•œ 응닡이 곡격자의 μš”μ²­λ³΄λ‹€ λ¨Όμ € μ‘λ‹΅λ˜λ©΄, ν¬μƒμžμ— λŒ€ν•œ 응닡이 κ³΅κ²©μžμ—κ²Œ μ „μ†‘λ˜μ–΄ ν¬μƒμžμ— λŒ€ν•œ 응닡을 ν›”μΉ˜κ²Œ λ©λ‹ˆλ‹€ (예λ₯Ό λ“€μ–΄, Set-Cookie 헀더λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€).

닀쀑 쀑첩 μ£Όμž…

일반적인 HTTP Request Smuggling과의 또 λ‹€λ₯Έ ν₯미둜운 차이점은, 일반적인 λ°€λ°˜μž… κ³΅κ²©μ—μ„œλŠ” λͺ©ν‘œκ°€ ν¬μƒμžμ˜ μš”μ²­ μ‹œμž‘ 뢀뢄을 μˆ˜μ •ν•˜μ—¬ μ˜ˆμƒμΉ˜ λͺ»ν•œ 행동을 μˆ˜ν–‰ν•˜κ²Œ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. HTTP Response Smuggling κ³΅κ²©μ—μ„œλŠ” 전체 μš”μ²­μ„ 보내기 λ•Œλ¬Έμ—, ν•˜λ‚˜μ˜ νŽ˜μ΄λ‘œλ“œμ— μˆ˜μ‹­ 개의 응닡을 μ£Όμž…ν•˜μ—¬ μˆ˜μ‹­ λͺ…μ˜ μ‚¬μš©μžλ₯Ό 비동기화할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ •λ‹Ήν•œ μ‚¬μš©μžμ—κ²Œ μˆ˜μ‹­ 개의 μ΅μŠ€ν”Œλ‘œμž‡μ„ 더 μ‰½κ²Œ 배포할 수 μžˆμ„ 뿐만 μ•„λ‹ˆλΌ, μ΄λŠ” μ„œλ²„μ— DoSλ₯Ό μœ λ°œν•˜λŠ” 데도 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΅μŠ€ν”Œλ‘œμž‡ 쑰직

μ•žμ„œ μ„€λͺ…ν•œ 바와 같이, 이 κΈ°μˆ μ„ μ•…μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ„œλ²„μ— λ°€λ°˜μž…λœ 첫 번째 λ©”μ‹œμ§€κ°€ μ²˜λ¦¬λ˜λŠ” 데 λ§Žμ€ μ‹œκ°„μ΄ 걸리도둝 ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 μ‹œκ°„ μ†Œλͺ¨ μš”μ²­μ€ μš°λ¦¬κ°€ ν¬μƒμžμ˜ 응닡을 ν›”μΉ˜λ €κ³  ν•  λ•Œ μΆ©λΆ„ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 더 λ³΅μž‘ν•œ μ΅μŠ€ν”Œλ‘œμž‡μ„ μˆ˜ν–‰ν•˜λ €λ©΄, μ΄λŠ” μ΅μŠ€ν”Œλ‘œμž‡μ˜ 일반적인 ꡬ쑰가 될 κ²ƒμž…λ‹ˆλ‹€.

μš°μ„  HTTP Request Smuggling을 μ•…μš©ν•œ 초기 μš”μ²­, κ·Έ λ‹€μŒ μ‹œκ°„ μ†Œλͺ¨ μš”μ²­, 그리고 ν¬μƒμžμ—κ²Œ 전솑될 응닡을 ν¬ν•¨ν•˜λŠ” 1개 μ΄μƒμ˜ νŽ˜μ΄λ‘œλ“œ μš”μ²­μž…λ‹ˆλ‹€.

HTTP 응닡 λŒ€κΈ°μ—΄ 비동기화 μ•…μš©

λ‹€λ₯Έ μ‚¬μš©μžμ˜ μš”μ²­ 캑처

HTTP Request Smuggling의 μ•Œλ €μ§„ νŽ˜μ΄λ‘œλ“œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, ν¬μƒμžμ˜ μš”μ²­μ„ ν›”μΉ  수 μžˆμŠ΅λ‹ˆλ‹€. ν•œ κ°€μ§€ μ€‘μš”ν•œ 차이점은: 이 경우 응닡에 반영될 μ½˜ν…μΈ λ₯Ό λ³΄λ‚΄κΈ°λ§Œ ν•˜λ©΄ 되며, 지속적인 μ €μž₯μ†Œκ°€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ¨Όμ €, κ³΅κ²©μžλŠ” 반영된 λ§€κ°œλ³€μˆ˜λ₯Ό ν¬ν•¨ν•œ μ΅œμ’… POST μš”μ²­μ„ ν¬ν•¨ν•˜λŠ” νŽ˜μ΄λ‘œλ“œλ₯Ό 보내고, 큰 Content-Lengthλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

그런 λ‹€μŒ, 초기 μš”μ²­(νŒŒλž€μƒ‰)이 처리되고 수면 쀑인 μš”μ²­μ΄ μ²˜λ¦¬λ˜λŠ” λ™μ•ˆ(λ…Έλž€μƒ‰) ν¬μƒμžλ‘œλΆ€ν„° λ„μ°©ν•˜λŠ” λ‹€μŒ μš”μ²­μ΄ 반영된 λ§€κ°œλ³€μˆ˜ λ°”λ‘œ 뒀에 λŒ€κΈ°μ—΄μ— μΆ”κ°€λ©λ‹ˆλ‹€:

κ·Έ ν›„, ν¬μƒμžλŠ” 수면 쀑인 μš”μ²­μ— λŒ€ν•œ 응닡을 λ°›κ²Œ 되고, κ·Έ 사이에 κ³΅κ²©μžκ°€ 또 λ‹€λ₯Έ μš”μ²­μ„ λ³΄λƒˆλ‹€λ©΄, 반영된 μ½˜ν…μΈ  μš”μ²­μ˜ 응닡이 κ·Έμ—κ²Œ μ „μ†‘λ©λ‹ˆλ‹€.

응닡 비동기화

μ§€κΈˆκΉŒμ§€ μš°λ¦¬λŠ” HTTP Request Smuggling 곡격을 μ•…μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 받을 응닡을 μ œμ–΄ν•˜λŠ” 방법과, κ·Έ ν›„ ν¬μƒμžλ₯Ό μœ„ν•œ 응닡을 ν›”μΉ˜λŠ” 방법을 λ°°μ› μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ—¬μ „νžˆ 응닡을 더 비동기화할 수 μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€.

HEAD μš”μ²­κ³Ό 같은 ν₯미둜운 μš”μ²­μ΄ 있으며, μ΄λŠ” 응닡 본문에 아무 μ½˜ν…μΈ λ„ ν¬ν•¨ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λ©°, GET μš”μ²­μΈ κ²ƒμ²˜λŸΌ μš”μ²­μ˜ Content-Lengthλ₯Ό 포함해야 ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ κ³΅κ²©μžκ°€ HEAD μš”μ²­μ„ μ£Όμž…ν•˜λ©΄, λ‹€μŒκ³Ό 같은 이미지와 같이:

그런 λ‹€μŒ, νŒŒλž€μƒ‰ μš”μ²­μ΄ κ³΅κ²©μžμ—κ²Œ μ‘λ‹΅λ˜λ©΄, λ‹€μŒ ν¬μƒμžμ˜ μš”μ²­μ΄ λŒ€κΈ°μ—΄μ— μΆ”κ°€λ©λ‹ˆλ‹€:

κ·Έ ν›„, ν¬μƒμžλŠ” HEAD μš”μ²­μ˜ 응닡을 λ°›κ²Œ 되며, μ΄λŠ” Content-LengthλŠ” ν¬ν•¨ν•˜μ§€λ§Œ μ½˜ν…μΈ λŠ” μ „ν˜€ ν¬ν•¨ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ ν”„λ‘μ‹œλŠ” 이 응닡을 ν¬μƒμžμ—κ²Œ μ „μ†‘ν•˜μ§€ μ•Šκ³ , μ–΄λ–€ μ½˜ν…μΈ λ₯Ό κΈ°λ‹€λ¦¬κ²Œ 되며, μ΄λŠ” μ‹€μ œλ‘œ λ…Έλž€μƒ‰ μš”μ²­μ— λŒ€ν•œ 응닡이 될 κ²ƒμž…λ‹ˆλ‹€(κ³΅κ²©μžκ°€ μ£Όμž…ν•œ):

μ½˜ν…μΈ  ν˜Όλž€

이전 예제λ₯Ό 따라, ν¬μƒμžκ°€ 받을 μ‘λ‹΅μ˜ 본문을 μ œμ–΄ν•  수 있고, HEAD 응닡이 일반적으둜 Content-Typeκ³Ό Content-Lengthλ₯Ό 헀더에 ν¬ν•¨ν•œλ‹€λŠ” 것을 μ•Œκ³  μžˆλ‹€λ©΄, λ‹€μŒκ³Ό 같은 μš”μ²­μ„ λ³΄λ‚΄μ„œ ν¬μƒμžμ—κ²Œ XSSλ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. νŽ˜μ΄μ§€κ°€ XSS에 μ·¨μ•½ν•˜μ§€ μ•Šλ”λΌλ„:

μΊμ‹œ μ˜€μ—Ό

이전에 μ–ΈκΈ‰ν•œ 응닡 비동기화 μ½˜ν…μΈ  ν˜Όλž€ 곡격을 μ•…μš©ν•˜μ—¬, μΊμ‹œκ°€ ν¬μƒμžκ°€ μˆ˜ν–‰ν•œ μš”μ²­μ— λŒ€ν•œ 응닡을 μ €μž₯ν•˜κ³  이 응닡이 XSSλ₯Ό μœ λ°œν•˜λŠ” μ£Όμž…λœ 것이라면, μΊμ‹œλŠ” μ˜€μ—Όλ©λ‹ˆλ‹€.

XSS νŽ˜μ΄λ‘œλ“œλ₯Ό ν¬ν•¨ν•œ μ•…μ˜μ μΈ μš”μ²­:

응닡을 μ €μž₯ν•˜λΌλŠ” 헀더λ₯Ό ν¬ν•¨ν•œ ν¬μƒμžμ— λŒ€ν•œ μ•…μ˜μ μΈ 응닡:

Warning

이 경우 β€œν¬μƒμžβ€œκ°€ 곡격자라면, κ·ΈλŠ” 이제 μ•…μ˜μ μΈ μ‘λ‹΅μœΌλ‘œ μΊμ‹œλ  URL을 μ œμ–΄ν•  수 μžˆμœΌλ―€λ‘œ μž„μ˜μ˜ URLμ—μ„œ μΊμ‹œ μ˜€μ—Όμ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ›Ή μΊμ‹œ 기만

이 곡격은 이전 곡격과 μœ μ‚¬ν•˜μ§€λ§Œ, μΊμ‹œμ— νŽ˜μ΄λ‘œλ“œλ₯Ό μ£Όμž…ν•˜λŠ” λŒ€μ‹  κ³΅κ²©μžλŠ” μΊμ‹œ 내에 ν¬μƒμž 정보λ₯Ό μ €μž₯ν•  κ²ƒμž…λ‹ˆλ‹€:

응닡 λΆ„ν• 

이 곡격의 λͺ©ν‘œλŠ” λ‹€μ‹œ 응닡 비동기화λ₯Ό μ•…μš©ν•˜μ—¬ ν”„λ‘μ‹œκ°€ 100% κ³΅κ²©μžκ°€ μƒμ„±ν•œ 응닡을 μ „μ†‘ν•˜κ²Œ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€.

이λ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ κ³΅κ²©μžλŠ” 응닡 λ‚΄μ—μ„œ 일뢀 값을 λ°˜μ˜ν•˜λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ—”λ“œν¬μΈνŠΈλ₯Ό μ°Ύμ•„μ•Ό ν•˜λ©°, HEAD μ‘λ‹΅μ˜ μ½˜ν…μΈ  길이λ₯Ό μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€.

κ·ΈλŠ” λ‹€μŒκ³Ό 같은 μ΅μŠ€ν”Œλ‘œμž‡μ„ 보낼 κ²ƒμž…λ‹ˆλ‹€:

첫 번째 μš”μ²­μ΄ ν•΄κ²°λ˜κ³  κ³΅κ²©μžμ—κ²Œ μ „μ†‘λœ ν›„, ν¬μƒμžμ˜ μš”μ²­μ΄ λŒ€κΈ°μ—΄μ— μΆ”κ°€λ©λ‹ˆλ‹€:

ν¬μƒμžλŠ” **HEAD 응닡 + 두 번째 μš”μ²­ μ‘λ‹΅μ˜ μ½˜ν…μΈ (반영된 λ°μ΄ν„°μ˜ 일뢀 포함)**을 μ‘λ‹΅μœΌλ‘œ λ°›κ²Œ λ©λ‹ˆλ‹€:

κ·ΈλŸ¬λ‚˜ 반영된 데이터가 HEAD μ‘λ‹΅μ˜ Content-Length에 따라 크기가 μ‘°μ •λ˜μ–΄ 응닡 λŒ€κΈ°μ—΄μ—μ„œ μœ νš¨ν•œ HTTP 응닡을 μƒμ„±ν–ˆλ‹€λŠ” 점에 μœ μ˜ν•˜μ‹­μ‹œμ˜€.

λ”°λΌμ„œ 두 번째 ν¬μƒμžμ˜ λ‹€μŒ μš”μ²­μ€ κ³΅κ²©μžκ°€ μ™„μ „νžˆ μ œμž‘ν•œ 응닡을 λ°›κ²Œ λ©λ‹ˆλ‹€. 응닡이 κ³΅κ²©μžμ— μ˜ν•΄ μ™„μ „νžˆ μ œμž‘λ˜μ—ˆκΈ° λ•Œλ¬Έμ—, κ·ΈλŠ” λ˜ν•œ ν”„λ‘μ‹œκ°€ 응닡을 μΊμ‹œν•˜λ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

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 μ§€μ›ν•˜κΈ°