关于DVWA的学习-XSS(DOM)
Background
需要的前置知识(仅针对本部分)
low
选择语言的界面,没啥特别的,看看网页代码吧。
document.location.href: 获取当前页面URL
indexOf: 获取子字符串起始索引
document.write: 写入html代码
很清楚,我们可以在URL做文章来产生一些”效果“.
这里插入一个最常见的JS的alert语句,便可以产生弹窗效果:
这一题其实就是利用一些document函数以及简单的JS代码知识来在基本的网页上做一些手脚。
medium
不多bb,在low的基础上依旧先F12;
网页代码没有任何区别,但这时候和low一样输入script,并不能弹窗,应该是后台代码对输入参数有过滤,于是查看PHP代码:
过滤了<script
查看别人的经验贴之后得知可以利用img标签中的onerror回调函数实现弹窗:
但是这里的闭合很奇怪,因为原script中已经有了”< /option >“,在URL中又加了一个"< /option >"不会出现语法错误吗?怀着这样的疑问,我又尝试了一下
看来闭合标签个数超过并不会影响实际使用,不会报错。
第二点疑问:既然可以直接闭合< option >,那么为什么不能直接用这个:
这其实就跟< select >标签性质有关了,< select >中只能加< option >,别的不会显示,比如下面这个例子:
因此,选择先将< option >闭合,再将< script >闭合(这两个闭合顺序也不可颠倒,看看HTML代码就知道),之后插入onerror函数。
high
DVWA页面没有改变,我们直接打开PHP源码查看过滤机制:
采用了白名单机制,仅允许四种语言输入,其他字符串一律改写为English。
看了一些经验帖,在提交的URL后加上"#< script>alert(/xss/);< /script>"即可,因为url中#后面内容为跳转到页内锚点,不会发送到后端服务器。 也就避免了过滤。
关于#这里再举个例子,输入页面最下方元素的id,页面会自动下滑到底部
impossible
还挺狂,那就看看网页代码;
和之前唯一的区别就是:decodeURI(lang)和(lang)。似乎没有这个解码函数就无法解析<>等符号。
网上搜了一些经验贴,写的太垃圾了,说的都是屁话,对于这个函数的作用,还是来亲自试验一下。
这里先说一下 URL和URI的区别
也就是说只要URI中带有除了上面说的其他符号的,都会被编码,如果不使用decodeURI,就会出现下面这种情况:
总结
- 基本的HTML语法,各种标签的作用,比较特殊的包括< form>,< script>, < select>等。
- DOM的含义以及初级用法,即document提供的各种API
- XSS-DOM的弹窗方法,比如利用< script>和< img>的onerror,以及URL中的”#“的作用
- 常见的XSS-DOM防御包括服务器端过滤< script>,白名单机制,前端不使用decodeURI函数等。