理论知识
DOM就是一个树状的模型,你可以编写Javascript代码根据dom一层一层的节点,去遍历/获取/修改对应的节点,对象,值。了解了这么一个知识点,你就会发现,其实dom xss并不复杂,他也属于反射型xss的一种(domxss取决于输出位置,并不取决于输出环境,因此domxss既有可能是反射型的,也有可能是存储型的),简单去理解就是因为他输出点在DOM。dom - xss是通过url传入参数去控制触发的)
说白了,某些页面会调用某些特定函数,这些特定函数或改变页面的DOM节点,本漏洞就是利用这个特性写入恶意代码的。
低级
查看源码
<?php
# No protections, anything goes
?>
啥也没有,正常,因为这个漏洞主要作用于前端。
选择一门语言点击Select,url会变化,因为没有任何过滤,我们可以直接更改url所传的参数
将上传的default参数改为:
<script>alert(1)</script>
这时我们可以F12查看页面源码:
select 元素可创建单选或多选菜单。< select> 元素中的 < option> 标签用于定义列表中的可用选项。也就是我们看到的下拉的列表,我们通过更改参数创建了一个新的可选项,它的内容是< script>alert(1)</ script>,但对于前端页面来说,这句话是被赋予特定意义的,并不是简单的字符串,html会以自己固定的译码方式来翻译,并执行。
中级
中级源码过滤了<script
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
# Do not allow script tags
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
stripos函数是在某个字符串中查找另一个字符串第一次出现的位置,
其实我们的XSS注入是更改了服务器发送给页面的包,也就是说用户会先将数据从前端上传给服务器,服务器在返回到前端,中级难度就是在传到服务器后过滤了一下在将应答返回到页面
这里这种过滤方式我们是无法用双写或大小写绕过的,这里我们可以通过:
</option></select><img src=1 onerror=alert('1')>
< /option>< /select>是为了闭合前面< option>< select>,这两类标签都属于双写标签,后面的就是我们插入的恶意语句,有弹窗说明执行成功。
F12查看前段代码:
可以看到先闭合,在插入。
高级
查看源码:
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# White list the allowable languages
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
default:
header ("location: ?default=English");
exit;
}
}
?>
这次只能选择固定的几个,如果有其他参数呈递全部改为English,这个时候我们可以在English后面加一个#,#对于html是跳转的意思,不会把#后面的东西传达到后端,只会在前端执行
没反应的时候刷新一下页面就好了