三、dom型xss
DOM xss是基于dom文档对象模型,前端脚本通过dom动态修改页面,由于不与服务端进行交互,而且代码是可见的,从前端获取dom中的数据在本地执行。
常见的可以操纵dom的对象:URL,localtion,referrer等。
low源码:
dvwa下的dom型xss页面的意思是选择一种语音,只在前端执行,且代码并未对default进行处理
漏洞分析与利用:
源码并未做任何安全防护措施,所以可以直接在url上构造攻击脚本
构造脚本:
...dvwa/vulnerabilities/xss_d/?default=English<script>alert(/xss/)</script>
执行脚本:
查看页面源码,脚本已经插入value值和option标签中。
medium源码:
漏洞分析与利用:
array_key_exists检查数组里是否有指定的键名和索引,如果default值不为null,default的值就等于获取到的default。
stripos返回default中字符串<script首次出现的位置(不区分大小写),如果有,则default的值等于English,所以这里用<script>标签无法绕过,可以考虑使用<img>标签,但因为直接使用img标签的话img无法插入到option标签里,因此先闭合</option>和</select>标签。
构造脚本:
default=</option></select><img src=0 onerror=alter(/xss/)>
执行脚本:
抓取页面源代码,</option></select>已经屏蔽掉前面的<option><select>,以便后面的img内脚本得以实现。
high源码:
<?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;
}
}
?>
漏洞分析与利用:
源码先判断default值是否为空,若不空,则用switch语句进行匹配,匹配成功,则插入case字段相应值,如果匹配不成功,则执行default语句。可在?default=English设置#字符,因为#之后的字符串不会被发送到服务器,而script语句就可以在前端页面实现。
构造脚本:
?default=English#<script>alert(/xss/)</script>
执行脚本: