DOM型xss
对象模型(Document Object Model),即大名鼎鼎的DOM。
DOM可以被认为是一种通过将页面元素以对象的树形方式表现,以便由Javascript组织处理的实现方法。
特点2 无需服务器参与
为什么右键查看源代码 无法找到插入的payload
源代码 来源于服务器的返回 而dom型xss无需服务器的参与 所以此时无法修改右键查看的源代码
- DOM XSS与反射型XSS和存储型XSS的差别是在于DOM
XSS的代码不需要服务器解析响应的直接参与,触发XSS漏洞靠的是浏览器DOM解析器的解析,和服务器没有直接关系,可以完全认为是客户端的事情。
第二个,往往查看源码无法找到我们拼凑进去的标签
' onclick=alert(/xss/) //
htmlspecialchars()函数的功能如下:
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
’ (单引号)成为 ’
< (小于)成为 <
(大于)成为 >
它的语法如下:
htmlspecialchars(string,flags,character-set,double_encode)
其中第二个参数flags需要重要注意,很多开发者就是因为没有注意到这个参数导致使用htmlspecialchars()函数过滤XSS时被绕过。因为flags参数对于引号的编码如下:
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
默认是只编码双引号的!默认只编码双引号!默认只编码双引号……重要的事情说三遍!!!
htmlspecialchars绕过
代码
<?php
$js_inject = htmlspecialchars($_GET['inject']);
$js = "<img src = '$js_inject' > ";
echo $js; ?>
轻松绕过:
加上ENT_QUOTES参数:
$js_inject = htmlspecialchars($_GET['inject'], ENT_QUOTES);
$js = "<script>$js_inject</script>";
echo $js;
htmlspecialchars并不能杜绝xss漏洞
简单混淆
混淆绕过