阅读该文章上半部分请点击九维团队-绿队(改进)| XSS漏洞介绍与防御(上)。
1.常量
静态变量 |
描述 |
DOM |
CAPTURING-PHASE
|
当前事件阶段为捕获阶段(1) |
1 |
AT-TARGET
|
当前事件是目标阶段,在评估目标事件(1) |
2 |
BUBBLING-PHASE
|
当前的事件为冒泡阶段 (3) |
3 |
2,属性
属性 |
描述 |
DOM |
bubbles
|
返回布尔值,指示事件是否是起泡事件类型。 |
2 |
cancelable
|
返回布尔值,指示事件是否可拥可取消的默认动作。 |
2 |
currentTarget
|
返回其事件监听器触发该事件的元素。 |
2 |
eventPhase
|
返回事件传播的当前阶段。 |
2 |
target
|
返回触发此事件的元素(事件的目标节点)。 |
2 |
timeStamp
|
返回事件生成的日期和时间。 |
2 |
type
|
返回当前 Event 对象表示的事件的名称。 |
2 |
3.方法
描述 |
DOM |
|
initEvent()
|
初始化新创建的 Event 对象的属性。 |
2 |
preventDefault()
|
通知浏览器不要执行与事件关联的默认动作。 |
2 |
stopPropagation()
|
不再派发事件。 |
2 |
方法
方法 |
描述 |
DOM |
addEventListener()
|
允许在目标事件中注册监听事件(IE8 = attachEvent()) |
2 |
dispatchEvent()
|
允许发送事件到监听器上 (IE8 = fireEvent()) |
2 |
removeEventListener()
|
运行一次注册在事件目标上的监听事件(IE8 = detachEvent()) |
2 |
3.2 事件监听对象
方法
方法 |
描述 |
DOM |
handleEvent() |
把任意对象注册为事件处理程序 |
2 |
方法
方法 |
描述 |
DOM |
createEvent() |
2 |
3.4 鼠标/键盘事件对象
属性
属性 |
描述 |
DOM |
altKey
|
返回当事件被触发时,"ALT" 是否被按下。 |
2 |
button
|
返回当事件被触发时,哪个鼠标按钮被点击。 |
2 |
clientX
|
返回当事件被触发时,鼠标指针的水平坐标。 |
2 |
clientY
|
返回当事件被触发时,鼠标指针的垂直坐标。 |
2 |
ctrlKey
|
返回当事件被触发时,"CTRL" 键是否被按下。 |
2 |
Location
|
返回按键在设备上的位置 |
3 |
charCode
|
返回 onkeypress 事件触发键值的字母代码。 |
2 |
key
|
在按下按键时返回按键的标识符。 |
3 |
keyCode
|
返回 onkeypress 事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码。 |
2 |
which
|
返回 onkeypress 事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码。 |
2 |
metaKey
|
返回当事件被触发时,"meta" 键是否被按下。 |
2 |
relatedTarget
|
返回与事件的目标节点相关的节点。 |
2 |
screenX
|
返回当某个事件被触发时,鼠标指针的水平坐标。 |
2 |
screenY
|
返回当某个事件被触发时,鼠标指针的垂直坐标。 |
2 |
shiftKey
|
返回当事件被触发时,"SHIFT" 键是否被按下。 |
2 |
方法 |
描述 |
W3C |
initMouseEvent()
|
初始化鼠标事件对象的值 |
2 |
initKeyboardEvent()
|
初始化键盘事件对象的值 |
javascript:alert(
/xss/
);
<
a
href
=
javascript:alert(1)
>
111
</
a
>
<!--引号可以去掉-->
<!--支持伪协议的属性有:href,lowsrc,bgsound,background,action,dynsrc-->
<!-- 好多浏览器都不支持了,a标签还支持,但是需要点击才能生效-->
*左右滑动查看更多
浏览器在解析 HTML 文档时无论按照什么顺序,主要有三个过程:HTML 解析、JS 解析和 URL 解析,每个解析器负责 HTML 文档中各自对应部分的解析工作。
首先浏览器接收到一个 HTML 文档时,会触发 HTML 解析器对 HTML 文档进行词法解析,这一过程完成 HTML 解码并创建 DOM 树,接下来 JavaScript 解析器会。介入对内联脚本进行解析,这一过程完成 JS 的解码工作,如果浏览器遇到需要 URL 的上下文环境,这时 URL 解析器也会介入完成 URL 的解码工作,URL 解析器的解码顺序会根据 URL 所在位置不同,可能在 JavaScript 解析器之前或之后解析。
浏览器的解析规则:浏览器收到 HTML 内容后,会从头开始解析。当遇到 JS 代码时,会使用 JS 解析器解析。当遇到 URL 时,会使用 URL 解析器解析。遇到 CSS 则用 CSS 解析器解析。尤其当遇到复杂代码时,可能该段代码会经过多个解析器解析。
<
img
src
=
#
onerror
=
"alert##x28/xss/##x29"
>
<
img
src
=
#
onerror
=
"alert##x000000000028/xss/##x29"
>
<!--首先经过HTML解析将alert##x28/xss/##x29"解析为alert(1),然后JS解析器解析后执行alert(1),导致弹窗。
然后第二个payload中##x000000000028不管有多少个0,HTML解析器都会正常解析,绕WAF的时候非常有用-->
<
img
src
=
#
onerror
=
"u0061lert(/xss/)"
>
<!--首先经过HTML解析,然后JS解析器成功将u0061lert(/xss/)解析为alert(/xss/)所以能弹窗
但是用 Unicode 转义序列来表示一个控制字符时,例如单引号、双引号、圆括号等等,
它们将不会被解释成控制字符,而仅仅被解码并解析为标识符名称或者字符串常量-->
<
a
href
=
"javascript:%61lert%281%29"
>
xss
</
a
>
<!--首先经过HTML解析,因为href会涉及到URL所以会先进行URL解析,
将%61lert%281%29解析为alert(1)最后再经过JS解析器成功解析alert(1)
URL 解析过程中有一个细节了,不能对协议类型进行任何的编码操作,否则URL解析器会认为它无类型-->
*左右滑动查看更多
双写
大小写
一些案例
<
img
src
=
#
onerror
=
"location='javascript:alert(1)'"
>
<
img
src
=
#
onerror
=
"location='javascript:%61lert%281%29'"
>
<
img
src
=
#
onerror
=
"location='jx61vascript:%61lert%281%29'"
>
<
img
src
=
#
onerror
=
"locu0061tion='jx61vascript:%61lert%281%29'"
>
<
img
src
=
#
onerror
=
"locu0061tion='java'+'scri'+'pt:'+'ale'+'rt%281%29'"
>
*左右滑动查看更多
对用户输入进行严格的验证和过滤,确保输入的数据符合预期格式。
使用可信任的输入过滤库或框架,如OWASP Java Encoder或ESAPI,对用户输入进行编码或过滤,以防止恶意脚本注入。
2、输出编码
在将用户输入输出到Web页面前,对输出进行适当的编码,以确保浏览器将其视为纯文本而不是可执行的代码。
使用HTML实体编码或JavaScript函数进行输出编码,将特殊字符转换为对应的实体或转义序列。
3、内容安全策略(Content Security Policy,CSP)
使用CSP可以限制浏览器加载和执行的内容源,防止恶意脚本的注入。
在HTTP响应头中设置CSP策略,限制允许加载的脚本、样式表和其他资源的来源。
下面是一些具体的安全配置示例,可用于防范XSS漏洞:
输入验证和过滤的安全配置示例:
使用OWASP Java Encoder对用户输入进行HTML实体编码:
String
encodedInput = Encoder.forHtml(input);
*左右滑动查看更多
使用ESAPI库对用户输入进行过滤和编码:
String
filteredInput = ESAPI.encoder().canonicalize(input);
*左右滑动查看更多
输出编码的安全配置示例:
在JSP页面中使用JSTL的 <c:out> 标签进行HTML实体编码输出:
<c:
out
value
=
"${userInput}"
escapeXml=
"true"
/>
*左右滑动查看更多
在Java代码中使用HTML实体编码进行输出:
String
encodedOutput = StringEscapeUtils.escapeHtml4(output);
*左右滑动查看更多
内容安全策略(Content Security Policy,CSP)的安全配置示例:
在HTTP响应头中添加CSP策略:
Content-Security-Policy:
default
-src
'self'
; script-src
'self'
'unsafe-inline'
; style-src
'self'
'unsafe-inline'
*左右滑动查看更多
以上示例演示了一些常用的防范XSS漏洞的安全配置措施,但具体的安全措施应根据应用程序的特定需求和架构进行调整和定制。在实施防御措施时,开发人员应综合考虑输入验证、输出编码和CSP等多个层面的安全防护。此外,持续进行安全漏洞扫描和代码审查,并及时更新应用程序和相关依赖的版本,以确保最新的安全修复得到应用。
参考链接
https:
//www.runoob.com/jsref/dom-obj-event.html
注:文中部分图片来源于网络
往期回顾
原文始发于微信公众号(安恒信息安全服务):九维团队-绿队(改进)| XSS漏洞介绍与防御(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论