XSS注入漏洞概念
跨站脚本(Cross-Site Scripting,XSS)是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到网页中,从而在用户的浏览器上执行。XSS漏洞通常发生在Web应用程序中,当应用程序未正确验证和过滤用户输入时,攻击者可以利用这个漏洞来注入恶意脚本。这可能导致用户受到欺骗、信息泄露、会话劫持等问题。
XSS注入漏洞危害
- 未授权用户/普通用户窃取Cookie: 攻击者可以通过在受影响的网页中注入恶意脚本,将用户的Cookie信息发送到攻击者的服务器。一旦攻击者获取了用户的Cookie,他们可以通过模拟用户的身份进行未经授权的操作,可能导致敏感数据泄露或者越权访问。
- 页面篡改-挂载恶意广告: 攻击者可以通过XSS注入脚本来修改页面内容,例如在网站上插入恶意广告、弹窗或者其他欺诈性内容。这可能损害网站的声誉,影响用户体验,甚至导致用户受骗。
- 页面篡改-跳转至别的网站: 攻击者还可以利用XSS漏洞将用户重定向到其他恶意网站,这可能包括涉及黄色内容、赌博、毒品等不法行为的网站。这不仅危害用户,还可能导致法律责任问题。
XSS注入漏洞修复
- XSS全局过滤器(输入验证): 在Web应用程序中,可以实施一个XSS全局过滤器,对请求中的所有参数进行拦截和处理。该过滤器可以检查用户输入中的潜在恶意脚本,并对其进行过滤或者编码。常见的处理方式包括删除或转义特殊字符,如单引号、双引号、小于号、大于号等。使用现有的安全库(例如ESAPI)来处理XSS过滤是一种良好的实践,因为这样可以确保过滤器的实现是经过充分测试和验证的。
- HtmlUtils.htmlEscape(source): 在Java中,Spring框架提供了HtmlUtils类,其中包括htmlEscape方法,用于对HTML内容进行转义。通过调用
HtmlUtils.htmlEscape(source)
方法,可以将潜在的HTML或JavaScript代码进行编码,从而防止浏览器解析执行这些代码。这是一个方便的工具,可以帮助防范XSS攻击。
- 内容安全策略(CSP): 在HTTP响应头中设置CSP策略,限制网页可以加载的资源和执行的操作,从而减少XSS攻击的成功几率。
- 使用安全的编码库: 使用专门的编码库,如OWASP的ESAPI,确保编码和解码操作是安全可靠的。
XSS注入漏洞类型
XSS(跨站脚本)漏洞主要分为三种类型,取决于攻击者注入恶意脚本的方式和执行上下文。这三种类型是:
- 存储型XSS(Stored XSS):
- 概念: 存储型XSS发生在用户提交的数据被存储在服务器上,并在其他用户访问时被检索和显示的情况下。攻击者通过提交包含恶意脚本的数据,将其存储在服务器上,然后其他用户在访问相应页面时执行了这些脚本。
- 反射型XSS(Reflected XSS):
- 概念: 反射型XSS发生在用户提交的数据被直接返回到页面,并在该页面上执行的情况下。攻击者通过构造包含恶意脚本的URL,诱使用户点击该URL,而服务器在响应中反射(显示)了恶意脚本。
- DOM型XSS(DOM-based XSS):
- 概念: DOM型XSS发生在页面中存在可被JavaScript动态修改的DOM元素,并且恶意脚本通过修改DOM来执行的情况下。攻击者构造的URL或提交的数据,由JavaScript解析后修改了DOM,导致了脚本的执行。
XSS注入漏洞攻击
XSS(跨站脚本)注入是一种常见的Web安全漏洞,攻击者通过在网站中注入恶意脚本,使得用户在浏览网页时执行这些恶意脚本。攻击者通常通过利用用户输入未经过滤的漏洞,将恶意代码嵌入到网页中。以下是XSS攻击的一般步骤和攻击者可能采用的方法:
攻击步骤:
- 寻找漏洞: 攻击者通过扫描目标网站或应用程序,寻找未经过滤的用户输入点,例如表单、URL参数、Cookie等。
- 构造恶意输入: 一旦找到漏洞,攻击者构造包含恶意脚本的输入,这可以是JavaScript代码,如弹窗、重定向或者窃取Cookie的脚本。
- 提交或传递恶意输入: 攻击者将构造的恶意输入提交到目标网站或通过URL参数传递给目标页面。
- 服务器端未正确处理: 如果服务器端未正确处理用户输入,将恶意脚本嵌入到网页中,存储在数据库中(存储型XSS)或者直接反射到响应中(反射型XSS)。
- 受害者浏览器执行脚本: 当用户访问包含恶意脚本的页面时,浏览器会执行这些脚本,从而使攻击者能够在用户上下文中执行各种操作。
攻击者可能采用的方法:
-
通过表单注入: 在网站的搜索框、评论框等用户可输入的地方注入恶意脚本,使其被储存或反射到其他用户的浏览器中。
-
通过URL参数注入: 修改URL中的参数,将恶意脚本传递给目标页面,利用服务器端未对输入进行正确处理的漏洞。URL参数注入是一种XSS攻击的常见手法,攻击者通过修改URL中的参数来注入恶意脚本,从而使得这些脚本被执行。以下是一些攻击者可能使用的方法:
1
| http://example.com/page?param=<script>alert('XSS')</script>
|
1
| http://example.com/page?param=<img src=x onerror=alert('XSS')>
|
1
| http://example.com/page?param=<img src='x' onerror='alert("XSS")'>
|
-
嵌套注入:
攻击者可能尝试嵌套多个标签以混淆输入过滤。例如:
1 2 3
| http://example.com/page?param=<img src='x' onerror='alert("XSS")'> <img src='y'>
|
1
| http://example.com/page?param=%3Cscript%3Ealert(%27XSS%27)%3C/script%3E
|
1
| http://example.com/page?param=<img src='x' onmouseover='alert("XSS")'>
|
1
| <a href="javascript:alert('Hello, this is a JavaScript execution!');">Click me</a>
|
-
通过Cookie注入: 如果网站使用未经过滤的Cookie数据,攻击者可能通过修改Cookie中的值来注入恶意脚本。
-
社会工程学攻击: 攻击者可能通过欺骗用户点击包含恶意脚本的链接,从而触发XSS攻击。
XSS靶场题解:
XSS靶场题解 | C3ngH’s B10g
附加知识
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
| 1. FSCommand() (攻击者当需要在嵌入的Flash对象中执行时可以使用此事件)
2. onAbort() (当用户中止加载图片时)
3. onActivate() (当对象激活时)
4. onAfterPrint() (用户打印或进行打印预览后触发)
5. onAfterUpdate() (从数据源对象更新数据后由数据对象触发)
6. onBeforeActivate() (在对象设置为激活元素前触发)
7. onBeforeCopy() (攻击者在选中部分拷贝到剪贴板前执行攻击代码-攻击者可以通过执行execCommand("Copy")函数触发)
8. onBeforeCut() (攻击者在选中部分剪切到剪贴板前执行攻击代码)
9. onBeforeDeactivate() (在当前对象的激活元素变化前触发)
10. onBeforeEditFocus() (在一个包含可编辑元素的对象进入激活状态时或一个可编辑的对象被选中时触发)
11. onBeforePaste() (在用户被诱导进行粘贴前或使用execCommand("Paste")函数触发)
12. onBeforePrint() (用户需要被诱导进行打印或攻击者可以使用print()或execCommand("Print")函数).
13. onBeforeUnload() (用户需要被诱导关闭浏览器-除非从父窗口执行,否则攻击者不能关闭当前窗口)
14. onBeforeUpdate() (从数据源对象更新数据前由数据对象触发)
15. onBegin() (当元素周期开始时由onbegin 事件立即触发)
16. onBlur() (另一个窗口弹出当前窗口失去焦点时触发)
17. onBounce() (当marquee对象的behavior属性设置为“alternate”且字幕的滚动内容到达窗口一边时触发)
18. onCellChange() (当数据提供者的数据变化时触发)
19. onChange() (select,text, 或TEXTAREA字段失去焦点并且值发生变化时触发)
20. onClick() (表单中点击触发)
21. onContextMenu() (用户需要在攻击区域点击右键)
22. onControlSelect() (当用户在一个对象上创建控件选中区时触发)
23. onCopy() (用户需要复制一些东西或使用execCommand("Copy")命令时触发)
24. onCut() (用户需要剪切一些东西或使用execCommand("Cut")命令时触发)
25. onDataAvailable() (用户需要修改元素中的数据,或者由攻击者提供的类似功能)
26. onDataSetChanged() (当数据源对象变更导致数据集发生变更时触发)
27. onDataSetComplete() (数据源对象中所有数据可用时触发)
28. onDblClick() (用户双击一个表单元素或链接)
29. onDeactivate() (在激活元素从当前对象转换到父文档中的另一个对象时触发)
30. onDrag() (在元素正在拖动时触发)
31. onDragEnd() (当用户完成元素的拖动时触发)
32. onDragLeave() (用户在拖动元素离开放置目标时触发)
33. onDragEnter() (用户将对象拖拽到合法拖曳目标)
34. onDragOver() (用户将对象拖拽划过合法拖曳目标)
35. onDragDrop() (用户将一个对象(例如文件)拖拽到浏览器窗口)
36. onDragStart() (当用户开始拖动元素时触发)
37. onDrop() (当拖动元素放置在目标区域时触发)
38. onEnded() (在视频/音频(audio/video)播放结束时触发)
39. onError() (在加载文档或图像时发生错误)
40. onErrorUpdate() (当从数据源对象更新相关数据遇到错误时在数据绑定对象上触发)
41. onFilterChange() (当滤镜完成状态变更时触发)
42. onFinish() (当marquee完成滚动时攻击者可以执行攻击)
43. onFocus() (当窗口获得焦点时攻击者可以执行攻击代码)
44. onFocusIn() (当元素将要被设置为焦点之前触发)
45. onFocusOut() (攻击者可以在窗口失去焦点时触发攻击代码)
46. onHashChange() (当锚部分发生变化时触发攻击代码)
47. onHelp() (攻击者可以在用户在当前窗体激活时按下F1触发攻击代码)
48. onInput() (在 <input> 或 <textarea> 元素的值发生改变时触发)
49. onKeyDown() (用户按下一个键的时候触发)
50. onKeyPress() (在键盘按键被按下并释放一个键时触发)
51. onKeyUp() (用户释放一个键时触发)
52. onLayoutComplete() (用户进行完打印或打印预览时触发)
53. onLoad() (攻击者在窗口加载后触发攻击代码)
54. onLoseCapture() (可以由releaseCapture()方法触发)
55. onMediaComplete() (当一个流媒体文件使用时,这个事件可以在文件播放前触发)
56. onMediaError() (当用户在浏览器中打开一个包含媒体文件的页面,出现问题时触发事件)
57. onMessage() (当页面收到一个信息时触发事件)
58. onMouseDown() (攻击者需要让用户点击一个图片触发事件)
59. onMouseEnter() (光标移动到一个对象或区域时触发)
60. onMouseLeave() (攻击者需要让用户光标移动到一个图像或表格然后移开来触发事件)
61. onMouseMove() (攻击者需要让用户将光标移到一个图片或表格)
62. onMouseOut() (攻击者需要让用户光标移动到一个图像或表格然后移开来触发事件)
63. onMouseOver() (光标移动到一个对象或区域)
64. onMouseUp() (攻击者需要让用户点击一个图片)
65. onMouseWheel() (攻击者需要让用户使用他们的鼠标滚轮)
66. onMove() (用户或攻击者移动页面时触发)
67. onMoveEnd() (用户或攻击者移动页面结束时触发)
68. onMoveStart() (用户或攻击者开始移动页面时触发)
69. onOffline() (当浏览器从在线模式切换到离线模式时触发)
70. onOnline() (当浏览器从离线模式切换到在线模式时触发)
71. onOutOfSync() (当元素与当前时间线失去同步时触发)
72. onPaste() (用户进行粘贴时或攻击者可以使用execCommand("Paste")函数时触发)
73. onPause() (在视频或音频暂停时触发)
74. onPopState() (在窗口的浏览历史(history 对象)发生改变时触发)
75. onProgress() (攻击者可以在一个FLASH加载时触发事件)
76. onPropertyChange() (用户或攻击者需要改变元素属性时触发)
77. onReadyStateChange() (每次 readyState 属性变化时被自动调用)
78. onRedo() (用户返回上一页面时触发)
79. onRepeat() (事件在播放完重复播放时触发)
80. onReset() (用户或攻击者重置表单时触发)
81. onResize() (用户改变窗口大小时,攻击者可以自动以这种方法触发:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
82. onResizeEnd() (用户完成改变窗体大小时触发)
83. onResizeStart() (用户开始改变窗体大小时触发)
84. onResume() (当元素继续播放时触发)
85. onReverse() (当元素回放时触发)
86. onRowsEnter() (用户或攻击者需要改变数据源中的一行)
87. onRowExit() (用户或攻击者改变数据源中的一行后退出时触发)
88. onRowDelete() (用户或攻击者需要删除数据源中的一行)
89. onRowInserted() (user or attacker would needto insert a row in a data source)
90. onScroll() (用户需要滚动或攻击者使用scrollBy()函数)
91. onSeek() (当用户在元素上执行查找操作时触发)
92. onSelect() (用户需要选择一些文本-攻击者可以以此方式触发: window.document.execCommand("SelectAll");)
93. onSelectionChange() (当用户选择文本变化时触发-攻击者可以以此方式触发: window.document.execCommand("SelectAll");)
94. onSelectStart() (当用户开始选择文本时触发-攻击者可以以此方式触发: window.document.execCommand("SelectAll");)
95. onStart() (在marquee 对象开始循环时触发)
96. onStop() (当用户按下停止按钮或离开页面时触发)
97. onStorage() (当Web Storage更新时触发)
98. onSyncRestored() (当元素与它的时间线恢复同步时触发)
99. onSubmit() (需要用户或攻击者提交表单)
100.onTimeError() (用户或攻击者设置时间属性出现错误时触发)
101.onTrackChange() (用户或攻击者改变播放列表内歌曲时触发)
102.onUndo() (用户返回上一浏览记录页面时触发)
103.onUnload() (用户点击任意链接或按下后退按钮或攻击者强制进行点击时触发)
104.onURLFlip() (当一个高级流媒体格式(ASF)文件,由一个HTML+TIME(基于时间交互的多媒体扩展)媒体标签播放时,可触发在ASF文件中内嵌的攻击脚本)
105.seekSegmentTime() (这是一个方法可以定位元素某个时间段内中的特定的点,并可以从该点播放。这个段落包含了一个重复的时间线,并包括使用AUTOREVERSE属性进行反向播放。)
|