1. XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
- 反射性XSS
- 存储型XSS
- DOM型XSS
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入
输出转义:根据输出点的位置对输出到前端的内容进行适当转义
2. 反射型XSS(get)
尝试在输入框中直接写入<script>alert(1)</script>,发现长度被限制了:

F12打开检查,发现该输入框有长度限制,将maxlength=20的值改为100:

再次写入<script>alert(1)</script>:

3. 反射型XSS(post)
根据提示登录:

尝试在输入框中写入123后开启Burp抓包:

输入的参数赋值给了message,将message的值改为<script>alert(1)</script>后提交:


4. 存储型XSS
将恶意语句写入留言板中:

每当有用户访问该页面就会触发并执行恶意代码:


5. DOM型XSS
当我们输入任何数据都会转换为一个网页,输入test后点击click me:

发现test拼接到url了:

在网页源代码也可以看见输入的test在点击click之后生成了标签

利用JS伪协议:javascript:alert("123")

6. XSS盲打
登录管理员后台账号admin,密码123456:

成功登录:

尝试提交带有弹窗的留言:

在后台查看:


7. XSS过滤
尝试直接插入<script>alert(1)</script>

发现并没有弹窗,而且上传的内容是没有显示的。
查看源码:

发现是对script关键字进行了过滤。
尝试大小写绕过<ScRiPt>alert(1)</ScRiPt>:

尝试标签绕过<img src="" onerror=alert(1)>

8. XSS之htmlspecialchars
尝试直接插入<script>alert(1)</script>

发现htmlspecialchars函数 把",<,>等都进行转义和HTML编码了。
但是发现单引号没有被过滤掉 (htmlspecialchars函数默认是不过滤单引号的)。
JS伪协议绕过:javascript:alert("123")

单引号闭合+事件标签绕过:test' onfocus='alert(1)'

9. XSS之href输出
href属性的值可以是任何有效文档的相对或绝对URL,包括片段标识符和JavaScript代码段。
JS伪协议绕过:javascript:alert("123")

10. XSS之js输出
输入测试代码<script>alert(123)</script>查看源码:

输入的代码被生成在js中并赋值给$ms。
尝试闭合<script>标签:</script><script>alert(1)</script>
