XSS(Cross Site Script)又叫CSS,即跨站脚本攻击,指的是攻击者通过在Web页面写入恶意脚本,当有用户浏览该页面时,Web页面里的恶意脚本会被运行,从而达到控制用户浏览器进行操作的攻击方式。XSS使用的攻击代码是-JavaScript,其攻击目标是普通用户,并不是服务器。
XSS漏洞分为反射型XSS、存储型XSS、DOM型XSS三类。其中反射型XSS漏洞是指在用户发送请求的时候,请求中的js脚本发给web服务器,web服务器在接收到请求后没有对js脚本进行任何过滤和限制,即原封不动的把请求内容响应给客户端,使得客户端浏览器在解析过程中触发XSS,反射型XSS影响的是独立的单个用户,且在处理过程中和数据库服务器(DBS)进行交互;DOM型XSS是基于文档对象模型的一种漏洞,其触发点在DOM当中,它可以在不与服务器进行交互的情况下触发,影响的也是独立的单个用户,且与反射型XSS一样,所产生的影响都是一次性的;存储型XSS又叫持久性XSS,其恶意脚本被持久化存储在服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS漏洞非常危险,且造成的危害比较持久,容易造成大量盗窃cookie。
关于XSS的常用绕过手法有:双写绕过或大小写绕过、包含onerror属性的img标签、javascript:伪协议绕过、抓包编码绕过等。
XSS漏洞可造成的危害有:被窃取管理员账号或cookie、后台增删改文章、会话劫持、键盘记录、XSS钓鱼攻击、XSS蠕虫、网页挂马等,严重影响用户的正常使用。
关于XSS漏洞的主要防御方式有:对输入内容(和URL参数)进行过滤,对输出内容进行编码。也就是对提交的所有内容及url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码或转义处理,使脚本无法在浏览器中执行;以及设置httponly,防止客户端读取cookie等方式。
反射型XSS(Reflected)
一、Low级别
1.安全级别修改为low
2.查看源代码发现未进行限制
3.尝试使用带有alert的script语句
4.出现弹窗,表明注入成功
二、Medium级别
1.安全级别修改为medium
2.查看源代码,发现对‘<script>’进行了限制
3.我们可以尝试使用大小写绕过或者双写绕过的方式进行注入
4.两种方式都出现弹窗,表明均可注入成功
三、High级别
1.安全级别修改为high
2.查看源代码,发现其使用严格的正则表达式对script语句进行限制
3.考虑用img语句尝试绕过(<img src=1 οnerrοr=alert(1)>)
4.出现弹窗,表明注入成功
四、Impossible级别
1.安全级别修改为Impossible
2.查看源代码,发现对输入内容进行了实体化编码处理,无法绕过
存储型XSS(Stored)
(每次操作完成后记得点击“Clear Guestbook”,不然每次切回页面会出现弹窗,这也说明存储型XSS危害较大且持久)
一、Low级别
1.安全级别修改为low
2.查看源代码发现未进行限制,使用带有alert的script语句尝试绕过
3.出现弹窗,表明注入成功
二、Medium级别
1.安全级别修改为Medium
2.查看源代码,发现其对message模块的输入内容进行了实体化编码处理,所以考虑从name模块尝试绕过,且源代码中对name模块的输入内容中的‘<script>’进行了限制,所以我们采用大小写绕过或者双写绕过的方式
3.发现name模块对输入内容的字符长度进行了限制
4.我们按F12查看前端代码,选择name模块这一区域,对maxlength进行修改,然后正常输入语句
5.出现弹窗,表明注入成功
三、High级别
1.修改安全级别为High
2.查看源代码,发现其在Medium级别的基础上进一步限制
3.修改长度限制后在name模块输入img语句尝试绕过,发现出现弹窗,表明注入成功
四、Impossible级别
1.安全级别修改为Impossible
2.查看源代码,发现对message模块和name模块的输入内容都进行了实体化编码处理,无法绕过
DOM型XSS(DOM)
一、Low级别
1.安全级别修改为Low
2.查看源代码,发现未进行限制
3.发现只有url地址栏可输入内容,用带有alert的script语句尝试绕过
4.按回车键(enter)出现弹窗,表明注入成功
二、Medium级别
1.安全级别修改为Medium
2.查看源代码,发现对”<script”进行限制,使用img语句尝试绕过
3.未出现弹窗,我们查看前端代码,发现需要构造闭合
4.在url地址栏输入</option></select><img src=1 οnerrοr=alert(1)>,回车后出现弹窗,表明注入成功
三、High级别
1.安全级别修改为high
2.查看源代码,发现白名单,我们需要在Medium基础(构造闭合)上添加注释符#
3.出现弹窗,表明注入成功
四、Impossible级别
1.安全级别修改为Impossible
2.查看源代码,未发现有用信息
3.查看前端代码,发现Impossible级别对比High级别未经过解码处理,无法绕过