[WebGoat๐Ÿ] HTTP Basics & Proxy

๊ฐ€์˜ยท2020๋…„ 11์›” 26์ผ
0
post-thumbnail

HTTP Basics

Concept

์ด๋ฒˆ ๋ ˆ์Šจ์€ ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ์˜ ์ด๋™์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ๊ณ  HTTP ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•ด์„œ ์–ด๋–ป๊ฒŒ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฑ„์˜ค๋Š”์ง€์— ๋Œ€ํ•ด ๋ฐฐ์šด๋‹ค.

How HTTP works:

๋ชจ๋“  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 parameters 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.

The Quiz

1๋ฒˆ

WebGoat๊ฐ€ ์ด๋ฒˆ ๋ ˆ์Šจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” HTTP ๋ช…๋ น์˜ ์ข…๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ฐพ์•„๋ผ!

  1. ๋’ค๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ„๋’ค์— ํ•ด๋‹น ํผ์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ฒดํฌํ•ด๋ณด์ž!

  1. HTML ์†Œ์Šค์ฝ”๋“œ์—์„œ form์„ ๊ฒ€์ƒ‰ํ•ด๋ณธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ํผ์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ GET์ธ์ง€ POST์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค : ์ •๋‹ต์€ POST ์˜€๋‹ค!

2๋ฒˆ: What is the magic number

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์†Œ์Šค์ฝ”๋“œ ๋‚ด์—์„œ magic number๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด

magic number์˜ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค. Magic number is 88!


HTTP Proxies

What's a HTTP Proxy

ํ”„๋ก์‹œ๋ž€ 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 ํƒญ์œผ๋กœ ๊ฐ€๋ฉด ๋œ๋‹ค.)

์ด์ œ ๋ฌธ์ œ์˜ ์š”๊ตฌ์‚ฌํ•ญ๋“ค์„ ๋ชจ๋‘ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค. -> ์š”์ฒญ ๋ณ€์กฐ!

  1. POST๋ฅผ GET์œผ๋กœ

  2. ํ—ค๋” ์ถ”๊ฐ€ํ•˜๊ธฐ

  3. ๋ฐ”๋””๋ฅผ ์‚ญ์ œ, URL์— ?changeME=Requests+are+tempered+easily ๋ฅผ ๋ถ™์ธ๋‹ค. (์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ)

์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๋‚˜์„œ sendํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ Response๊ฐ€ ์˜จ๋‹ค.

Well done, you tempered the request as expected ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๊ณ  ์›นํŽ˜์ด์ง€ ์ƒ์—์„œ๋„ ๋ฌธ์ œ๋ฅผ ํ†ต๊ณผํ•œ ๊ฒƒ์œผ๋กœ ๋œฌ๋‹ค.


์ด๋ฒˆ์—๋Š” ์›นํ•ดํ‚น์„ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์— ์šฐ๋ฆฌ๊ฐ€ ์•ž์œผ๋กœ ๊ณ„์† ์‚ฌ์šฉํ•  ๋ฒ„ํ”„์Šค์œ„ํŠธ๋ฅผ ์จ๋ณด๊ณ  ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค! ๋ฒ„ํ”„์Šค์œ„ํŠธ๋ฅผ ์“ฐ๋ฉด์„œ ์ถ”์ƒ์ ์ด์—ˆ๋˜ HTTP ๊ฐœ๋…์„ ๋‹ค์‹œ ์žก์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค! ์•ž์œผ๋กœ ๋” ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹น

0๊ฐœ์˜ ๋Œ“๊ธ€