xss的绕过姿势(一)

本章提及的几种姿势将在dvwa靶场进行演示

下拉列表DOM型XSS的绕过姿势

安全等级:Medium

image-20230413193725293

URL:

1
http://localhost:8081/dvwa/vulnerabilities/xss_d/?default=English

猜测与尝试

注意到有下拉列表,且在URL中修改default=后面的值时能回显至页面的下拉列表中

例:

1
http://localhost:8081/dvwa/vulnerabilities/xss_d/?default=xxxxxxxx

image-20230413194753854

尝试提交payload

image-20230413195409867

提交后发现default后面的值又变回English了

image-20230413195320527

猜测是做了过滤,检测到尖括号或者关键词就替换回 English

查看源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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;
}
}

?>

原来是检测到 <script 就马上重定向

尝试大小写绕过

image-20230413195758325

image-20230413195832077

失败,查资料后发现stripos()函数是不区分大小写的

stripos () 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。 注释: stripos () 函数是不区分大小写的。

解决方案

注意到关键点:下拉列表

下拉列表html源码如下

image-20230413200331330

考虑让下拉列表提前闭合,让回显的选项暴露在外。

闭合直接闭合 select 标签“:(不用担心没有闭合option标签,浏览器很智能的,会给你补全)

image-20230413200945750

成功,选项都暴露在外边了

image-20230413201246205

那么换成xss代码(script标签被过滤了,换img标签)

image-20230413201427653

image-20230413201516611

成功。

安全等级:high

猜测与尝试

难度提升,继续上传上面构造的payload

image-20230413202039408

马上被重定向了

image-20230413202111895

猜测1:img标签被过滤

猜测2:select标签被过滤

猜测3:无论在default后面加什么都不会生效

进行验证:

image-20230413202252042

image-20230413202617389

image-20230413202324322

发现无论在default后面输入什么都会被重定向

查看源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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;
}
}

原来是进行了白名单过滤,只允许提交以上的值

解决方案

锚点注入技术的运用

锚点注入: 在URL的井号后面添加JavaScript脚本是一种称为“锚点注入”的技术,它可以实现在页面加载时执行JavaScript代码。但是,这种技术并不是所有浏览器都支持,而且也存在一些安全风险。

如果浏览器支持锚点注入,那么在URL的井号后面添加JavaScript脚本是可以运行的。例如,以下URL会在页面加载时弹出一个警告框:

1
http://example.com/page.html#<script>alert('Hello, world!');</script>

但是,为了保证网站的安全性,大多数现代浏览器已经禁止了锚点注入这种技术。因此,不建议在URL中使用锚点注入来执行JavaScript代码,而应该使用更安全的方法,如在HTML文档中嵌入JavaScript代码或在外部JavaScript文件中编写代码。

关键: 在井号后面添加javascript脚本

在URL后面加井号,在井号后面随便加点什么

image-20230413204816325

没有被重定向!

接下来 换成js脚本

image-20230413204911747

第一次回车没反应,第二次回车成功执行alert语句

image-20230413205049632

image-20230413210134469

这是是GPT关于我以上疑问的解释。我信你个鬼!!!!

还得靠自己琢磨:

分析新的问题

在井号后面随便加点什么东西:如aaaa

image-20230413210940178

发现第一次回车时,页面下拉列表选中的还是English

image-20230413211120141

第二次回车时,下拉列表中才变成English#aaaa

image-20230413211219895

STFW,看到了这个

仅改变井号后面的内容,只会使浏览器滚动到相应的位置,并不会重现加载页面。

改变策略,同样在井号输入aaaa。但是只回车一次,没反应。然后右键,重新加载

image-20230413213050839

起到了和两次回车一样的效果:

image-20230413213131563

可见改变井号后面的内容,然后回车时,这属于是修改操作,没有重新加载页面。

而点击URL,再次按回车时,此时的回车会导致页面重新加载。

所以会不会是因为缓存的原因?

再次请GPT出山

image-20230413213225519

第一次回车时,由于没有重新加载页面,此时井号后面添加的脚本还没有被缓存到浏览器

第二次回车时,浏览器重新加载了页面,此时井号后面的脚本被缓存到了浏览器,并被加载执行。

问题解决。

题外话:问GPT一个问题时,不要轻信第一次的回答,多问几次,自己再上网求证。