About HTTP Smuggling (CL.TE, TE.CL, TE.TE, CL.0, H2.CL …) and Smuggling example
🚷

About HTTP Smuggling (CL.TE, TE.CL, TE.TE, CL.0, H2.CL …) and Smuggling example

Lecture
Security
νƒœκ·Έ
webhacking
ꡐ윑
μ›Ήν•΄ν‚Ή
CVE
public
O
μ™„μ„±
90%
생성일
Jun 2, 2024 01:46 PM
LectureName
Web Hacking
Β 

1. Background ( Content-Length / Transfer-Encoding: chunked )


1.1 Content-Length

κ°œλ…
Content-Length ν—€λ”λŠ” HTTP 응닡 λ˜λŠ” μš”μ²­μ˜ λ³Έλ¬Έ 길이λ₯Ό λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„λŠ” 이 값을 톡해 데이터λ₯Ό 전솑할 λ•Œ μ–΄λ””κΉŒμ§€ 읽어야 ν•˜λŠ”μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
보톡 전솑할 λ°μ΄ν„°μ˜ 전체 크기λ₯Ό 미리 μ•Œκ³  μžˆμ„ λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 헀더에 이 값이 ν¬ν•¨λ˜λ©΄, ν΄λΌμ΄μ–ΈνŠΈλŠ” λ³Έλ¬Έ 데이터λ₯Ό μ •ν™•νžˆ κ·Έ 길이만큼 μ½μŠ΅λ‹ˆλ‹€.
Β 
Β 
μ‚¬μš©
  • 정적 μ½˜ν…μΈ  전솑: HTML 파일, 이미지, λΉ„λ””μ˜€ λ“±μ˜ 정적 νŒŒμΌμ„ 전솑할 λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 파일의 ν¬κΈ°λŠ” 전솑 전에 미리 μ•Œ 수 μžˆμœΌλ―€λ‘œ Content-Lengthλ₯Ό μ‚¬μš©ν•΄ 파일 크기λ₯Ό λͺ…μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 단일 μš”μ²­/응닡 데이터: μš”μ²­μ΄λ‚˜ μ‘λ‹΅μ˜ 데이터 크기가 고정적이고 미리 μ•Œ 수 μžˆλŠ” κ²½μš°μ— μ‚¬μš©λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 정적 μ›Ή νŽ˜μ΄μ§€λ₯Ό μ œκ³΅ν•˜λŠ” κ²½μš°μ— μ ν•©ν•©λ‹ˆλ‹€.
Β 
Β 
μ˜ˆμ‹œ
예λ₯Ό λ“€μ–΄ abcdef λΌλŠ” λ¬Έμžμ—΄μ„ λ³΄λ‚Όλ•Œμ—λŠ” byteκ°€ 6이기 λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같이 μ „μ†‘λ©λ‹ˆλ‹€.
POST /somewhere HTTP/1.1 Content-Type: ~ Content-Length: 6 abcdef
Β 
Β 
Β 
Β 
Β 
Β 

1.2 Transfer-Encoding: chunked

κ°œλ…
Transfer-Encoding: chunkedλŠ” HTTP/1.1μ—μ„œ λ„μž…λœ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ, 데이터가 μΌμ •ν•œ 크기의 청크(chunk)둜 λ‚˜λ‰˜μ–΄ μ „μ†‘λ©λ‹ˆλ‹€. 각 μ²­ν¬λŠ” 자체적으둜 크기λ₯Ό κ°€μ§€κ³  있으며, ν΄λΌμ΄μ–ΈνŠΈλŠ” 각 청크의 길이λ₯Ό 읽은 λ‹€μŒ ν•΄λ‹Ή 청크 데이터λ₯Ό μ½μŠ΅λ‹ˆλ‹€.
chunked 전솑 인코딩은 λ°μ΄ν„°μ˜ 총 크기λ₯Ό 미리 μ•Œ 수 μ—†λŠ” κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€. 각 청크의 끝은 0 크기의 청크둜 ν‘œμ‹œλ˜μ–΄ λ°μ΄ν„°μ˜ 끝을 μ•Œλ¦½λ‹ˆλ‹€.
Β 
Β 
μ‚¬μš© 상황
  • 동적 μ½˜ν…μΈ  전솑: λ°μ΄ν„°μ˜ 크기λ₯Ό 미리 μ•Œ 수 μ—†λŠ” 경우, 예λ₯Ό λ“€μ–΄, μ‹€μ‹œκ°„μœΌλ‘œ μƒμ„±λ˜λŠ” λ°μ΄ν„°λ‚˜ 슀트리밍 μ½˜ν…μΈ λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 데이터 생성 μ‹œκ°„μ΄ κΈ΄ 경우: μ„œλ²„κ°€ 데이터 생성에 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” κ²½μš°μ—λ„ μœ μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λŒ€ν˜• λ³΄κ³ μ„œ 생성과 같은 μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ 기닀리지 μ•Šκ³ , λΆ€λΆ„μ μœΌλ‘œ μƒμ„±λœ 데이터λ₯Ό λ°”λ‘œ 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.
Β 
Β 
μ˜ˆμ‹œ
POST /somewhere HTTP/1.1 Content-Type: ~ Transfer-Encoding: chunked 6\r\n abcdef\r\n 0\r\n \r\n
  • μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 데이터 전솑 μ’…λ£Œ λΆ€λΆ„μ—μ„œ 0\r\n\r\n을 λ³΄λ‚Έλ‹€λŠ” 것 μž…λ‹ˆλ‹€.
Β 
Β 
Β 
Β 
Β 
Β 

1.3 취약점 λ“±μž₯ λ°°κ²½

μ΅œκ·Όμ—λŠ” ν”„λ‘ νŠΈ/λ°±μ—”λ“œ μ„œλ²„λ‘œ λ‚˜λˆ„μ–΄μ„œ ν™˜κ²½μ„ κ΅¬μΆ•ν•˜κ±°λ‚˜, λŒ€μš©λŸ‰ νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•˜λŠ” 경우 λ‘œλ“œ λ°ΈλŸ°μ‹±μ„ 톡해 νŠΈλž˜ν”½μ„ λΆ„μ‚°ν•˜λŠ” λ“± λ‹€μ–‘ν•œ μ„œλ²„ ꡬ좕 ν™˜κ²½μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. μ΄λ•Œ νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ 미듀웨어와 μ—”λ“œμ„œλ²„μ˜ 데이터 전솑을 λ°›μ•„λ“€μ΄λŠ” 방식이 λ‹€λ₯΄λ©΄ Smuggling 취약점이 λ°œμƒν•©λ‹ˆλ‹€.
notion image
Β 
Β 
Β 
πŸ’‘
μ‹œμž‘ν•˜κΈ° μ „
ν•΄λ‹Ή 글을 μ‹œμž‘ν•˜κΈ° 전에 μš©μ–΄κ°€ ν—·κ°ˆλ¦΄ 수 μžˆμ–΄ μ •λ¦¬ν•˜κ² μŠ΅λ‹ˆλ‹€.
미듀웨어 == λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ, ν”„λ‘ νŠΈμ—”λ“œ μ„œλ²„ λ“±λ“± 쀑간지점
μ—”λ“œμ„œλ²„ == λ°±μ—”λ“œ μ„œλ²„
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

2. HTTP Smuggling (HTTP 1.1)


HTTP Smugglingμ—μ„œ Smuggling은 λ°€μˆ˜ λΌλŠ” λœ»μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 미듀웨어와 μ—”λ“œμ„œλ²„μ—μ„œ 데이터 전솑 방식을 λ‹€λ₯΄κ²Œ 받아듀일 경우 λ°œμƒν•˜λŠ” 취약점 으둜 λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€. 결과적으둜 μ—”λ“œμ„œλ²„ μ†ŒμΌ“μ—μ„œ λ°€μˆ˜ 된 데이터가 남아 두 번째 νŒ¨ν‚·κ³Ό κ²°ν•©ν•˜μ—¬ λ°œμƒν•˜λŠ” 취약점 μž…λ‹ˆλ‹€.
Β 
Smuggling μœ ν˜•
μ—¬κΈ°μ„œ CL은 Content-Length이고 TEλŠ” Transfer-Encoding μž…λ‹ˆλ‹€. CLκ³Ό TE의 μˆœμ„œκ°€ μ€‘μš”ν•˜λ©°, ν•΄λ‹Ή μœ ν˜•μ„ 기초둜 ν•˜μ—¬ λ‹€μ–‘ν•œ 방법을 ν†΅ν•œ Smuggling을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • CL-CL
  • CL-TE
  • TE-CL
  • TE-TE
  • CL.0
Β 
CL-CL은 보톡 400 μƒνƒœ μ½”λ“œλ₯Ό μ‘λ‹΅ν•¨μœΌλ‘œ, ν•΄λ‹Ή 곡격을 μ œμ™Έν•˜κ³  μ„œμˆ ν•˜κ² μŠ΅λ‹ˆλ‹€. ( 읽닀 보면 CL-CL도 μžμ—°μŠ€λŸ½κ²Œ μ•Œκ²Œ λ˜μ‹­λ‹ˆλ‹€. )
Β 
Β 
Β 
Β 

2.1 CL-TE

미듀웨어가 CL(Content-Length)을, μ—”λ“œμ„œλ²„κ°€ TE(Transfer-Encoding) 헀더 ν˜•μ‹μœΌλ‘œ 데이터 전솑을 지원할 λ•Œ 취약점이 λ°œμƒν•©λ‹ˆλ‹€.
Β 
μ˜ˆμ‹œλ‘œ μ–΄λ–€ μ‚¬μ΄νŠΈμ— CL-TE 곡격을 μˆ˜ν–‰ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. Content-Lengthλ₯Ό μ§€μ›ν•˜λŠ” 미듀웨어에 Content-Length와 Transfer-Encoding헀더λ₯Ό λ‘˜ λ‹€ μž‘μ„±ν•©λ‹ˆλ‹€.
notion image
  • ν”„λ‘ νŠΈμ—”λ“œλŠ” CL을 μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— POST데이터 길이인 35만큼 데이터λ₯Ό λ°›μ•„λ“€μž…λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ Transfer-Encoding을 μ§€μ›ν•˜λŠ” μ—”λ“œ μ„œλ²„λŠ” μ–΄λ–¨κΉŒμš”?
Β 
Β 
λ‹€μŒκ³Ό 같이 두 μ„œλ²„κ°€ ν•œκ°œμ˜ μš”μ²­μ— λ‹€λ₯Έ 해석을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. CL은 미듀웨어(λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ, ν˜Ήμ€ 제 1μ„œλ²„)κ°€ 해석할 λ²”μœ„μ΄κ³ , TEλŠ” μ—”λ“œμ„œλ²„(λ°±μ—”λ“œ μ„œλ²„)κ°€ 해석할 λ²”μœ„μž…λ‹ˆλ‹€.
notion image
  • μ—”λ“œμ„œλ²„λŠ” 0\r\n\r\n을 λ§ˆμ§€λ§‰μœΌλ‘œ νŒ¨ν‚·μ΄ μ’…λ£Œλ˜μ—ˆλ‹€κ³  νŒλ‹¨ν•©λ‹ˆλ‹€.
  • μ΄λ ‡κ²Œ 되면 0\r\n\r\n μ΄ν›„μ˜ λ°μ΄ν„°λŠ” μ’…λ£Œλ˜μ§€ μ•Šμ€ μ—”λ“œμ„œλ²„μ˜ μ†ŒμΌ“μ— λ°μ΄ν„°λ‘œ λ‚¨κ²Œ λ©λ‹ˆλ‹€.
Β 
Β 
πŸ”Ž 첫 번째 μš”μ²­ 도식화
notion image
  1. ν΄λΌμ΄μ–ΈνŠΈ(곡격자)λŠ” Smuggling νŽ˜μ΄λ‘œλ“œκ°€ λ‹΄κΈ΄ νŒ¨ν‚·μ„ 미듀웨어에 μ „λ‹¬ν•©λ‹ˆλ‹€.
  1. λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” νŒ¨ν‚·μ— 이상이 μ—†κΈ° λ•Œλ¬Έμ— λ°±μ—”λ“œ μ„œλ²„λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.
  1. μ„œλ²„λŠ” Transfer-Encoding 헀더 ν˜•μ‹μ— 따라 0\r\n\r\n κΉŒμ§€λ§Œ νŒ¨ν‚·μ„ λ°›μ•„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  1. μ²˜λ¦¬λ˜μ§€ μ•Šμ€ smuggling νŽ˜μ΄λ‘œλ“œλŠ” μ—”λ“œ μ„œλ²„ μ†ŒμΌ“μ— λ‚¨μ•„μžˆκ²Œ λ©λ‹ˆλ‹€.
Β 
Β 
그럼 두 번째 μš”μ²­μ—λŠ” μ–΄λ–€ 응닡이 λ‹΄κ²¨μ˜¬κΉŒμš”?
두 번째 νŒ¨ν‚·μž…λ‹ˆλ‹€.
notion image
  • smuggling 곡격이 μ„±κ³΅ν•˜μ—¬ 404 Error을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
Β 
Β 
πŸ”Ž 두 번째 μš”μ²­ 도식화
notion image
  1. ν΄λΌμ΄μ–ΈνŠΈ(곡격자)의 μš”μ²­ νŒ¨ν‚·μ΄ 미듀웨어λ₯Ό 거쳐 λ°±μ—”λ“œ μ„œλ²„κΉŒμ§€ λ„λ‹¬ν•©λ‹ˆλ‹€.
  1. λ°±μ—”λ“œ μ„œλ²„μ—μ„œλŠ” μ²˜λ¦¬λ˜μ§€ λͺ»ν•œ smuggling νŽ˜μ΄λ‘œλ“œ + 두 번째 μš”μ²­ νŒ¨ν‚·μ΄ κ²°ν•©λ˜κ³ , μ„œλ²„μ—μ„œλŠ” κ²°ν•©λœ νŒ¨ν‚·μ„ μ²˜λ¦¬ν•˜μ—¬ μ‘λ‹΅ν•©λ‹ˆλ‹€.
  1. κ²°ν•©λœ νŒ¨ν‚·μ€ μ„œλ²„κ°€ ν•΄μ„ν•˜κΈ°μ— /404 경둜둜 μš”μ²­ν•˜λŠ” 것에 λŒ€ν•œ 응닡을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. (μ—†λŠ” μ›Ήμ‚¬μ΄νŠΈμ— μš”μ²­ν•˜κΈ° λ•Œλ¬Έμ— Not Found 데이터가 μ‘λ‹΅λ©λ‹ˆλ‹€.)
Β 
Β 
πŸ’‘
그럼 μ–΄λ–€ 영ν–₯을 끼칠 수 μžˆμ„κΉŒμš”?
  1. κ³΅κ²©μžκ°€ μš”μ²­μ„ 두 번 μˆ˜ν–‰ν•˜μ—¬ μ ‘κ·Όν•  수 μ—†λŠ” 경둜둜 μ ‘κ·Όν•˜κ±°λ‚˜
  1. 곡격 이후 μš”μ²­λœ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ˜€μ—Ό μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
Β 
Β 
Β 
Β 
Β 

2.2 TE-CL

μ—”λ“œμ„œλ²„κ°€ CL(Content-Length)을, 미듀웨어가 TE(Transfer-Encoding) 헀더 ν˜•μ‹μœΌλ‘œ 데이터 전솑을 지원할 λ•Œ 취약점이 λ°œμƒν•©λ‹ˆλ‹€.
Β 
μ˜ˆμ‹œλ‘œ μ–΄λ–€ μ‚¬μ΄νŠΈμ— TE-CL 곡격을 μˆ˜ν–‰ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.
notion image
  • 0 μ΄μ „κΉŒμ§€μ˜ 길이λ₯Ό μΈ‘μ •ν•©λ‹ˆλ‹€. (5e)
  • 버프λ₯Ό μ“°λŠ” 경우 0 μ΄μ „κΉŒμ§€μ˜ 데이터λ₯Ό λ“œλž˜κ·Έλ‘œ 긁으면 μ˜†μ— hex값이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
  • 5eλŠ” 길이의 hexκ°’ μž…λ‹ˆλ‹€.
Β 
Β 
λ‹€μŒκ³Ό 같이 두 μ„œλ²„κ°€ ν•œκ°œμ˜ μš”μ²­μ— λ‹€λ₯Έ 해석을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. TEλŠ” 미듀웨어(λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ, ν˜Ήμ€ 제 1μ„œλ²„)κ°€ 해석할 λ²”μœ„μ΄κ³ , CLλŠ” μ—”λ“œμ„œλ²„(λ°±μ—”λ“œ μ„œλ²„)κ°€ 해석할 λ²”μœ„μž…λ‹ˆλ‹€.
notion image
  • 처음 ν”„λ‘μ‹œ(TE)λŠ” 0\r\n\r\n μ΄μ „κΉŒμ§€μ˜ 데이터λ₯Ό μ „λΆ€ bodyκ°’μœΌλ‘œ 보고 λ°±μ•€λ“œ μ„œλ²„(CL)둜 λ„˜κΈ°κ²Œ λ©λ‹ˆλ‹€.
  • CL은 Content-Lengthκ°€ 4 μž„μœΌλ‘œ, 5eλ₯Ό μ œμ™Έν•œ λ°μ΄ν„°λŠ” 읽지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ΄λ ‡κ²Œ 남은 λ°μ΄ν„°λŠ” μ„œλ²„μ˜ μ†ŒμΌ“μ— μž”μ—¬ λ°μ΄ν„°λ‘œ λ‚¨κ²Œ λ©λ‹ˆλ‹€.
Β 
Β 
πŸ’‘
μ™œ Content-Lengthκ°€ 4둜 μΈ‘μ •λ˜λ‚˜μš”? β†’ (λ°”μ΄νŠΈ)
  • 5
  • e
  • \r
  • \n
Β 
πŸ”Ž 첫 번째 μš”μ²­ 도식화
notion image
  1. ν΄λΌμ΄μ–ΈνŠΈ(곡격자)λŠ” 미듀웨어(ν”„λ‘μ‹œ)μ—κ²Œ Smuggling νŽ˜μ΄λ‘œλ“œκ°€ λ‹΄κΈ΄ POST μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€.
  1. λ―Έλ“€μ›¨μ–΄λŠ” TE둜 νŒλ‹¨ν•˜κ³  정상 νŒ¨ν‚·μœΌλ‘œ κ°„μ£Ό, λ°±μ—”λ“œ μ„œλ²„λ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.
  1. λ°±μ—”λ“œ μ„œλ²„λŠ” CL둜 νŒλ‹¨ν•˜κ³  TE ν˜•μ‹μ—μ„œ λ°μ΄ν„°μ˜ 길이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 5EκΉŒμ§€λ§Œ Body둜 νŒλ‹¨ν•©λ‹ˆλ‹€.
  1. μ΄λ ‡κ²Œ 5E 뒀에 μžˆλŠ” Smuggling νŒ¨ν‚·μ€ μž”μ—¬ λ°μ΄ν„°λ‘œ μ†ŒμΌ“μ— λ‚¨μ•„μžˆκ²Œ λ©λ‹ˆλ‹€.
Β 
Β 
두 번째 νŒ¨ν‚·μž…λ‹ˆλ‹€.
CL-TE와 λ§ˆμ°¬κ°€μ§€λ‘œ, μ†ŒμΌ“μ— λ‚¨μ•„μžˆλ˜ 데이터와 두 번째 νŒ¨ν‚·μ΄ 합쳐져 /404νŽ˜μ΄μ§€λ‘œ μš”μ²­ν•œ 것에 λŒ€ν•œ 응닡이 였게 λ©λ‹ˆλ‹€.
notion image
Β 
Β 
πŸ”Ž 두 번째 μš”μ²­ 도식화
notion image
  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ 두 번째 νŒ¨ν‚· 전솑
  1. 미듀웨어 β†’ μ—”λ“œ μ„œλ²„ νŒ¨ν‚· 전솑
  1. μ—”λ“œμ„œλ²„ μ†ŒμΌ“μ— λ‚¨μ•„μžˆλ˜ μž”μ—¬ 데이터 + λ‘λ²ˆμ§Έ νŒ¨ν‚·μ΄ κ²°ν•©ν•΄μ„œ κ³΅κ²©μžκ°€ μ˜λ„ν•œ μš”μ²­ 생성(/404)
  1. μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ /404 경둜둜 μš”μ²­ν•œ 것에 λŒ€ν•œ 응닡을 λ°˜ν™˜λ©λ‹ˆλ‹€.
Β 
Β 
Β 
Β 
Β 
Β 

3.3 TE.TE

같은 Body 처리 방식(Transfer-Encoding)을 μ‚¬μš©ν•΄λ„ 취약점이 λ°œμƒν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. Transfer-Encoding 헀더λ₯Ό λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ λ‚œλ…ν™” ν˜Ήμ€ μ‘°μž‘ν•˜μ—¬, 미듀웨어 ν˜Ήμ€ μ—”λ“œμ„œλ²„ λ‘˜μ€‘ ν•˜λ‚˜κ°€ 처리λ₯Ό ν•˜μ§€ μ•Šκ²Œ ν•˜λ©΄λ©λ‹ˆλ‹€.
Β 
πŸ”Ž μ˜ˆμ‹œλ‘œ λ‹€μŒκ³Ό 같은 νŒ¨ν‚·μ„ 전달해 λ³΄κ² μŠ΅λ‹ˆλ‹€.
POST / HTTP/1.1 Content-Type: application/x-url-form-encoded Content-Length: 4 Transfer-Encoding: chunked Transfer-Encoding: wtf 5c GPOST / HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 15 x=1 0
Β 
Β 
ν”„λ‘ νŠΈμ—”λ“œ μ„œλ²„λŠ” Transfer-Encoding: wtfλ₯Ό 보고 μ˜¬λ°”λ₯΄μ§€ μ•Šλ‹€κ³  μƒκ°ν•˜μ—¬ Content-Length으둜 ν•΄λ‹Ή Body 데이터λ₯Ό νŒŒμ‹±ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ 되면 CL.TE 취약점이 λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.
λ‹€λ₯Έ 점은, 미듀웨어와 μ—”λ“œμ„œλ²„κ°€ CLκ³Ό TEλ₯Ό λͺ¨λ‘ νŒŒμ‹± ν•˜μ§€λ§Œ, ν”„λ‘ νŠΈμ—”λ“œμ—μ„œλŠ” Transfer-Encoding: wtfλ₯Ό μ΄μƒν•˜λ‹€κ³  νŒλ‹¨ν•˜μ—¬ Content-Length 둜 νŒŒμ‹±ν•œ 것 μž…λ‹ˆλ‹€.
notion image
Β 
Β 
Content-Lengthλ₯Ό μ •μƒμ μœΌλ‘œ μ£Όμ—ˆμ„ λ•ŒλŠ” 문제 없이 λ™μž‘ν•©λ‹ˆλ‹€.
notion image
Β 
Β 
이런 μ‹μœΌλ‘œ TEλ₯Ό λ‚œλ…ν™”ν•˜μ—¬ μ„œλ²„ 쀑 ν•˜λ‚˜κ°€ 헀더λ₯Ό μ²˜λ¦¬ν•˜μ§€ μ•Šλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 개의 μ„œλ²„ 쀑 ν•œ 개의 μ„œλ²„λ§Œ TE 헀더λ₯Ό μ²˜λ¦¬ν•˜μ§€ μ•Šκ²Œ 되면 λ‚˜λ¨Έμ§€ 과정은 기쑴의 CL.TE, TE.CL 취약점과 κ°™μŠ΅λ‹ˆλ‹€.
Β 
πŸ€ͺ λ‚œλ…ν™” μ’…λ₯˜
Transfer-Encoding: xchunked Transfer-Encoding : chunked Transfer-Encoding: chunked Transfer-Encoding: x Transfer-Encoding:[tab]chunked [space]Transfer-Encoding: chunked X: X[\n]Transfer-Encoding: chunked Transfer-Encoding : chunked
Β 
Β 
Β 
Β 
Β 

2.4 CL.0

CL.0은 λ―Έλ“€μ›¨μ–΄μ—μ„œλŠ” CL을 μ²˜λ¦¬ν•˜μ§€λ§Œ μ—”λ“œμ„œλ²„μ—μ„œλŠ” CL을 μ²˜λ¦¬ν•˜μ§€ μ•Šμ„ 경우 λ°œμƒν•˜λŠ” 취약점 μž…λ‹ˆλ‹€.
동일 TCP Connectionμ—μ„œ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— 헀더에 Connection: keep-aliveκ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. (ν˜Ήμ€ 버프 섀정을 λ§Œμ§€λ‹€ 보면 μžλ™μœΌλ‘œ μš”μ²­ μ‹œ λΆ™μ—¬μ£ΌλŠ” 것 같기도 ν•©λ‹ˆλ‹€.)
Β 
μ˜ˆμ‹œλ‘œ 미듀웨어 μ—μ„œλŠ” Content-Length: 30을 ν•΄μ„ν•˜κΈ° λ•Œλ¬Έμ— 문제 없이 μž‘λ™ν•©λ‹ˆλ‹€.
notion image
  • ν•˜μ§€λ§Œ ν•΄λ‹Ή μš”μ²­μ€ μ—”λ“œμ„œλ²„μ—μ„œ Content-Lengthκ°€ νŒŒμ‹±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (κ·Έλž˜μ„œ CL.0) 이라고 ν•©λ‹ˆλ‹€.
  • (ν•΄λ‹Ή λ¬Έμ œμ—μ„œλŠ” λ°±μ—”λ“œμ„œλ²„κ°€ /resources κ²½λ‘œλŠ” μžμ›μ„ ν‘œμ‹œν•˜κΈ°μ—, Body 데이터λ₯Ό νŒŒμ‹±ν•˜μ§€ μ•Šμ•„ λ°œμƒν•œλ‹€κ³  μƒκ°λ©λ‹ˆλ‹€.)
  • μ΄λ ‡κ²Œ λ¬΄μ‹œλœ 두 번째 νŒ¨ν‚·μ€ λ‹€μŒλ²ˆ μš”μ²­μ— Smuggling λ©λ‹ˆλ‹€.
Β 
Β 
두 번째 일반 νŒ¨ν‚·μž…λ‹ˆλ‹€. μ˜ˆμƒλŒ€λ‘œ /κ²½λ‘œμ— μš”μ²­μ„ ν•˜μ˜€μ§€λ§Œ Smuggling된 νŒ¨ν‚·μ˜ μš”μ²­μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
notion image
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

3. HTTP Smuggling (HTTP/2)


3.1 HTTP/1.1 vs 2

Smuggling을 ν•˜λŠ” κ΄€μ μ—μ„œ HTTP 버전은 μ€‘μš”ν•œ 차이λ₯Ό λ³΄μž…λ‹ˆλ‹€.
μ˜ˆμ‹œλ‘œ HTTP/1.1μ—μ„œ 헀더 전솑 방식은 ν…μŠ€νŠΈ 기반으둜 μ „μ†‘λ˜λ©°, \r\n으둜 κ΅¬λΆ„λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ HTTP2λŠ” λ°”μ΄λ„ˆλ¦¬ ν”„λ ˆμž„μœΌλ‘œ μ „μ†‘λ˜κΈ° λ•Œλ¬Έμ— κ°œν–‰μ„ μ‚¬μš©ν•  ν•„μš”λ„ μ—†κ³ , ν”„λ ˆμž„ λ‹¨μœ„λ‘œ μ „μ†‘λ˜κΈ° λ•Œλ¬Έμ— Content-Lengthλ˜ν•œ μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
Β 
ν‘œν˜„ 방식 λ˜ν•œ λ‹€λ¦…λ‹ˆλ‹€. μ˜ˆμ‹œλ‘œ 같은 μ›Ή μš”μ²­ νŒ¨ν‚·μ„ 버전에 따라 λ‹€λ₯΄κ²Œ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
Β 
πŸ”Ž HTTP/1.1
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.8 Accept-Encoding: gzip, deflate, sdch Connection: keep-alive
Β 
πŸ”Ž HTTP/2
:method: GET :scheme: https :authority: www.example.com :path: /index.html user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 accept-language: en-US,en;q=0.8 accept-encoding: gzip, deflate, br
  • μ‹€μ œλ‘œ 콜둠으둜 ν‘œν˜„λ˜μ§„ μ•ŠμœΌλ©°, λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λ‘œ μΈμ½”λ”©λ˜μ–΄ μ „μ†‘λ©λ‹ˆλ‹€.
Β 
Β 
Β 
Β 
Β 
Β 

3.2 downgrades HTTP/2 requests

HTTP/2 ν™˜κ²½μ—μ„œλŠ” 기쑴에 μ‘΄μž¬ν•˜λŠ” Smuggling곡격을 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λŒ€μ‹  ν΄λΌμ΄μ–ΈνŠΈμ™€ 미듀웨어가 http/2 톡신을 μˆ˜ν–‰ν•˜κ³ , 미듀웨어와 μ—”λ“œμ„œλ²„κ°€ HTTP/1.1 톡신을 μˆ˜ν–‰ν•œλ‹€λ©΄, 취약점을 트리거 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Β 
H2.CL
➑️ ν”„λ‘ νŠΈμ—”λ“œ β†’ 미듀웨어 : HTTP/2 μ‚¬μš©
➑️ 미듀웨어 β†’ μ—”λ“œμ„œλ²„ : HTTP/1.1 μ‚¬μš©
POST / HTTP/2 Host: front ~ Content-Length: 0 #핡심
  • μ—”λ“œμ„œλ²„μ—μ„œλŠ” Content-Lengthκ°€ 0이라고 μƒκ°ν•¨μœΌλ‘œμ¨ 이후에 μ˜€λŠ” νŒ¨ν‚·μ€ μ†ŒμΌ“μ— 데이터가 λ‚¨κ²Œ λ©λ‹ˆλ‹€.
  • 두 번째 μš”μ²­λΆ€ν„°λŠ” ν”Όν•΄μžμ˜ μš”μ²­μ΄ Smuggling된 νŒ¨ν‚· λ’€λ‘œ λΆ™μ–΄ 곡격이 μ‹€ν–‰λ©λ‹ˆλ‹€.
Β 
🎯 μ˜ˆμ‹œ
notion image
Β 
Β 
Β 
H2.TE
HE.CLκ³Ό λ™μΌν•œ λ°©μ‹μž…λ‹ˆλ‹€.
POST / HTTP/2 Host: YOUR-LAB-ID.web-security-academy.net Transfer-Encoding: chunked 0 GET /admin HTTP/1.1 Host: YOUR-LAB-ID.web-security-academy.net
  • HTTP/2μ—μ„œλŠ” Transfer-Encoding을 μ²˜λ¦¬ν•˜μ§€ μ•ŠμŒμœΌλ‘œ, ν•΄λ‹Ή νŒ¨ν‚·μ΄ κ·ΈλŒ€λ‘œ μ—”λ“œ μ„œλ²„λ‘œ λ„˜μ–΄κ°€κ²Œ 되고 μ΄λ•Œ μ—”λ“œ μ„œλ²„κ°€ TEλ₯Ό μ²˜λ¦¬ν•˜λ©° Smuggling이 λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

4. Smuggling μ˜ˆμ‹œ


4.1 /admin 경둜 μ ‘κ·Ό λ°©μ§€ 우회

보톡 /admin κ²½λ‘œλŠ” localhost와 같은 λ‚΄λΆ€λ§μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•˜κ±°λ‚˜, IP ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ 운용 등을 톡해 접근을 ν†΅μ œν•©λ‹ˆλ‹€.
Β 
μ˜ˆμ‹œλ‘œ ν•΄λ‹Ή μ‚¬μ΄νŠΈμ—μ„œ /admin경둜둜 μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ block λ‹Ήν•˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
notion image
Β 
Β 
CL-TE 취약점이 μžˆλŠ” 것을 νŒŒμ•…ν•˜κ³ , Smuggling 곡격을 톡해 /admin κ²½λ‘œμ— μ ‘κ·Όν•©λ‹ˆλ‹€.
notion image
  • local users만 νŒ¨λ„μ΄ ν—ˆμš©λ˜μ–΄ μžˆλ‹€κ³  λ‚˜μ˜΅λ‹ˆλ‹€.
  • μ—¬κΈ°μ„œ 얻을 수 μžˆλŠ” μ •λ³΄λŠ” ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ μ œμ–΄ν•˜λ˜ 인가 정책을 우회 ν–ˆλ‹€λŠ” 것 μž…λ‹ˆλ‹€.
Β 
Β 
local usersκ°€ λ‚΄λΆ€ 망에 μ†ν•œ μœ μ €λ“€μ„ μ§€μΉ­ν•  ν™•λ₯ μ΄ λ†’κΈ° λ•Œλ¬Έμ—, Host헀더λ₯Ό μΆ”κ°€ν•΄μ„œ 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.
notion image
  • 헀더가 μ€‘λ³΅λ˜μ—ˆλ‹€κ³  λœΉλ‹ˆλ‹€.
  • μ•„λ§ˆλ„ 이후에 μš”μ²­λ˜λŠ” νŒ¨ν‚·κ³Ό ν•©μ³μ§ˆ λ•Œ, 헀더가 μ€‘μ²©λ˜μ–΄ 그런 것 κ°™μŠ΅λ‹ˆλ‹€.
  • 이후에 μ˜€λŠ” 데이터λ₯Ό Body처리λ₯Ό ν•˜μ—¬ λ³€κ²½ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.
Β 
Β 
HTTP/1.1 ν‘œμ€€μ€ GET μš”μ²­μ— Bodyλ₯Ό ν¬ν•¨ν•˜λŠ” 것을 κΈˆμ§€ν•˜μ§€λŠ” μ•Šμ§€λ§Œ, λŒ€λΆ€λΆ„μ˜ μ›Ή μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈλŠ” GET μš”μ²­μ˜ Bodyλ₯Ό λ¬΄μ‹œν•˜λ„λ‘ κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ•Œλ¬Έμ—, 이후에 μ˜€λŠ” νŒ¨ν‚·μ„ Body값에 λ³΄λ‚΄κ²Œ 되면 일반적인 GET μš”μ²­κ³Ό κ°™λ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
notion image
  • μ—¬κΈ°μ„œ 두 번째둜 λ“±μž₯ν•˜λŠ” Content-LengthλŠ” μž„μ˜λ‘œ λΆ€μ—¬ν•©λ‹ˆλ‹€.
  • 이후에 μ˜€λŠ” 데이터가 Body λ°μ΄ν„°λ‘œ λ“€μ–΄κ°€κ³ , Body λ°μ΄ν„°λ‘œ λ“€μ–΄κ°„ 헀더 μ •λ³΄λŠ” λ¬΄μ‹œλ¨μœΌλ‘œ, μ •μƒμ μœΌλ‘œ admin panel에 μ ‘κ·Όν•  수 있게 λ©λ‹ˆλ‹€.
Β 
Β 
Β 
Β 
Β 

4.2 λ―Έλ“€μ›¨μ–΄β†’μ—”λ“œμ„œλ²„ 정보 유좜 / μ‚¬μš©μž μš”μ²­ Leak

미듀웨어 β†’ μ—”λ“œ μ„œλ²„ λ‚΄μš© 캑쳐
여기에 μ›Ήμ‚¬μ΄νŠΈμ— ν”ν•˜κ²Œ μ‚¬μš©λ˜λŠ” 검색 κΈ°λŠ₯이 μ‘΄μž¬ν•©λ‹ˆλ‹€.
μ›Ήμ‚¬μ΄νŠΈλŠ” κ²€μƒ‰ν•œ λ‚΄μš©μ„ Response νŽ˜μ΄μ§€μ— 검색 결과와 ν•¨κ»˜ λ³΄μ—¬μ€λ‹ˆλ‹€.
notion image
Β 
Β 
μ΄λŸ¬ν•œ 경우 CL-TE취약점을 μ΄μš©ν•˜κ²Œ 되면, 미듀웨어가 μ—”λ“œ μ„œλ²„μ— μš”μ²­ν•˜λŠ” 정보λ₯Ό 캑쳐할 수 μžˆμŠ΅λ‹ˆλ‹€.
πŸ’‘
μ–΄λ–€μ‹μœΌλ‘œ κ°€λŠ₯ν• κΉŒμš”?
κ·Έλ¦Όκ³Ό 같이, 첫 번째 Smuggling νŒ¨ν‚·μ—μ„œ Content-Lengthλ₯Ό μΆ©λΆ„ν•˜κ²Œ 길게 μ£Όκ³  search νŒŒλΌλ―Έν„° 뒀에 valueλ₯Ό λΉ„μ›Œλ‘‘λ‹ˆλ‹€.
Β 
μ΄λ ‡κ²Œ 되면 μ—”λ“œ μ„œλ²„μ˜ μ†ŒμΌ“μ— Smuggling된 νŽ˜μ΄λ‘œλ“œκ°€ λ‚¨κ²Œ λ©λ‹ˆλ‹€.
Β 
μ΄λ•Œ 두 번째 μš”μ²­μ„ λ°œμƒμ‹œν‚€λ©΄ search=λ‘λ²ˆμ§Έ μš”μ²­ ν˜•νƒœλ‘œ 미듀웨어가 μ—”λ“œ μ„œλ²„λ‘œ 보낸 μš”μ²­μ΄ 검색 기둝처럼 Store 되기 λ•Œλ¬Έμ— κ³΅κ°œλ˜μ§€ μ•Šμ€ 헀더 정보 유좜이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
notion image
  • 보톡 λ―Έλ“€μ›¨μ–΄μ—μ„œ μΆ”κ°€λœ 헀더λ₯Ό μ—”λ“œμ„œλ²„μ—μ„œ νŒŒμ‹±ν•˜κ³  λ…ΈμΆœν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ•Œμ•„λ‚Ό 방법이 μ—†μŠ΅λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ HTTP Smuggling을 톡해 μš”μ²­ νŒ¨ν‚· 자체λ₯Ό Leak ν•¨μœΌλ‘œμ¨, λΉ„λ°€ 헀더λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
Β 
Β 
Β 
μ‚¬μš©μž μš”μ²­ Leak
λ§ˆμ°¬κ°€μ§€λ‘œ HTTP Smuggling을 μ‚¬μš©ν•˜λ©΄ 일반 μœ μ €μ˜ 쿠킀정보, νŠΉμ • 헀더, 인증 정보등을 μ•žμ„œ μ„€λͺ…ν•œ λ°©μ‹μ²˜λŸΌ ν•΄ν‚Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Β 
  1. μ‚¬μš©μžμ˜ μš”μ²­μ΄ μ›Ήμ‚¬μ΄νŠΈμ— μ €μž₯λ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.
  1. HTTP Smuggling 을 톡해 μ›Ήμ‚¬μ΄νŠΈμ— 무언가가 μ €μž₯λ˜λŠ” νŒ¨ν‚·μ„ Smuggling ν•©λ‹ˆλ‹€.
  1. μ‚¬μš©μžκ°€ μ›Ήμ‚¬μ΄νŠΈμ— μ ‘κ·Όν•©λ‹ˆλ‹€.
  1. Smuggling된 νŒ¨ν‚·κ³Ό μ‚¬μš©μžμ˜ μ ‘κ·Ό νŒ¨ν‚·μ΄ ν•©μ³μ§μœΌλ‘œμ¨, μ‚¬μš©μžλŠ” μžμ‹ μ˜ μš”μ²­ 정보λ₯Ό μ›Ήμ‚¬μ΄νŠΈμ— μ €μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€.
  1. κ³΅κ²©μžλŠ” μ €μž₯된 정보λ₯Ό λ°”νƒ•μœΌλ‘œ μ‚¬μš©μžμΈ μ²™ μœ„μž₯ ν•©λ‹ˆλ‹€.
Β 
Β 
πŸ”Ž μ˜ˆμ‹œ
⚠️ μ˜ˆμ‹œ μž…λ‹ˆλ‹€. νŒ¨ν‚· 정보가 μ˜¬λ°”λ₯΄μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
Β 
κ³΅κ²©μžλŠ” Smuggling νŒ¨ν‚·μ˜ Content-Lengthλ₯Ό μΆ©λΆ„νžˆ μ£Όκ³ , email= 을 톡해 μ‚¬μš©μžμ˜ 정보가 이메일 μ„Ήμ…˜μ— λ‹΄κΈ°κ²Œ ν•©λ‹ˆλ‹€.
POST / HTTP/1.1 Host: YOUR-LAB-ID.web-security-academy.net Content-Type: application/x-www-form-urlencoded Content-Length: <CL-TE> Transfer-Encoding: chunked 0 POST /post/comment HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 400 Cookie: session=your-session-token name=attacker&email= #μ‚¬μš©μžμ˜ 정보가 μ΄ν›„λ‘œ λ‹΄κΉ€ # μŠ€λ¨ΈκΈ€λ§ 데이터 + λ‘λ²ˆμ§Έ νŒ¨ν‚· POST /post/comment HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 400 Cookie: session=your-session-token name=attacker&email= #λ‘λ²ˆμ§Έ νŒ¨ν‚·μ˜ μ‹œμž‘(ν”Όν•΄μž) GET / HTTP/1.1 Content-Type: application/x-www-form-urlencoded Cookie: session=ν”Όν•΄μž 토큰
Β 
Β 
곡격자의 Smuggling μ‹œλ„ 이후, μ›Ή μ„œλ²„μ— μ ‘κ·Όν•œ ν”Όν•΄μžλŠ” μžμ‹ μ˜ μš”μ²­ 정보λ₯Ό /post/comment에 μ €μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€.
notion image
Β 
Β 
이런 μ‹μœΌλ‘œ Smuggling은 λ‹€μ–‘ν•œ 취약점을 λ‚΄ν¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ„œλ²„μ˜ 데이터 νŒŒμ‹± 방법에 따라 λΆ„μ„ν•˜κ³ , μ–΄λ–€ 정보λ₯Ό μœ μΆœν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
Β 
Β 
Β 
Β 
Β 

Reference


Β