์ด๋ฒ ๋ ์จ์ ๋ธ๋ผ์ฐ์ ์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ฌ์ด์์ ๋ฐ์ดํฐ์ ์ด๋์ ์ดํดํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ๋ฐฐ์ฐ๊ณ HTTP ํ๋ก์๋ฅผ ์ด์ฉํด์ ์ด๋ป๊ฒ ์์ฒญ๊ณผ ์๋ต์ ์ฑ์ค๋์ง์ ๋ํด ๋ฐฐ์ด๋ค.
๋ชจ๋ HTTP ๊ตํ์ ๋ชจ๋ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํ์์ ๋ฐ๋ฅธ๋ค. ๊ฐ๊ฐ์ ํด๋ผ์ด์ธํธ ์์ฒญ๊ณผ ์๋ฒ์ ์๋ต์ ์ธ๊ฐ์ง ํํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค: request/response line, header section and entity body
ํด๋ผ์ด์ธํธ๋ ๋ค์๊ณผ๊ฐ์ด ํต์ ์ ์์ํ๋ค.
The client contacts the server and sends a document request: A GET
request can have URL parameter
s and thos parameters will be available in the web access logs.
Next, the client sends optional header information to inform the server of its configuration and the document formats it will accept.
In a POST
request, the user supplied data will follow the optional headers and is not part of the contained within the POST URL.
WebGoat๊ฐ ์ด๋ฒ ๋ ์จ์์ ์ฌ์ฉํ๋ HTTP ๋ช
๋ น์ ์ข
๋ฅ๊ฐ ๋ฌด์์ธ์ง ์ฐพ์๋ผ!
form
์ ๊ฒ์ํด๋ณธ๋ค. ๊ทธ๋ฌ๋ฉด ์ด ํผ์ ๋ฉ์๋๊ฐ GET
์ธ์ง POST
์ธ์ง ์ ์ ์๋ค : ์ ๋ต์ POST
์๋ค!๋ง์ฐฌ๊ฐ์ง๋ก ์์ค์ฝ๋ ๋ด์์ magic number
๋ฅผ ๊ฒ์ํด๋ณด๋ฉด
magic number์ ๊ฐ์ด ๋์จ๋ค. Magic number is 88!
ํ๋ก์๋ HTTP ํด๋ผ์ด์ธํธ๋ฅผ ๋ฐฑ์๋ ๋ฆฌ์์ค์ ์ฐ๊ฒฐํ๋ ์ผ๋ถ Forwarder ์์ฉ ํ๋ก๊ทธ๋จ์ด๋ผ๊ณ ํ๋ค. ์ด๋ ๊ฒ ์ฐ๋๊น ๋ญ์๋ฆฐ์ง ํ๋๋ ๋ชจ๋ฅด๊ฒ ๋ค. ๋ด๊ฐ ์๊ณ ์๋ ๋ฐ๋ฅผ ์ค๋ช ํ์๋ฉด
ํ๋ก์๋ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ๊ณผ ์น ์๋ฒ๊ฐ ํต์ ์ ํ ๋ ์ง์ ์ ์ผ๋ก ์๋ฒ์ ํต์ ํ๋ ์ฃผ์ฒด๋ก, ํด๋ผ์ด์ธํธ์๊ฒ ํ์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ์ค๊ฐ ์ ๋ฌ์๋ผ๊ณ ๋งํ ์ ์๋ค. ๊ทธ๋์ HTTP ํ๋ก์๋ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ํ ์คํธํ ๋๋ ์ฌ์ฉ๋ ์ ์๋ค. ์ฐ๋ฆฌ๋ ํ๋ก์์๋ฒ์ ๊ธฐ๋ก์ ๋ณด๊ณ ์ค์ ๋ก ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ์์ฒญ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณผ ์ ์๋ค. ์นํ๋ก์๋ฅผ ํตํด request/response ํค๋์ payload๋ฅผ ๋ณผ ์ ์๋ค.
ํ๋ก์๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ๊ณ , ๊ทธ๊ฒ์ ์ง์ฐ์ํจ๋ค. ์์ ๋งํ๋ฏ ์๋ฒ๋ก ๊ฐ๊ธฐ ์ ์ ์ค๊ฐ์(man-in-the-middle)์ญํ ์ ํ๋ ๊ฒ์ด๋ค. ์นํ๋ก์๋ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ๊ณผ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ์ ์ ๋ขฐํ๊ณ ์๋ ์ํ์์๋ HTTPS ์ ์ ๋ฌด์ ๊ด๊ณ์์ด ์ ์๋ํ๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด๋ ์๋ฒ์ ์๋ต์ ๋ณ์กฐํ๋ ๋ฑ์ ์นํดํน ์ค์ต์ ํ ๋ ์นํ๋ก์ ๋๊ตฌ๋ค์ ํ์ฉํ ์ ์๋ค.
๋ฌธ์ ์์ ์๊ตฌํ๋ ๊ฒ์ ์ดํด๋ณด์.
Change the method to GET
Add a header 'x-request-intercepted:true'
Remove the request body and instead send 'changeMe' as query string parameter and set the value to 'Requests are tampered easily'
์ผ๋จ ์์ฒญ์ ํ์
์ GET์ผ๋ก ๋ฐ๊ฟ์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ x-request-intercepted:true
๋ฅผ ์๋์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๊ฒ ์ง. ๊ทธ๋ฆฌ๊ณ ๋์ ์์ฒญ ๋ฐ๋๋ฅผ ์ง์ฐ๊ณ changeMe
๋ฅผ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋ณด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ changeMe
์ ๊ฐ์ 'Requests are tampered easily'๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์น ํ๋ก์๋ฅผ ๋ถ์/์ด์ฉํ๊ธฐ ์ํด์๋ ์นํ๋ก์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ผํ๋๋ฐ, ์ด๋ ์์ฉํ๋ก๊ทธ๋จ์ผ๋ก ์ฝ๊ฒ ๋ค์ด๋ฐ์ ์ฌ์ฉํ ์ ์๋ค! ๋๋ ๊ทธ ์ค์ ๊ฐ์ฅ ๋์ค์ ์ธ ํ๋ก๊ทธ๋จ์ธ Burp Suite
๋ฅผ ์ฌ์ฉํ๋ค.
์ฐ์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์ ๋ฒํ์ค์ํธ๋ฅผ ์คํํ๋ค. ๋๋ ๋ฐ๋ก ์ค์ ์ ํ๊ธฐ๊ฐ ๋ฒ๊ฑฐ๋ก์์ ๋ฒํ์ค์ํธ์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ Chromium
๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๋ค.
Proxy
ํญ์ ๋ค์ด๊ฐ์ Intercept is on
์ ๋๋ฌ์ค๋ค. ์ด ๋ฒํผ์ ๋๋ฅด๋ฉด ์น ํ๋ก์๊ฐ ์๋ํ๊ณ , ์ด ๋๋ถํฐ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ(Chromium)์ ์์ฒญ์ด ์๋ฒ๋ก ๊ฐ์ง ์๊ณ ํ๋ก์์ ์กํ์๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ํ์ด์ง๋ก ๋ค์ ๋ค์ด๊ฐ์ submit
๋ฒํผ์ ๋๋ฌ์ฃผ๋ฉด ์์ฒญ์ด ๋ฒํ์ค์ํธ์ ์กํ๊ฒ ๋๋ค.
๊ทธ ๋ค์ ํ์ด์ง์์ ์๋ ๋ณด๋ด๋ ์์ฒญ์ ํ์ธํ๊ธฐ ์ํด ํด๋น ์์ฒญ์ repeat
ํญ์ผ๋ก ๋ถ๋ฌ์ต๋๋ค. (action
-> send to repeat
์ ๋๋ฅด๊ณ repeat
ํญ์ผ๋ก ๊ฐ๋ฉด ๋๋ค.)
์ด์ ๋ฌธ์ ์ ์๊ตฌ์ฌํญ๋ค์ ๋ชจ๋ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค. -> ์์ฒญ ๋ณ์กฐ!
POST๋ฅผ GET์ผ๋ก
ํค๋ ์ถ๊ฐํ๊ธฐ
๋ฐ๋๋ฅผ ์ญ์ , URL์ ?changeME=Requests+are+tempered+easily
๋ฅผ ๋ถ์ธ๋ค. (์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ)
์ด๋ ๊ฒ ๋ฐ๊ฟ์ฃผ๊ณ ๋์ send
ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ Response๊ฐ ์จ๋ค.
Well done, you tempered the request as expected ๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋จ๊ณ ์นํ์ด์ง ์์์๋ ๋ฌธ์ ๋ฅผ ํต๊ณผํ ๊ฒ์ผ๋ก ๋ฌ๋ค.
์ด๋ฒ์๋ ์นํดํน์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ณต๋ถํ๊ธฐ ์ ์ ์ฐ๋ฆฌ๊ฐ ์์ผ๋ก ๊ณ์ ์ฌ์ฉํ ๋ฒํ์ค์ํธ๋ฅผ ์จ๋ณด๊ณ ์ต์ํด์ง๊ธฐ ์ํ ์๊ฐ์ ๊ฐ์ก๋ค! ๋ฒํ์ค์ํธ๋ฅผ ์ฐ๋ฉด์ ์ถ์์ ์ด์๋ HTTP ๊ฐ๋ ์ ๋ค์ ์ก์ ์ ์์๋ค! ์์ผ๋ก ๋ ์ต์ํด์ง๊ธฐ ์ํด ๋ ธ๋ ฅํด์ผ๊ฒ ๋น