ํฐ์คํ ๋ฆฌ ๋ทฐ
๊ฐ์
HTTP Request Smuggling์ Watchfire์ ์ํด 2005๋ ์ ์ฒ์ ๋ฑ์ฅํ์ฌ ์๋ฉด ์์ ์จ์ด ์๋ค๊ฐ 2019๋ DEFCON๊ณผ BlackHat์์ ํด๋น ์ทจ์ฝ์ ์ ์ ์ด์ฉํ ์๋ก์ด ๋ฒกํฐ์ ์ํ๋๋ฅผ ๊ฒ์ฆํ๋ฉด์ ์ธ์ง๋๊ฐ ๋์์ง ์ทจ์ฝ์ ์ ๋๋ค.
ํด๋น ์ทจ์ฝ์ ์ด ์ด์๊ฐ ๋๋ ํด์ธ 2019๋ ์ PAYPAL ๊ธฐ์ ์์๋ ํด๋น ์ทจ์ฝ์ ์ ๋ ธ์ถ๋๊ฒ์ ๋ฒ๊ทธ ๋ฐ์ดํฐ ํ๋ก๊ทธ๋จ์ ํตํด ์ ๋ณด๋ฐ์๊ณ ํฌ์๊ธ์ผ๋ก ์ด 20.000 ๋ฌ๋ฌ๋ฅผ ์ง๊ธํ ์ฌ๋ก๊ฐ ์กด์ฌํฉ๋๋ค.
Http Request Smuggling์ ํ๋ก ํธ ์ ๋ฐฑ์๋๊ฐ Http ์์ฒญ์ ๊ฒฝ๊ณ๋ฅผ ๋ค๋ฅด๊ฒ ํด์ํ๊ณ RFC7230์ ๋ฐ๋ฅด์ง ์๋ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ์ ํ๋ก ํธ์ ์ญํ ์ LB(Load Balancer) ๋ RP(Reverse Proxy), CDN(Content Delivery Network)๊ฐ ๋๋ฉฐ ์ด๋ค์ ๋ค์ํ ์ฌ์ฉ์๋ค์ ์์ฒญ์ ๋ฐ์ ์ ๋ฌ ๋ฐ ๋ถ๋ฐฐ๋ฅผ ํด์ฃผ๋ ๊ณผ์ ์์ Back-end๊ฐ chunked ๋๋ Content-Length๋ฅผ ๋ง๋๋ฉด ์ง์ ๋ ๋ฐ์ดํฐ๋งํผ๋ง ์ฒ๋ฆฌํ๊ณ ๋๋จธ์ง๋ ํจํท์ ๋ฒํผ์ ์ ์ ๋จ๊ฒ ๋๋๋ฐ ์ด๊ฒ์ ํ ์ฌ์ฉ์๋ค์ ์ ์์ ์ธ ์์ฒญ์ ํ๋ฆ์ ๋ฐฉํดํ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ๋๋ค.
์์ ์ฌ์ง์ฒ๋ผ ๊ณต๊ฒฉ์์ ํ์ฌ์ฉ์๋ค ๊ฐ์ ์๋น์ค๋ฅผ ์ด์ฉํ๋ ๊ณผ์ ์์ ์ ์์ ์ธ ์ฌ์ฉ์๋ ํด๋น ์ทจ์ฝ์ ์ ์ด์ฉํด ์์ ์ ์์ฒญ ์ด์ธ์ ์ถ๊ฐ์ ์ธ ์์ฒญ ํ์๋ฅผ ๋ฐฑ์๋ ๋ฒํผ ์ ์ ๊ธฐ๋ค๋ฆฌ๋๋ก ๋๊ธฐ์ํค๊ณ ํ ์ฌ์ฉ์์ ์์ฒญ ์๋จ์ ํจ๊ป ๋ฌถ์ฌ ์ฒ๋ฆฌ๋๋๋ก ํ ์ ์์ต๋๋ค.
์ทจ์ฝ์ ์ด ๋ฐ์ํ๋ ์ด์
http์์ฒญ์ด ๋๋๋ ์์น๋ฅผ ์ง์ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ธ Content-Length ํค๋์ Transfer-Encoding ํค๋๋ฅผ ๋ชจ๋ ์ ๊ณตํ๊ธฐ์ ์ฃผ๋ก ๋ฐ์ํฉ๋๋ค. ํ์ง๋ง ๋๋ถ๋ถ์ ์๋น์ค์์๋ 2๊ฐ์ง์ ํค๋๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๊ณ ์๋๋ฐ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋์ธ๋ฐ..
RFC 2616์ ๋ฐ๋ฅด๋ฉด Transfer-Encoding ํค๋ ํ๋์ Content-Length ํค๋ ํ๋๊ฐ ๋ชจ๋์๋ ๋ฉ์์ง๊ฐ ์์ ๋๋ฉด ํ์์ธ Content-Length๋ ๋ฌด์๋๊ณ ์ด๋ฅผ Transfer-Encoding์ด ์ด๋ฅผ ๋์ฒดํด์ผ ๋จ
์ฆ ์์ฒญ ํค๋์ 2๊ฐ์ง์ ํค๋๊ฐ ๋ชจ๋ ํฌํจ์ด ๋์ด ์์ ๊ฒฝ์ฐ Content-Length๋ ๋ฌด์ํด์ผ ๋๋ค๋ ๊ฒ์ ๋๋ค.
Content-Length: ์๋ต ๋ฉ์์ง์ Body ๊ธธ์ด๋ ํน์ ์ง์ ๋ ๊ฐ์ฒด์ ๊ธธ์ด๋ฅผ ํ ๋ฒ์ ๋ณด๋
Transfer-Encoding: ๋์ ์ผ๋ก ์์ฑ๋๋ ์๋ต ํค๋๋ก chunked ์ ์ก ๋ฐฉ์์ ํตํด ์กฐ๊ฐ์กฐ๊ฐ ๋๋์ด ์ฒ๋ฆฌํจ(์ฒ๋ฆฌ ์ข
๋ฃ๋ 0์ด ๊ธฐ์ )
Content-Length์ Transfer-Encoding์ ์กด์ฌ ์ด์
<Content-Length ํค๋>
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
q=smuggling
์น ์๋ฒ๊ฐ ์ ๋ฌํด์ฃผ๋ ์ฝํ ์ธ ์ ์์๊ณผ ๋์ ์์์ผ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ๋๋๋ฐ ๊ทธ๋ฌ๊ธฐ ์ํด Content-Length ํค๋์ ์ ๋ฌํ๊ณ ์ ํ๋ ์ปจํ ์ธ ์ ์ฌ์ด์ฆ๋ฅผ ํ์ํด์ฃผ๋ฉด ์น ์๋ฒ์์ค๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ์ ์ปจํ ์ธ ์ฌ์ด์ฆ๋ฅผ ๋จผ์ ๊ณ์ฐํ์ฌ ์๋ตํด์ค ๋ ์ ์ฒด ์ฌ์ด์ฆ์ ํจ๊ป ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ค๋ค. ๋ง์ฝ Content-Length ๊ฐ์ด "3" ์ด๋ฉด 3 Bytes ๋งํผ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
<Transfer-Encoding ํค๋>
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
b
q=smuggling
0
๋ง์ฝ ์ฝํ ์ธ ์ฌ์ด์ฆ๊ฐ ํฌ๋ฉด ์ง์ฐ์ด ๊ฑธ๋ฆด ํ ๋ฐ ๊ทธ๋ผ ์ด๋กํ๋๊ฐ?? ๋ฐ๋ก "Chunked" ์ ์ก ๋ฐฉ์์ ํตํด ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์๋ ค์ฃผ์ง ์๊ณ ์กฐ๊ธ์ฉ ์กฐ๊ธ์ฉ ์๋ ค์ค ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ก ์ ๋์ ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๋ ๋ฐฉ์์ด ์กด์ฌํฉ๋๋ค.
"Chunked" ๋ฐฉ์์๋ Content-Length ํค๋๊ฐ ์กด์ฌํ์ง ์๊ณ ๋์ "Transfer-Encoding: Chuncked"๋ผ๋ ํค๋๊ฐ ๋ถ์ต๋๋ค.(0์ ์ข ๋ฃ๋ฅผ ์๋ฏธ)
Content-Length์ Transfer-Encoding์ ์ฒ๋ฆฌ๋ฐฉ์ ๋ฐ ์ข ๋ฅ
ํ๋ก ํธ ์๋์ ๋ฐฑ์๋ ์ชฝ ์๋ฒ๊ฐ ์ฒ๋ฆฌํ๋ ํค๋์ ์ฐ์ ์์์ ๋ฐ๋ผ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง๋๋ค. ๋ง์ฝ Content-Length๋ฅผ ํ๋ก ํธ์์ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฐฑ์๋์์ Transfer-Encoding์ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ๊ฒฝ์ฐ CL-TE๋ผ๊ณ ํฉ๋๋ค.
CL:TE : ํ๋ก ํธ ์๋ ์์ฒญ(Content-Length) <-> ๋ฐฑ ์๋ ์๋ต(Transfer-Encoding)
TE:CL : ํ๋ก ํธ ์๋ ์์ฒญ(Transfer-Encoding) <-> ๋ฐฑ ์๋ ์๋ต(Content-Length)
TE:TE : ํ๋ก ํธ ์๋์ ๋ฐฑ ์๋ ๋ชจ๋ Transfer-Encoding ์ง์
์์์๋ ์ค๋ช ๋๋ ธ์ง๋ง ๋ ํค๋๊ฐ ์์ฒญ ํจํท์ ๋ชจ๋ ํฌํจ๋ ๊ฒฝ์ฐ ๊ธฐ์กด ์ ์ ์์ฒญ๊ณผ ์ถ๊ฐ์ ์ธ ์์ฒญ์ ๋ง๋ถ์ฌ ์ ์กํ์ฌ ์๋ฒ์ ์ ๋ฌํฉ๋๋ค. ์ด๋ก ์ธํด ํ๋ฐํธ ์๋ ๋ฐ ๋ฐฑ ์๋ ์๋ฒ๊ฐ ์ฒด์ธ์์ ๊ฐ ์์ฒญ์ ์์๊ณผ ๋์ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ์์ ์ธ HTTP ์์ฒญ์ ๋์ด ์๋ชป ๊ณ์ฐ๋์ด ํ๋์ ์๋ฒ์์ ์ ์ฑ ์ฝํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ์ง ์๊ณ ์ฒด์ธ์ ๋ค์ ์ธ๋ฐ์ด๋ ์์ฒญ ์์ ๋ถ๋ถ์ ์ถ๊ฐ๋์ด ์ฒ๋ฆฌ๋ฉ๋๋ค.
CL:TE ์ทจ์ฝ์
POST /category HTTP/1.1
Host: guleum-zone.com
Content-Length: 24
Transfer-Encoding: chunked
0 -> processing
smuggling -> Back-End Stanby
Content Length๋ฅผ ํตํด ํ๋ก ํธ ์ชฝ ์๋ฒ์์๋ ๋ณธ๋ฌธ์ ๊ธธ์ด๊ฐ 24 ๋ฐ์ดํธ์ธ ๊ฒ์ฒ๋ผ ์๋ํฉ๋๋ค. ํ์ง๋ง ๋ฐฑ์๋ ์ชฝ์์๋ Transfer-Encoding์ ๋ถ์ฌ๋ chunked๋ฅผ ํ์ธํ๊ณ ์กฐ๊ฐ์กฐ๊ฐ ์ฒ๋ฆฌํ๋ ์ค "0"์ ๋ง๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ข ๋ฃํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ผ "0"์ดํ๋ก ํ์๋ smuggling ๋ฉ์์ง๋ ์ฒ๋ฆฌ๋์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฐฑ์๋ ๋ฒํผ์ ์ ์ ๊ธฐ๋ก๋ ์ฑ ๋ค์ ์์ฒญ์ ์์ ํฌํจ๋์ด ์ ์ก๋ ๋๊น์ง ๋๊ธฐํ๊ฒ ๋ฉ๋๋ค.
๊ธฐ์กด ์ ์์ ์ธ ์์ฒญ์ ์กฐ์ํ์ฌ ์์ ๊ฐ์ด ๋ฒํผ์ ๊ธฐ๋ก๋ ์ฑ๋ก ๋จ๊ฒจ๋๊ณ ๋ค์ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค.
Content-Length์ ๋ถ์ฌ๋ ๊ฐ์ ํตํด ๋ณธ๋ฌธ ์ ์ฒด ๊ฐ์ ์ฒ๋ฆฌํ๋๋ก ์ฒซ ๋ฒ์งธ ์์ฒญ์ ๋ณด๋ ๋๋ค. ํ์ง๋ง ์์ฒญ ํค๋์ ํฌํจ๋ Transfer-Encoding์ chunked๋ก ์ธํด ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ "0"๊น์ง๋ฐ์ ๋ชปํ๊ฒ ๋์ด ํ์์ "smuggling"์ ์ฒ๋ฆฌ๋์ง ๋ชปํ๊ณ ๋จ์์๊ฒ ๋์ด ๋ค์ ์์ฒญ ๋ ํจ๊ป ํฌํจ๋์ด "POST๊ฐ ์๋ -> SMUGGLINGPOST"๋ก ์ฒ๋ฆฌ๋๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ ๊ด๋ฆฌ์ ํ์ด์ง๋ก ์ ๊ทผํ๊ธฐ ์ํ /admin ๊ฒฝ๋ก๊ฐ ์ฐจ๋จ๋์ด ์๋ค๋ฉด Smuggling ์ทจ์ฝ์ ์ ์ ์ฉํ์ฌ ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ ์์ต๋๋ค.
์์ฒญํ๋ Host ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ฆํ๊ณ ์๋ ๊ฒ์ ํ์ธํ์์ผ๋ฏ๋ก ํ๋จ์ ์ถ๊ฐ ์์ฒญ์ ๋ง๋ถ์ฌ ์ ๊ทผํ๋๋ก ์๋ํ ์ ์์ต๋๋ค.
GET ๋ฐฉ์์ "x="์ด๋ผ๋ ๊ฐ์ Body์ ๋ฃ์ด์ค ์ด์ ๋ "Content-Type" ์์ฑ ๋๋ฌธ์ ๋๋ค. ํด๋น ๊ฐ์ HTTP ์์ฒญ์ ๋ฉ์์ง๋ฅผ POST๋ฐฉ์ ์ฆ ๋ณธ๋ฌธ์ Body์ ํฌํจํ์ฌ ๋ณด๋ด๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
* ์ถ๊ฐ ์์ฒญ์ด ์๋ ๊ธฐ์กด ์์ฒญ๋ง ๋ณด๋ผ ๊ฒฝ์ฐ ๋ฐ๋ก ๊ธฐ์ ํ์ง ์์๋ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ํดํธ๋ก "application/x-www-form-urlencoded" ์์ฑ ๊ฐ์ ๋ฃ์ด์ ๋ณด๋ด์ฃผ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ฃ์ด์ค๋ ๋์ง๋ง ์์ฒ๋ผ ์ถ๊ฐ ๋ณธ๋ฌธ์ ๋ง๋ถ์ฌ์ค ๊ฒ์ด๋ผ๋ฉด Content-Type์ ์ง์ ํ์ฌ ๊ท์ฝ์ ์ง์ผ์ฃผ์ ์ผ ๋ฉ๋๋ค.
TE:CL ์ทจ์ฝ์
POST /category HTTP/1.1
Host: guleum-zone.com
Content-Length: 3
Transfer-Encoding: chunked
5 -> processing
smuggling -> Back-End Stanby
0 -> processing
ํ๋ก ํธ์์๋ Transfer-Encoding์ ๋ถ์ฌ๋ chunked์ ํตํด 0\r\n ๊ธฐ์ค์ผ๋ก ์กฐ๊ฐ๋ด์ด ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ฐ์ ์ ์ฒด ๋ณธ๋ฌธ ๋ด์ฉ์ ๋ฐฑ์๋ ์ชฝ์ผ๋ก ๋ณด๋ ๋๋ค. ํ์ง๋ง ๋ฐฑ์๋์์๋ Content-Length๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ถ์ฌ๋ "3" ๋ฐ์ดํธ์ ํฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์ฌ 3๊ฐ์ ๊ฐํ ๋ฌธ์์ธ 5\r\n ๊น์ง๋ง ์ฒ๋ฆฌํ๊ณ ์ค๊ฐ์ smuggling์ ๋ฒํผ์ ์ ์ ๋์ ๋๊ธฐํ์ฌ ๋ค์์ฒญ์ ํฌํจํ์ฌ ์ ์ก๋๊ฒ ๋ฉ๋๋ค.
TE:CL ์ทจ์ฝ์ ์ ์ํํ๊ฒ ์งํํ๊ธฐ ์ํด์ ์๋์ผ๋ก ๊ณ์ฐ๋์ด ํ ๋น๋๋ Update Content-Length ์ค์ ์ ๋นํ์ฑํํด์ฃผ์ ์ผ ์ํํ๊ฒ ํ ์คํธ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ ๊ทธ๋ฌ๋ฉด ๋ณธ๋ฌธ์ ์ถ๊ฐ๋ ๋ฐ์ดํฐ์ ๊ธธ์ด ๋ชจ๋๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ์ฌ ํ ๋นํ๊ธฐ ๋๋ฌธ์ Smuggling์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
ํ๋ก ํธ์์๋ TE ๋จผ์ ์ฐ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ข ๋ฃ๋ฅผ ๋ํ๋ด๋ "0"์ ์ ์ผ ํ๋จ์ผ๋ก ์ค์ ํ๊ณ ์ฐ์ ์ ์ผ๋ก ์ ์ฒด ๋ณธ๋ฌธ์ด ๋์ด๊ฐ๋๋ก ํด์ค๋๋ค. ๊ทธ ํ ๋ฐฑ์๋์์๋ CL์ ์ฐ์ ์ฒ๋ฆฌํ๋ฏ๋ก ๋ถ์ฌ๋ "3 Bytes" ๊ฐ๋งํผ๋ง ๊ณ์ฐํ๊ฒ ๋์ด 5\r\n ๊น์ง๋ง ์ฒ๋ฆฌ๋๊ณ SPOST๋ ๋ฐฑ์๋์ ๋๊ธฐํ๊ฒ ๋์ด ๊ทธ๋ค์ ์์ฒญ์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ณธ๋ฌธ์ ์๋ก์ด ์์ฒญ์ ์ถ๊ฐํ์ฌ ์ ์กํ ์๋ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ Content-Length์ ๋ถ์ฌ๋ ๊ฐ์ผ๋ก ์ธํด ๋ฐฑ์๋์์ ์ฒ๋ฆฌํ๋ฏ๋ก ๋ฑ ์ฒ๋ฆฌ๋๋ ๋งํผ์ ๋ฐ์ดํฐ๋ง ๋จ๊ฒจ์ฃผ์๊ณ ๋๋จธ์ง ๋ค์ ์์ฒญ์ ์ฒ๋ฆฌ๋๋๋ก ์์ฑํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
๋จ Content-Length ๊ฐ์ด "10"์ธ๋ฐ Body์ ๋ด์ฉ์ด 3 Bytes ์ ๋๋ฐ์ ์๋ค๋ฉด ์๋ฒ ์ธก์์๋ ๋ฐ์ดํฐ๊ฐ ๋ ๋ค์ด์จ ๊ฒ์ผ๋ก ํ๋จํ์ฌ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ Timeout์ ์ ์ฌํด์ค๋๋ค.
CL:TE์์ ํ์ธํ๋ ๊ด๋ฆฌ์ ํ์ด์ง ์ ๊ทผ์ TE:CL์์๋ ์์ฒ๋ผ ์์ฒญํ์ฌ ๋ฌด๋จ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. 0\r\n์ ๊ธฐ์ ์ผ๋ก ๋ณธ๋ฌธ ์ ์ฒด ๋ด์ฉ์ ์ ๋ฌํ์ง๋ง ๋ฐฑ์๋์์๋ Content-Length์์ ๋ถ์ฌ๋ 4 Bytes ๋ก์ธํด 71\r\n ๊น์ง๋ง ์ฒ๋ฆฌํ๊ณ ๋๋จธ์ง๋ ๋ค์ ์์ฒญ์ ๋จ์ ์ ๋ฌ๋ฉ๋๋ค.
TE:TE ์ทจ์ฝ์
<Transfer-Encoding ํผ๋ํ>
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
ํ๋ก ํธ์ ๋ฐฑ์๋ ๋ชจ๋ Transfer-Encoding ํค๋์ ์ฐ์ ์์๋ฅผ ์ง์ ํ์ฌ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ ์์ฒญ ํค๋์ 2๊ฐ์ Transfer-Encoding์ ์ฝ์ ํ์ฌ smugglingํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐํ๋ฌธ์๋ ์๋ชป๋ ๊ฐ์ ๋ฃ์ด ํ๋ก ํธ๋ ๋ฐฑ์๋ ๋์ค ํ๋๊ฐ ์ด๋ฅผ ๋ฌด์ํ๋๋ก ์ฐํํ๋ ๊ฒ์ ๋๋ค. ํ๋ก ํธ ๋จ์์๋ง Trasnfer-Encoding์ ์ฒ๋ฆฌํ๊ฑฐ๋ ๊ทธ ๋ฐ๋์ธ ๋ฐฑ์๋์์๋ง ์ฒ๋ฆฌํด๋ ๋ฐ์๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ CL:TE ๋๋ TE:CL ๊ณผ ์ ์ฌํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์์ฒ๋ผ 2๊ฐ์ Transfer-Encoding์ ์ด์ฉํ๋ ํ๋๋ ์ ์ ํค๋ ๋๋จธ์ง๋ ๋น์ ์์ ์ธ ํค๋ ๊ฐ์ ์ฌ์ฉํ์ฌ 1๊ฐ๋ง ์ฒ๋ฆฌ๋๋๋ก ์ ๋ํ๋ ๊ฒ ์ ๋๋ค.
์ด๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก Content-Length์ ์ฒ๋ฆฌํ ๊ฐ๋ง ์ง์ ์์ผ์ 5c\r\n ๊น์ง๋ง ์ฒ๋ฆฌ๋๋๋ก ์ ๋ํ๋ฉด ๋๋จธ์ง ์ถ๊ฐ๋ ๊ฐ์ ๋ฒํผ์ ๊ธฐ๋ก๋์ด ๋ค์ ์์ฒญ๊ณผ ํจ๊ป ์ฒ๋ฆฌ๋ฉ๋๋ค.
HTTP Request Smuggling + XSS ๊ณต๊ฒฉ
ํจํท์ ๋ฐ์ํ๋ ๊ณต๊ฒฉ์ ํตํด ๋ค์ํ ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ํ์ ์ธ XSS(Cross Site Scripting) ์ทจ์ฝ์ ์ด ๋์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์กด์ฌํ ๊ฒฝ์ฐ ์ถ๊ฐ ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ์ด์ง ๋ก์ง์ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ์ฌ์ฉ์์ ์ ๋ณด์ธ User-Agent ๊ฐ์ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์์ฒญ ํจํท์ ์ก์ ํ์ธํด๋ณด๋ฉด ํ์คํ๊ฒ ๊ฐ์ผ๋ก ์ธ์ํ๊ณ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค. ํด๋น ํค๋์ ๊ฐ ์ด์ธ์ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ์ฌ ๋ฒํผ์ ๋จ๊ธด ํ ๋ค๋ฅธ ์์ฒญ ๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋๋ก ๊ณต๊ฒฉํ ์ ์์ต๋๋ค.
CL:TE ํ๊ฒฝ์ ๊ณ ๋ คํ์ฌ ์ ์ฒด ๋ณธ๋ฌธ ๋ฐ์ดํฐ๊ฐ ๋ฐฑ์๋๋ก ๋ ์๊ฐ์ง๋ง ๋ฐฑ์๋์ Transfer-Encoding ์ ์ฑ ์ผ๋ก ์ธํด "0" ๊น์ง๋ง ์ฒ๋ฆฌํ๊ณ ์คํฌ๋ฆฝํธ๊ฐ ์ฝ์ ๋ ์ถ๊ฐ ์์ฒญ์ ๋ฒํผ์ ๋จ๊ธฐ๋๋ก ํฉ๋๋ค.
* ๋ค์ ๋ง์๋๋ฆฌ์ง๋ง GET ๋ฐฉ์์ธ๋ฐ Body์ a=1์ด๋ผ๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์ด์ ๋ Content-Tyep ์์ฑ์ผ๋ก ์ธํด ๊ฐ์ ๋ฃ์ด์ค ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฒ ์ธก์์ ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ํ์ธ๋์ง ์์ ๋ฌด์์ ๊ธฐ๋ค๋ฆฌ๋ค ํ์์์ ๊ฑธ์ด๋ฒ๋ฆฝ๋๋ค.
์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ฉ๋๋ค. XSS์ ์ฐ๊ณํ์ฌ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ ๋ค์ ์ํ๋๊ฐ ๋์ ๊ฒ์ผ๋ก ํ๋จ๋ฉ๋๋ค. HTTP ์์ฒญ ๋ฐ์ ๊ณต๊ฒฉ์ MITM์ด ์๋ ์๋ฒ๋จ์ ๊ธฐ๋ก๋ ํ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ด๊ธฐ์ ํ ์ฌ์ฉ์๋ค์๊ฒ๋ ์ถฉ๋ถํ ์ํฅ์ด ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
HTTP Request Smuggling + Force Redirect
๋๋ถ๋ถ์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์๋ ํน์ URL์์ ์ด๋ฒคํธ ๋ฐ์ ์ ํ URL๋ก ์ด๋ํ๊ธฐ ์ํด ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ฐ์ง ์๊ณ "Host:" ํค๋์ ๋ฐฐ์นํ์ฌ ๋ฆฌ๋ค์ด๋ ์ ํฉ๋๋ค. ์ฌ๊ธฐ์ HTTP ๋ฐ์ ๊ณต๊ฒฉ์ ์ฐ๊ณํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ค์ ์์ฒญ์ ๋ฐ์ ํ ์ฌ์ฉ์์๊ฒ ๊ฐ์ ๋ฆฌ๋ค์ด๋ ์ ์ํฌ ์ ์๋ HTTP ์์ฒญ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
<Request>
GET /home HTTP/1.1
Host: guleum-zone.tistory.com
<Response> -> Original HTTP Redirection
HTTP/1.1 301 Moved Permanently
Location: https://guleum-zone.tistory.com -> processing
์ด๊ฑธ ์ ์ฉํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์์ฒญ์ ํ ์ ์์ต๋๋ค.
<Request>
POST / HTTP/1.1
Host: Target-domain.com
Content-Length: 54
Transfer-Encoding: chunked
0
GET /home HTTP/1.1
Host: attacker-website.com -> Back-End Stanby
Foo: X
==========================Back-End Stanby===========================
<Other User Request> -> After Stanby
GET /home HTTP/1.1
Host: attacker-website.com -> Add this Domain
Foo: XGET /scripts/include.js HTTP/1.1 -> Original Request
Host: vulnerable-website.com
<Other User Response> -> Force HTTP Redirection
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/ -> processing of Attacker Domain
์ ์์ ์ธ ์ฌ์ฉ์๋ ํ๋ก ํธ์ ๋ฐฑ์๋ ๊ฐ์ CL:TE ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ ๊ฒ์ ํ์ธ ํ ์์ ์ ์์ฒญ์ ์ถ๊ฐ์ ์ธ ๋ณธ๋ฌธ์ ์ถ๊ฐํ์ฌ ๋ฐฑ์๋ ์๋ฒ์ ๋๊ธฐํ๋๋ก ํ ์ ์์ต๋๋ค.
์ด๋ Transfer-Encoding์ ๋ถ์ฌ๋ chunked์ผ๋ก ์ธํด "0" ๊น์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๊ณ Host: ์ ์ถ๊ฐ๋ ๊ณต๊ฒฉ์์ ์ ์ฑ ์๋ฒ ์ฃผ์๋ ์๋ฒ์ ์์ฒญํ๋ ํ ์ฌ์ฉ์์ ์์ฒญ์ ๋ถ์ด์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ธฐ์กด์ ์ฌ์ฉ์๋ GET /scripts/include.js ๊ฒฝ๋ก์ ์กด์ฌํ๋ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ํ์ฌ ์๋น์ค๋ฅผ ์ด์ฉํ๋ ค๊ณ ํ์ง๋ง ์์ฒญ ์๋จ์ ๊ณต๊ฒฉ์๊ฐ ์ ์ฅํด๋ ๊ฐ์ด ๋ถ๊ฒ ๋์ด ์ต์ข ์ ์ผ๋ก ๊ณต๊ฒฉ์๊ฐ ์ง์ ํด๋ ์ ์ฑ ์๋ฒ๋ก ๋ฆฌ๋ค์ด๋ ์ ๋๊ฒ ๋ฉ๋๋ค.
Http Request Smuggling Scan
์์์ ์ฌ๋ฌ CL:TE / TE:CL ๋ฑ ํ ์คํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ์ ์ ํ Content-Length ๊ฐ์ ๋ถ์ฌํ๋ค๋ ๊ฒ ๋ณดํต์ผ์ด ์๋ ์๋ ์์ต๋๋ค. ๊ทธ๋ด ๋๋ ์๋ํ ์ค์บ์ ์งํํ์ฌ ํ๋ฉด์ ์ผ๋ก ์ทจ์ฝ ์ ๋ฌด๋ฅผ ํ๋จ ํ์ ํ์ธ์ด ๋๋ค๋ฉด ํ๋ก์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ์ทจ์ฝ์ฑ ๊ฒ์ฆ์ ํ๋ ๊ฒ ํจ์จ์ ์ผ ์๋ ์์ต๋๋ค.
๋์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ HTTP ๋ฐ์ ๊ณต๊ฒฉ์ ๋ํ ์ทจ์ฝ์ ์ด ์กด์ฌํ ๊ฒฝ์ฐ ์์ฒ๋ผ TECL ๋๋ CLTE ๊ฐ์ ๊ตฌ๋ถ์ ํด์ฃผ๋ฉด์ ๋ฐ๊ฒฌ๋์๋ค๋ ๊ฒ์ ์ฝ์์ ์ฐ์ด์ค๋๋ค.
/Payload ๋๋ ํ ๋ฆฌ์ ์์ฑ๋ ๊ฒฐ๊ณผ ํ์ผ์ ํตํด ์ถ๊ฐ์ ์ผ๋ก ์๋์ง๋จ์ ๋น ๋ฅด๊ฒ ์งํํ ์ ์๋๋ก ์ง์ํด์ค๋๋ค.
๋์๋ฐฉ์
์กฐ์นํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ฌด๋๋ ๊น๋ค๋ก์ ๋จ์ง ์ธ์ฆ์ฌ์ฌ๋ฅผ ์ํ ์ ์ ์กฐ๊ฑด ๋๋ OWASP ๊ธฐ์ค์ ์ทจ์ฝ์ ์ง๋จ์ ๋ฐ์ผ๋ ค๋ ๊ธฐ์ ๋ค์ ์กฐ์น๊ฐ ์กฐ๊ธ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๊ณ ํ๋จ๋์ง๋ง ๋ง์ฝ ์กฐ์น๋ฅผ ํ๊ณ ์ ํ๋ค๋ฉด ์๋์ ๊ฐ๋ค.
- ๋ฐฑ์๋ ์ชฝ์ HTTP2 ํ๋กํ ์ฝ๋ก ์ ๊ทธ๋ ์ด๋ํ์ฌ ๋๋๋ ์์น์ ๋ํ ๋ชจํธ์ฑ์ ๋ฐฉ์ง(Transfer-Encoding๋ HTTP/2 ์์๋ ์ง์๋์ง ์์)
- ๋น์ ์์ ์ธ ์์ฒญ์ ๊ฐ์ง ํ๊ธฐ ์ํด ํ์ ๊ธฐ๋ฐ WAF ๋์
- ๋ฐฑ์๋์ ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ ๋นํ์ฑํํ์ฌ ๋ฐฑ์๋ ์์ฒญ์ด ๋ณ๋์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ํตํด ์ ์ก๋๋๋ก(์๋ฒ์ ์ฑ๋ฅ ์ ํ๋ฅผ ์๋ฐฉํ ์ ์์)
- ํ๋ฐํธ์ ๋ฐฑ์๋์ ํค๋๊ฐ ์ ๋ขฐํ ์ ์๋ ํค๋์ธ์ง ๋์ผํ๊ฒ ๋งคํ
๋จ์ํ ํด๋ผ์ด์ธํธ, ์๋ฒ ์ธก์์ ๋๋ผ ์ ์๋ ๋ฌธ์ ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ ๊ธฐ์ ์ ์ธํ๋ผ ํ๊ฒฝ์ ๊ณ ๋ คํ์ฌ ์กฐ์นํด์ผ ๋๋ค.
PayPal์ ๊ฒฝ์ฐ ํด๋น ์ทจ์ฝ์ ์ ์กฐ์นํ๊ธฐ ์ํด ์๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์๋น์คํ๋ ํ๊ฒฝ์ ๊ณ ๋ คํ์ฌ Transfer-Encoding ํค๋ ์์ฒด๋ฅผ ๋น์ ๋ขฐํ์ฌ ์ฒ๋ฆฌํ์ง ์๋๋ก ์กฐ์นํ๋ค๋ ๋ด์ฉ์ด ์์ต๋๋ค.
์ด๋ฒ ์ทจ์ฝ์ ์ ๋ญ๊ฐ ์ข ๋ ์ฐ๊ตฌ๊ฐ ํ์ํด ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ ์ฌ๋ก๋ ์ ๋ณด๊ฐ ์๊ธด๋ค๋ฉด ๋ ์ถ๊ฐํ๋๋ก ํ๊ฒ ์ต๋๋ค.
References
- https://portswigger.net/web-security/request-smuggling
- https://core-research-team.github.io/2020-05-01/HTTP-Request-Smuggling-HTTP-Desync-Attack-be0e1c6035f84533af79463b3ec49d75
- https://core-research-team.github.io/2020-05-01/HTTP-Request-Smuggling-HTTP-Desync-Attack-be0e1c6035f84533af79463b3ec49d75
- https://www.hahwul.com/2019/08/12/http-smuggling-attack-re-born/
<Transfer-Encoding>
- https://b.pungjoo.com/entry/Transfer-Encoding-chunked-VS-Content-Length
<Content-Length>
- https://secretofsh.tistory.com/120
<Content-Type>
- https://blog.naver.com/writer0713/221853596497
'WEB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
phpMyAdmin ์ทจ์ฝ์ ์ ์ฉ (0) | 2021.08.23 |
---|---|
Subdomain Takeover ์ทจ์ฝ์ (0) | 2021.04.18 |
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) ์ทจ์ฝ์ (3) | 2021.04.16 |
SSRF(Server Side Request Forgery) ์ทจ์ฝ์ (1) | 2021.02.25 |
Session Fixation(์ธ์ ๊ณ ์ ) ์ทจ์ฝ์ (0) | 2021.02.21 |