Medium Level
查看代码
<?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(string,find,start)
返回字符串在另一字符串中第一次出现的位置(不区分大小写),如果没有找到字符串则返回 false 。
可以看到,Medium级别的代码先检查了default参数是否为空,如果不为空则将default等于获取到的default值。基于黑名单的思想,这里还使用了stripos 用于检测default值中是否有 <script (不区分大小写),如果有的话,则将 default=English 。
很明显,这里过滤了 <script ,那么我们可以使用<img src=1 onerror=alert('xss')>绕过。
漏洞利用
我们尝试访问URL:
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English<img src=1 οnerrοr=alert('xss')>
发现并没有弹出任何页面
我们查看网页源代码,发现我们的语句被插入到了value值中,但是并没有插入到option标签的值中,所以img标签并没有发起任何作用。
所以我们得先闭合前面的标签,构造链接:
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English</option><img src=1 onerror=alert('xss')>
发现我们的语句还是没有执行
我们查看网页源代码,发现我们的语句中还是只有 English 被插入到了option标签的值中
于是我们继续构造语句去闭合select标签
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English</option></select><img src=1 onerror=alert('xss')>
可以看到,我们的语句成功执行了
查看网页源代码,发现此时我们的img标签就是独立的一条语句了
参考:https://blog.csdn.net/qq_36119192/article/details/82932557