Xss-labs通关记录
5关一更
Level-1
URL处传入的参数name可直接修改,并且没有任何过滤,因此可直接用弹窗测试xss
1 | ?name=<script>alert('hack')</script> |
Level-2
这关后端对输出内容中的$str
变量使用了htmlspecialchars()
函数,对输入内容中的<
和>
符号进行了编码处理。
但我们查看html代码发现下面还有一行代码直接利用了之前传入的$str
参数:
1 | <input name=keyword value="'.$str.'"> |
这里的变量在input标签的属性值中,浏览器不会直接执行,因此可以使用左右闭合大法
1 | $str= "><script>alert('hack')</script>// |
这里左边的">
闭合左边的括号,中间加入js代码,右边用//
注释符号注释掉右边的闭合括号,由此完成了植入js代码完成xss的操作。
Level-3
这关在Less-2中利用的input标签中的变量处也进行了htmlspecialchars()
函数处理,看起来似乎没有地方可以下手。
但事实证明,input
标签中的可控参数即使用htmlspecialchars()
函数处理过,也并不安全。
input
标签有很多属性,同样可以触发里面的js代码,如:
1 | <input name=xx value='xx' onclick='alert(1)'> |
该input标签由于其中的onclick
属性,当鼠标点击该输入框时便会触发onclick
属性中的js代码,因此可以传入参数:
1 | $str= 'onclick='alert(1) |
即可在左右单引号闭合不出错的情况下,添加进去一个onclick属性,以便执行js代码。
同样,还有onfocus
属性和onmouseover
属性也能起到相同的效果
Level-4
与Level-3大致相同
不同点在于input标签属性里对参数的处理是直接去掉中括号<
和>
并且闭合符号变成了双引号"
依然可以用Level-3的解法
Level-5
这关查看源代码可知,对input标签属性值中的参数进行了转换小写,并替换掉其中的<script
和on
关键词,但是没有对此处的<
和>
符号进行处理,于是可以写入其他能执行js代码的html标签,如a标签和img标签:
1 | <a href=javascript:alert('hack')> xss </a> |
1 | <img src=111 onerror=alert('hack')> |
作用为生成一个链接,点击即可执行href属性中的js代码
此关的完整写法:
1 | "><a href=javascript:alert('hack')>xss</a>// |
Level-6
相比Level-5,对input标签属性处的参数进行了更多的关键字过滤,但奇迹般地去掉了Level-5中原有的转化大小写处理,因此可以用大小写的方式绕过后端的过滤(后端php代码对大小写敏感,html中对大小写不敏感)
1 | "Onclick="alert(1) |
同样的方法也适用onmouseover
属性、script标签和a标签
查看源代码发现还过滤了data
关键字,此处可以拓展出利用data执行js代码的方法:
1 | data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4= |
Level-7
这关input标签处进行了大小写转换和关键字过滤,但过滤用到了php函数str_replace()
将关键字替换为空,也就是只替换一次,所以可以通过双写来绕过过滤
1 | "oonnclick="alert(1) |
Level-8
这关相比上一关,过滤了闭合符号"
,同时将可控参数$str
引入到了a标签的href属性中
基本所有能用的符号关键字都被过滤了,大小写也进行了转换,str_replace()
函数并没有将关键字替换为空,双写绕过也不行
这时出现了新思路,可以将我们要注入的js代码进行编码,绕过后端的过滤限制,并在href
属性处执行:
1 | javascript:alert('hack') |
将js代码进行Html编码:
1 | javascript:alert(1) |
或者只把script中的任何一个字母进行编码,就能绕过过滤
1 | javascript:alert('hack') |
Level-9
类似Level-8,将可控参数引入href
属性中,但加了if语句对参数的内容进行判断,判断参数内容中是否含有 http:// 字样,因此可以用上一关的编码解法,最后加个 **//http://**即可绕过判断并执行前面的js代码
1 | javascript:alert('hack')//http:// |
js代码与http关键字之间要加个 // 起到注释作用,不然不会执行js代码
Level-10
查看源码可以知道有个参数t_sort
的值可利用并且只进行了闭合括号的过滤,并且在input标签的属性中,但该input标签的属性为type=hidden
,即一个隐藏框,直接通过闭合双引号引入onclick
、onmouseover
属性的话会由于点不到而无法触发
这里可以自己构造更改该标签的type属性
1 | t_sort="type="text" onclick="alert(1) |
这样该输入框就会显示出来,点击即可触发js代码
Level-11
查看源代码可以发现,变量$str11
通过http头的Referer
字段获取变量值
1 | $str11=$_SERVER['HTTP_REFERER']; |
该变量在过滤掉<>
后放进了和Level-10类似的属性为hidden
的input框中,抓包伪造Referer
的值,原理与Level-10类似:
1 | Referer:"type="text" onclick="alert(1) |
Level-12
与Level-11类似,伪造http中的User-Agent
字段即可
1 | User-Agent:"type="text" onclick="alert(1) |
Level-13
与前两关类似,修改网页设置的Cookie中的user
字段值即可
1 | Cookie: user="type=text onclick="alert(1) |
Level-14
本关因iframe调用的文件地址失效,无法进行测试。
要考的应该是通过修改iframe调用
的文件来实现xss注入
Level-15
这关来看源码
1 | $str = $_GET["src"]; |
GET方式接收参数,进行转义处理后放进span
标签中的ng-include
属性中
知识点补充:
1 | 1、ng-include 指令用于包含外部的 HTML文件。 |
特别注意:
1 | 1.ng-include,如果单纯指定地址,必须要加引号 |
既然可以用来包含html文件,那么就可以利用它来包含之前已经有xss漏洞的源html文件:
1 | src='level1.php?name=<a href=javascript:alert(1)>Xss</a>' |
Level-16
同样GET传参,转换为小写后,将其中的script、空格、**/分别替换为字符 ** (HTML中的空格占位符),将处理后的值放在标签center
中显示出来
绕过思路:使用回车来将注入的代码分开,并且由于/
被过滤,所以需要一个不用闭合的标签,比如<img>
标签
1 | <img |
回车可以用URL编码格式%0a
来表示
1 | keyword=<img%0asrc="111"%0aonerror=alert(1)> |
Level-17
GET方式传入两个参数,进行htmlspecialchars()
编码处理后放入embed
标签的src
属性中
1 | <embed> 标签定义了一个容器,用来嵌入外部应用或者互动程序(插件) |
可直接在第二个参数后面接空格,加入onclick
或onmouseover
属性执行js代码
1 | arg01=a&arg02=b onmouserover=alert(1) |
也可以直接F12,在控制台中找到embed
标签,在其中手动加入onclick
或onmouseover
属性
Level-18
与Level-17一样,略
Level-19
与Level-17相比,在第二个参数后面添加onmouseover
属性会被识别为普通文本,只能在F12控制台中手动添加
Level-20
与Level-19一样,手动添加,略
——2021.4.7
- 本文作者: Squidward
- 本文链接: http://www.squidward.xyz/2021/03/25/Xss-labs通关记录/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!