๐ŸŒ†โ”‚Web_Study/๐ŸฅŠโ”‚pentestgym

์›น ํด๋ผ์ด์–ธํŠธ์ธก ๊ธฐ์ˆ 

Jastes 2023. 5. 29. 00:00

๐Ÿ’กํ•ด๋‹น ๋‚ด์šฉ์€ pentestqym์˜ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋ฉฐ,
๋ชจ๋“  ์ €์ž‘๊ถŒ์€ ํ•ด๋‹น ์‚ฌ์ดํŠธ์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค.

 ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋น„์Šค๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” HTML, CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ๋ฌธ์„œ๊ฐ์ฒด๋ชจ๋ธ(DOM) ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.


๊ฐœ์š”

 ํด๋ผ์ด์–ธํŠธ์ธก(Client-Side) ๊ธฐ์ˆ ์ด๋ž€ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ชจ๋ธ[๊ฐ์ฃผ:1]์—์„œ ํด๋ผ์ด์–ธํŠธ, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ๊ธฐ์ˆ ์„ ๋งํ•ฉ๋‹ˆ๋‹ค

 ํด๋ผ ์ธก์˜ ๊ธฐ์ˆ ๋กœ์จ๋Š” ๋ฌด์ง€ ๋งŽ์ง€๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•„๋ž˜ ๋ชฉ์ฐจ๋กœ๋งŒ ์•Œ์•„๋ด…์‹œ๋‹ค.


HTML, CSS, JavaScript

 ์›น ํด๋ผ ์ธก์˜ ๊ธฐ๋ณธ์œผ๋กœ์จ, ์ด๊ฑด ํ•ด๋‹น ๋งํฌ๋ฅผ ํ†ตํ•ด ํ•™์Šต์„ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค ์ •๋ฆฌ๋„ ์ •๋ฆฌ์ด๊ธดํ•œ๋ฐ.. ์ง์ ‘ ์›น ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” ๊ฑธ ์ถ”์ฒœํ•˜์ง€๋งŒ CSS๋Š” ๋ณด์•ˆ์—์„œ๋Š” ํฐ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ทธ ๋ถ€๋ถ„๋งŒ ์ œ์™ธํ•œ๋‹ค๋ฉด ์–ด๋Š์ •๋„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•™์Šตํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค(ํด๋ผ ์ธก ํ‹€์€ ์šฐ๋ฆฌ๋Š” ๋‚˜์ค‘์— Bootstrap์œผ๋กœ ํ•  ๊ฑฐ ๊ฐ™๊ธดํ•œ๋ฐ..)

HTML ์˜ˆ์‹œ
<html>
  <head><title>HTML ํŒŒ์ผ ์˜ˆ์ œ</title></head>
  <body>
    <div>
      <h1>์ด ์˜ˆ์ œ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ HTML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.</h1>
      <img src="์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ์ฃผ์†Œ๋‚˜ ๊ฒฝ๋กœ">
      <a href="๋งํฌ ์ฃผ์†Œ">ํ•˜์ดํผ๋งํฌ</a>
    </div>
    <form action="/login" method="POST">
      ์•„์ด๋””: <input type="text" name="username" id="username">
      ํŒจ์Šค์›Œ๋“œ: <input type="password" name="password" id="password">
      <input type="submit" name="login" value="๋กœ๊ทธ์ธ">
    </form>
  </body>
</html>
 

HTML Tutorial

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

HTML ์ˆ˜์—… - ์ƒํ™œ์ฝ”๋”ฉ

์ˆ˜์—…์˜ ๋ชฉ์  ๋ณธ ์ˆ˜์—…์€ HTML์— ๋Œ€ํ•œ ์‹ฌํ™”๋œ ๋‚ด์šฉ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. HTML์˜ ๊ธฐ๋ณธ๋ฌธ๋ฒ•๊ณผ HTML์˜ ์ฃผ์š”ํ•œ ํƒœ๊ทธ๋“ค์— ๋Œ€ํ•œ ์ˆ˜์—…์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.  ์„ ํ–‰ํ•™์Šต ๋ณธ ์ˆ˜์—…์„ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›น์• ํ”Œ๋ฆฌ

opentutorials.org


CSS ์˜ˆ์‹œ
<html>
<head>
  <title>์™ธ๋ถ€ CSS</title>
  <link rel="stylesheet" type="text/css" href="/ํŒŒ์ผ๊ฒฝ๋กœ/myStyle.css">
</head>
<body>
  <p>๋ฒ„๊ทธ๋ฐ”์šดํ‹ฐ ํด๋Ÿฝ</p>
</body>
</html>
/* ์™ธ๋ถ€ CSS ํŒŒ์ผ (myStyle.css) */p {  color: red;  font-size: 20px;}

 

 

CSS Tutorial

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

CSS ์ˆ˜์—… - ์ƒํ™œ์ฝ”๋”ฉ

CSS๋Š” HTML์„ ์•„๋ฆ„๋‹ต๊ฒŒ ๊พธ๋ฉฐ์ฃผ๋Š” ๋””์ž์ด๋„ˆ์˜ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํ™”๊ฐ€๊ฐ€ ๋ถ“์„ ๋งŒ๋“œ๋Š” ๋ฒ•์„ ์•Œ ํ•„์š”๋Š” ์—†์ง€๋งŒ, ๋ถ“์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋ณด๋‹ค ๋ถ“ ์งˆ์€ ํ›จ์”ฌ ์ž˜ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ“ ์งˆํ•˜๋Š” ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ํ‘œํ˜„ํ•˜

opentutorials.org

JavaScript ์˜ˆ์‹œ
<!-- HTML ํŒŒ์ผ -->
<html>
  <head>
    <title>์™ธ๋ถ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ</title>
    <script src="/ํŒŒ์ผ๊ฒฝ๋กœ/myScript.js"></script>
  </head>
  <body>
    ...์ƒ๋žต...
  </body>
</html>
<!-- ๋ณ„๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ (myScript.js) -->
<script>
  //์—ฌ๊ธฐ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ
</script>
 

JavaScript Tutorial

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

JavaScript - ์ƒํ™œ์ฝ”๋”ฉ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ž€? HTML๊ณผ CSS๋Š” ์ •์ ์ธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์ •์ ์ด๋ผ๋Š” ๊ฒƒ์€ ์ด๊ฒƒ๋“ค์ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด์„œ ์›นํŽ˜์ด์ง€๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋ฉด ์ด ํ™”๋ฉด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. (์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ

opentutorials.org

 ๋ญ ์ƒ์„ธํ•˜๊ฒŒ ์•Œ์•„๋„ ์ข‹์ง€๋งŒ ๊ธฐ๋Šฅ๊ณผ ํ•ด๋‹น ํƒœ๊ทธ๋“ค๋งŒ ์–ด๋Š์ •๋„ ์•Œ ์ •๋„๋กœ ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๊ธฐ๋„ ํ•˜๊ณ  ๋ชจ์˜ ํ•ดํ‚น ์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด ๊ธˆ๋ฐฉ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ˆ๊นŒ์š”


DOM(Document Object Model)

 DOM(Document Object Model)์€ ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋กœ, HTML์ด๋‚˜ XML๊ณผ ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋กœ๋“œํ•  ๋•Œ ์ด๋ฅผ ๋…ผ๋ฆฌ์ ์ธ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ์—์„œ ๊ฐ ์š”์†Œ, ํ…์ŠคํŠธ, ์†์„ฑ์€ ๋…ธ๋“œ(Node)๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋Š” "Document" ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

 ํ…์ŠคํŠธ ๋…ธ๋“œ, ์š”์†Œ ๋…ธ๋“œ, ์†์„ฑ ๋…ธ๋“œ๋“ค์€ Document ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. DOM์„ ์‚ฌ์šฉํ•˜๋ฉด ์›น ํŽ˜์ด์ง€์˜ ์š”์†Œ๋“ค์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

DOM์€ ํ”Œ๋žซํผ๊ณผ ์–ธ์–ด์— ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ฃผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ œ๊ณต

 DOM API๋ฅผ ํ†ตํ•ด ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์„ฑ ์š”์†Œ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DOM์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ๋‚ด์šฉ, ์†์„ฑ, ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€, ๋ณ€๊ฒฝ, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DOM API๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ์™€ ์†์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ DOM์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

<html>
  ...์ƒ๋žต...
  <body>
    <p id="greeting"></p>
    <script>
      document.getElementById("greeting").innerHTML = "Hello, hunters!";
    </script>
  </body>
</html>
  • document : DOM Tree์—์„œ ์ตœ์ƒ์œ„ ๋…ธ๋“œ
  • getElementById("greeting") : ID๊ฐ€ greeting์ธ HTML ์š”์†Œ์— ์ ‘๊ทผํ•จ
  • innerHTML : ์ง€์ •๋œ HTML ์š”์†Œ์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ„

์ƒ์„ธํ•œ DOM์˜ ๋‚ด์šฉ์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด DOM Interface์—์„œ ์ฐธ๊ณ ๋ฐ”๋ผ๋ฉฐ, ํ•ด๋‹น DOM์˜ ๋‚ด์šฉ์€ ๊ฐ„ํ˜น ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ์— ์•Œ์•„๋‘๋ฉด ๋‚˜์˜์ง€ ์•Š๊ฒ ์ฃ ?


Ajax

 AJAX(Asynchronous JavaScript + XML)๋Š” ํŠน์ • ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ ‘๊ทผ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ์šฉ์–ด

 HTML[๊ฐ์ฃผ:2], CSS[๊ฐ์ฃผ:3], JavaScript[๊ฐ์ฃผ:4], DOM[๊ฐ์ฃผ:5], XML[๊ฐ์ฃผ:6], XMLHttpRequest[๊ฐ์ฃผ:7]๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ๋น ๋ฅด๊ณ  ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

 AJAX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์น  ํ•„์š” ์—†์ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ๋ฐ˜์‘์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ตœ๊ทผ์—๋Š” XML ๋Œ€์‹  ๊ฐ€๋ฒผ์šด ์šฉ๋Ÿ‰๊ณผ JavaScript์˜ ์ผ๋ถ€์ธ JSON์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. AJAX๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ •๋ณด๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ‘œ์‹œํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ์ฝ”๋“œ๋Š” Ajax์˜ ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

<html>
   <head>
      <title>XMLHttpRequest ์˜ˆ์ œ</title>
      <script>
         function test() {
            var xhr = new XMLHttpRequest();                        // 2. XMLHttpRequest ๊ฐ์ฒด ์ƒ์„ฑ
            xhr.onreadystatechange = function() {                  // 5. XMLHttpRequest ๊ฐ์ฒด์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ ํ˜ธ์ถœ
                if (xhr.readyState == 4 && xhr.status == 200) {
                        document.getElementById("result").innerHTML = xhr.responseText; // 6. HTML DOM ๊ฐฑ์‹ 
                }            };
            xhr.open("GET", "https://www.bugbountyclub.com",true); // 3. XMLHttpRequest ๊ฐ์ฒด ๊ตฌ์„ฑ
            xhr.send();                                            // 4. XMLHttpRequest๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ์š”์ฒญ
         }
      </script>
   </head>
   <body>
      <button type="button" onclick="test()">Send</button>         // 1. ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋ฒคํŠธ ๋ฐœ์ƒ
      <div id="result"></div>
   </body>
</html>

Ajax๋Š” ๋‹ค์Œ์˜ ๊ณผ์ •์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.


1. ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋ฒคํŠธ ๋ฐœ์ƒ

<button type="button" onclick="test()">Send</button>

์‚ฌ์šฉ์ž์˜ ๋ฒ„ํŠผ ํด๋ฆญ์ด๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ test() ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

2. XMLHttpRequest ๊ฐ์ฒด ์ƒ์„ฑ

var xhr = new XMLHttpRequest();

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ XMLHttpRequest ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

3. XMLHttpRequest ๊ฐ์ฒด ๊ตฌ์„ฑ

xhr.open("GET", "https://www.bugbountyclub.com",true);

 XMLHttpRequest ๊ฐ์ฒด์˜ open() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์š”์ฒญ ๋ฉ”์†Œ๋“œ(GET, POST ๋“ฑ), ์š”์ฒญ์„ ๋ณด๋‚ผ URL, ์š”์ฒญ์˜ ๋น„๋™๊ธฐ ์—ฌ๋ถ€๋ฅผ true(๊ธฐ๋ณธ๊ฐ’) ๋˜๋Š” false์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

4. XMLHttpRequest๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ์š”์ฒญ

xhr.send();

XMLHttpRequest ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค.

 

5. (์„œ๋ฒ„๊ฐ€ ์‘๋‹ต ์‹œ) XMLHttpRequest ๊ฐ์ฒด์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ ํ˜ธ์ถœ

xhr.onreadystatechange = function() {
	if (xhr.readyState == 4 && xhr.status == 200) {
    	// 6๋ฒˆ์˜ HTML DOM ๊ฐฑ์‹ ์„ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.    
    }
};

♦ onreadystatechange: XMlHttpRequest ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ , function์ด ์‹คํ–‰ํ•จ

♦ readyState: XMlHttpRequest ๊ฐ์ฒด์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๊ฐ’์— ๋”ฐ๋ฅธ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

  • 0: ์š”์ฒญ ์ดˆ๊ธฐํ™” X | open() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • 1: ์š”์ฒญ์ด ์„ค์ •๋จ | open() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  send()๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • 2: ์š”์ฒญ์ด ์ „์†ก๋จ | send() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • 3: ์š”์ฒญ์ด ์ฒ˜๋ฆฌ์ค‘ | ์„œ๋ฒ„์— ์š”์ฒญ์„ ์ „์†กํ•œ ํ›„ ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ฐ›๊ธฐ ์ „์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • 4: ์š”์ฒญ์ด ์™„๋ฃŒ๋จ | ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์€ ํ›„์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

status: HTTP ์‘๋‹ต ์ฝ”๋“œ๋ฅผ ๋‚˜ํƒ€๋ƒ„

 

6.HTML DOM ๊ฐฑ์‹ 

document.getElementById("result").innerHTML = xhr.responseText;

DOM API๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์˜ ์‘๋‹ต์„ "result"๋ผ๋Š” ์•„์ด๋””๋ฅผ ๊ฐ–๋Š” HTML ์š”์†Œ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

responseText: ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํ…์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•จ


JSON

 JSON์€ ์ดˆ๊ฒฝ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ

 XML๋ณด๋‹ค ๊ฐ€๋…์„ฑ์ด ๋†’๊ณ  ์šฉ๋Ÿ‰์ด ์ž‘์œผ๋ฉฐ, ์ฃผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ ๊ตํ™˜์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. JSON์€ Ajax ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž์˜ ์• ์™„๋™๋ฌผ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์„œ๋ฒ„๋Š” JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

{
    "pet": [
        {
          "name": "Tommy",
            "type": "dog",
            "age": 10
            "like": ["ball", "running"]
        }
        {
            "name": "Sally",
            "type": "cat",
            "age": 4
            "like": ["fish", ""]
        }
    ]
}
  • ์ค‘๊ด„ํ˜ธ { }๋Š” ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ,๊ฐ์ฒด๋Š” ์ฝค๋งˆ(,)๋กœ ๊ตฌ๋ถ„๋œ ์ด๋ฆ„:๊ฐ’ ์Œ์˜ ์ง‘ํ•ฉ
  • ๋Œ€๊ด„ํ˜ธ [  ]๋Š” ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ. ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์€ ์ฝค๋งˆ(,)๋กœ ๊ตฌ๋ถ„๋จ

SOP(Same-Origin Policy) & CORS(Cross-Origin Resource Sharing)

 

Mitigation: Same Origin Policy

Mitigation: Same Origin Policy SOP์— ๋Œ€ํ•˜์—ฌ ์ด์ „๊นŒ์ง€์˜ ์ฟ ํ‚ค์™€ ์„ธ์…˜์— ๊ด€ํ•œ ๋‚ด์šฉ์€ ๊ธฐ๋ณธ์ ์ด๋ผ์„œ ์ €์˜ ์ •๋ฆฌ๋ณด๋‹จ ์ง์ ‘ ๋ฐฐ์šฐ๋ฉด์„œ ํ•˜๋Š”๊ฒŒ ์ข‹์•„๋ณด์—ฌ์„œ.. ์‚ฌ์‹ค ๊ท€์ฐฎ์•„์„œ๊ฐ€ ์ œ์ผ ํฐ๋ฐ ใ…‹ใ…‹ ์›น์˜ ์ดํ•ด์™€ HTTP

dystopia050119.tistory.com

 CORS Type

์œ„์— ๋งํฌ๋ฅผ ๋ณด์‹œ๋ฉด์„œ CORS ์š”์ฒญ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • Simple Request
  • Preflighted Request
Simple Request(Example)

 ์‚ฌ์šฉ์ž๊ฐ€ https://foo.example ์›น ์‚ฌ์ดํŠธ์— ๋ฐฉ๋ฌธํ•œ ํ›„, https://bar.other ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋•Œ ์š”์ฒญ์—๋Š” Origin ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด์„œ ์„œ๋ฒ„๋Š” ์š”์ฒญ์ด ์–ด๋–ค ์ถœ์ฒ˜์—์„œ ์˜จ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” Access-Control-Allow-Origin(ACAO) ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ—ˆ์šฉ๋˜๋„๋ก ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ACAO ํ—ค๋”์˜ ๊ฐ’์ด ์™€์ผ๋“œ์นด๋“œ์ธ ๊ฒฝ์šฐ, ๋ชจ๋“  ์ถœ์ฒ˜์—์„œ์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์ถœ์ฒ˜๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” HTTP ์‘๋‹ต์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๋‹น ์ถœ์ฒ˜๋งŒ ACAO ํ—ค๋”์— ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Access-Control-Allow-Origin: foo.example

 

Preflighted Request(Example)

 Preflighted Request๋Š” Simple Request์™€๋Š” ๋‹ฌ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์‚ฌ์ „ ํ•ฉ์˜๋ฅผ ์œ„ํ•ด OPTIONS ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” Origin ํ—ค๋”์™€ ํ•จ๊ป˜ Access-Control-Request-Method ๋ฐ Access-Control-Request-Headers ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์š”์ฒญ์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์†Œ๋“œ์™€ ํ—ค๋”๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 

 ์„œ๋ฒ„๋Š” ์ด ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Access-Control-Allow-Methods ๋ฐ Access-Control-Allow-Headers ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ—ˆ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ์™€ ํ—ค๋”๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” ์‹ค์ œ ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. Preflighted ์š”์ฒญ์€ CORS(Cross-Origin Resource Sharing) ์ •์ฑ…์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์•Œ๋“ค์‹ ์žก
 CORS์™€ ๊ด€๋ จ๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ทจ์•ฝ์ ์œผ๋กœ๋Š” OWASP TOP 10์˜ #5 ์ž˜๋ชป๋œ ๋ณด์•ˆ ๊ตฌ์„ฑ(Security Misconfiguration)์— ํ•ด๋‹น๋˜๋Š” "์ž˜๋ชป๋œ CORS ์„ค์ •(CORS Misconfiguration)"์ด ์žˆ์œผ๋ฉฐ, ๋ฒ„๊ทธ๋ฐ”์šดํ‹ฐ์—์„œ ๋งŽ์ด ์ œ๋ณด๋˜๋Š” ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ์ทจ์•ฝ์ ์œผ๋กœ ์ธํ•ด ์˜๋„ํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์— ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ์ฆ๋ช… ๋“ฑ์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

 

์›น ํด๋ผ์ด์–ธํŠธ์ธก ๊ธฐ์ˆ  | Pentest Gym | ๋ฒ„๊ทธ๋ฐ”์šดํ‹ฐํด๋Ÿฝ

์ด ํ›ˆ๋ จ์—์„œ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋น„์Šค๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” HTML, CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ๋ฌธ์„œ๊ฐ์ฒด๋ชจ๋ธ(DOM) ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•ด ์•Œ

www.bugbountyclub.com

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

  1. ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ์‘๋‹ต๋ฐ›์€ HTML, CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๊ทธ๋ฆฌ๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด์„ํ•˜์—ฌ ์‚ฌ์šฉ์ž๋‹จ์˜ ๋™์  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
  2. ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ์™€ ์ฝ˜ํ…์ธ ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์–ธ์–ด๋กœ, ์š”์†Œ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€, ๋งํฌ ๋“ฑ์„ ํ‘œ์‹œํ•˜๊ณ  ๊ตฌ์กฐ๋ฅผ ์ •์˜ [๋ณธ๋ฌธ์œผ๋กœ]
  3. ์›น ํŽ˜์ด์ง€์˜ ๋””์ž์ธ๊ณผ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ด๋‹นํ•˜๋Š” ์Šคํƒ€์ผ ์‹œํŠธ ์–ธ์–ด๋กœ, HTML ์š”์†Œ๋“ค์˜ ์Šคํƒ€์ผ, ํฌ๊ธฐ, ์ƒ‰์ƒ ๋“ฑ์„ ์ง€์ •ํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊พธ๋ฐˆ [๋ณธ๋ฌธ์œผ๋กœ]
  4. ์›น ํŽ˜์ด์ง€์˜ ๋™์ ์ธ ๊ธฐ๋Šฅ๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ, HTML๊ณผ CSS๋ฅผ ์ œ์–ดํ•˜๊ณ  ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์›น ํŽ˜์ด์ง€์— ๋™์ ์ธ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•จ [๋ณธ๋ฌธ์œผ๋กœ]
  5. ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ์™€ ๋‚ด์šฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, HTML ๋˜๋Š” XML ๋ฌธ์„œ๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ [๋ณธ๋ฌธ์œผ๋กœ]
  6. ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๋งˆํฌ์—… ์–ธ์–ด๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ, ํƒœ๊ทธ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•จ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ, ๊ตํ™˜, ๊ณต์œ ์— ํ™œ์šฉ๋จ [๋ณธ๋ฌธ์œผ๋กœ]
  7. JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์ด๋ฉฐ, ์›น ํŽ˜์ด์ง€์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŽ˜์ด์ง€์˜ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด๋„ ๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•จ. ์ฃผ๋กœ AJAX์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์ธ XML, JSON ๋“ฑ์„ ์ฃผ๊ณ ๋ฐ›์Œ [๋ณธ๋ฌธ์œผ๋กœ]