๋ฒ ์–ด_
TechBear
๋ฒ ์–ด_
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (336)
    • Spring (33)
      • ๊ฐœ๋… (13)
      • Security (5)
      • ์‹ค์Šต (1)
      • ํ† ๋น„ ์Šคํ”„๋ง (11)
    • JPA (6)
    • ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก (24)
    • DB (13)
    • JAVA (18)
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (50)
      • ์œ ํ˜•์ •๋ฆฌ (8)
      • Baekjoon (21)
      • LeetCode (18)
    • ๋””์ž์ธํŒจํ„ด (0)
    • ๊ฐœ๋ฐœ์„œ์  (79)
      • Effective Java (78)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (1)
    • ๋…ํ›„๊ฐ (4)
    • ๋ณด์•ˆ (2)
    • ์šด์˜์ฒด์ œ(OS) (53)
      • ๊ณต๋ฃก์ฑ… (53)
    • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (28)
      • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ (23)
    • ์ž๋ฃŒ๊ตฌ์กฐ (1)
    • DevOps (2)
    • ์•ฑ ๊ฐœ๋ฐœ (20)
      • ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค (20)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    ๊ณต์ง€์‚ฌํ•ญ

    ์ธ๊ธฐ ๊ธ€

    ํƒœ๊ทธ

    • dfs
    • ์Šคํ”„๋ง์‹œํ๋ฆฌํ‹ฐ
    • ์ฝ”๋“œ์—…
    • ์šด์˜์ฒด์ œ
    • BFS
    • ์ž๋ฐ”8
    • jpa
    • ์Šคํ”„๋ง
    • ์ž๋ฐ”
    • ํ† ๋น„์Šคํ”„๋ง
    • leetcode
    • Spring
    • ๋ฐฑ์ค€
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • C++
    • ์Šค๋ ˆ๋“œ
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • java
    • ํ•จ์ˆ˜ํ˜•์ธํ„ฐํŽ˜์ด์Šค
    • ์ดํŽ™ํ‹ฐ๋ธŒ์ž๋ฐ”

    ์ตœ๊ทผ ๋Œ“๊ธ€

    ์ตœ๊ทผ ๊ธ€

    ํ‹ฐ์Šคํ† ๋ฆฌ

    hELLO ยท Designed By ์ •์ƒ์šฐ.
    ๋ฒ ์–ด_

    TechBear

    ๋ณด์•ˆ

    XSS๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์„๊นŒ?

    2023. 12. 29. 15:14

    DALLยทE 2023-12-29 02.46.10 - An illustrative concept of Cross-Site Scripting (XSS) vulnerability in web security, resized to a format of 1200x630. Show a computer screen displayin 1.png

    ๐Ÿ” XSS๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

    ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(Cross-Site Scripting, ์ดํ•˜ XSS)์€ ์›น ๋ณด์•ˆ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋กœ, ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

    ์ด ์ทจ์•ฝ์ ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ ์ ˆํžˆ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. XSS ๊ณต๊ฒฉ์€ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ํ† ํฐ, ์ฟ ํ‚ค, ๊ฐœ์ธ ์ •๋ณด ๋“ฑ์„ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ํŠน์ • ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๐Ÿ” XSS๋Š” ์™œ ๋“ฑ์žฅํ–ˆ๋Š”๊ฐ€?

    XSS ์ทจ์•ฝ์ ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐœ์ „๊ณผ ํ•จ๊ป˜ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์›น ์‚ฌ์ดํŠธ๋“ค์€ ์ฃผ๋กœ ์ •์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ท„์ง€๋งŒ, ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ๊ณผ ๊ฐœ์ธํ™”๋œ ์ฝ˜ํ…์ธ ์˜ ํ•„์š”์„ฑ์ด ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์ˆ˜๊ฐ€ ๋˜์—ˆ๊ณ , ์ด ๊ณผ์ •์—์„œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ๊ฒ€์ฆ๊ณผ ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„ XSS์™€ ๊ฐ™์€ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    ๐Ÿ” XSS ๊ณต๊ฒฉ์˜ ์ž‘๋™ ์›๋ฆฌ

    โœ๏ธ ๋น„ ์ง€์†์  ๊ธฐ๋ฒ• (non-persistent)

    ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ •ํ•œ ๋งํฌ๋ฅผ ํด๋ฆญํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งํฌ์—๋Š” ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์›น ํŽ˜์ด์ง€์— ๋ฐ˜์˜ํ•ด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    http://example.com/?query=<script>alert('์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ')</script>
    

    โœ๏ธ ์ง€์†์  ๊ธฐ๋ฒ• (persistent)

    ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์›น ์„œ๋ฒ„์— ์ €์žฅ๋˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ“๊ธ€, ๊ฒŒ์‹œ๋ฌผ, ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๋“ฑ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด, ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

    <!DOCTYPE html>
    <html>
    <head>
        <title>XSS ๊ณต๊ฒฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜</title>
    </head>
    <body>
        <h1>๋Œ“๊ธ€ ์„น์…˜</h1>
        <div id="comments">
            <!-- ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋Œ“๊ธ€ -->
            <p>์‚ฌ์šฉ์ž ๋Œ“๊ธ€: 
    	        <script>alert('XSS ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค!');</script>
    		</p>
        </div>
    </body>
    </html>
    

    โœ๏ธ DOM based XSS

    DOM ๊ธฐ๋ฐ˜ XSS๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋Š” ํŽ˜์ด์ง€ ์ž์ฒด์—๋Š” ์ €์žฅ๋˜์ง€ ์•Š์ง€๋งŒ, ํŽ˜์ด์ง€์˜ DOM์„ ์กฐ์ž‘ํ•˜์—ฌ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

    // URL์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๋œ ๊ฐ’์„ ํŽ˜์ด์ง€์— ๋ฐ˜์˜
    const input = window.location.href.split('input=')[1];
    document.getElementById('output').innerHTML = decodeURIComponent(input);
    

    ๐Ÿ” XSS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•

    โœ๏ธ ์ด์Šค์ผ€์ดํ•‘

    <!DOCTYPE html>
    <html>
    <head>
        <title>XSS ๋ฐฉ์ง€ ์˜ˆ์‹œ</title>
    </head>
    <body>
        <form id="myForm">
            <label for="userInput">์ž…๋ ฅ:</label>
            <input type="text" id="userInput" name="userInput">
            <button type="submit">์ œ์ถœ</button>
        </form>
        <div id="result"></div>
    <script>
    	document.getElementById('myForm').addEventListener('submit', function(event) {
    	    event.preventDefault();
    	
    	    // ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
    	    var userInput = document.getElementById('userInput').value;
    	
    	    // XSS ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์ด์Šค์ผ€์ดํ•‘
    	    var safeInput = escapeHtml(userInput);
    	
    	    // ๊ฒฐ๊ณผ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํŽ˜์ด์ง€์— ํ‘œ์‹œ
    	    document.getElementById('result').innerText = safeInput;
    	});
    	
    	function escapeHtml(unsafe) {
    	    return unsafe
    	             .replace(/&/g, "&amp;")
    	             .replace(/</g, "&lt;")
    	             .replace(/>/g, "&gt;")
    	             .replace(/"/g, "&quot;")
    	             .replace(/'/g, "&#039;");
    	}
    </script>
    </body>
    </html>
    

    โœ๏ธ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฒ€์ฆ

    function validateInput(input) {
        let pattern = /<script.*?>.*?<\/script>/gi;
        return input.replace(pattern, '');
    }
    

    โœ๏ธ CSP ํ—ค๋” ์„ค์ •

    CSP(Content-Security-Policy) ํ—ค๋”๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๋Š” HTTP ์‘๋‹ต ํ—ค๋” ์ค‘ ํ•˜๋‚˜๋กœ, ์›น ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์˜ ์ข…๋ฅ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

    Content-Security-Policy: <policy-directive>; <policy-directive>
    

    ๋‹ค์Œ์€ ์ž์‹ ์˜ ์ฃผ์†Œ์™€ google.com์˜ ์Šคํฌ๋ฆฝํŠธ ๋ฆฌ์†Œ์Šค๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

    Content-Security-Policy: script-src 'self' *.google.com;
    

    โœ๏ธ Vue, React์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ ์ด์šฉํ•˜๊ธฐ

    ๊ธฐ๋ณธ์ ์œผ๋กœ Vue, React, Angular์™€ ๊ฐ™์€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ผ๋ถ€ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    ์ž๋™ ์ด์Šค์ผ€์ดํ”„

    <h1>{{ userProvidedString }}</h1>
    // ๊ฐ’์ด '<script>alert("hi")</script>' ์ผ ๋•Œ
    
    // ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์Šค์ผ€์ดํ”„ ๋œ๋‹ค.
    &lt;script&gt;alert(&quot;hi&quot;)&lt;/script&gt;
    

    ๐Ÿ” ์ฐธ๊ณ 

    ์œ„ํ‚ค๋ฐฑ๊ณผ - ์‚ฌ์ดํŠธ ๊ฐ„ ์Šคํฌ๋ฆฝํŒ…
    Cloudflare
    CSP๋ž€?
    Vue Guide

      '๋ณด์•ˆ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
      • SQL Injection ๊ณต๊ฒฉ๊ณผ ๋Œ€์‘๋ฐฉ๋ฒ•
      ๋ฒ ์–ด_
      ๋ฒ ์–ด_
      Today I learned | ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐœ๋ฐœ์ž

      ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”