一、初识XSS(Cross Site Scripting)
1.1、什么是XSS?
XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览改页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取等。
1.2、XSS产生原因、漏洞原理
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
1.3、XSS会造成那些危害?
攻击者通过Web应用程序发送恶意代码,一般以浏览器脚本的形式发送给不同的终端用户。当一个Web程序的用户输入点没有进行校验和编码,将很容易的导致XSS。
1、网络钓鱼,包括获取各类用户账号 2、窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作; 3、劫持用户(浏览器)会话,从而执行任意操作,例如非法转账、强制发表日志、电子邮件等 4、强制弹出广告页面、刷流量等 5、网页挂马; 6、进行恶意操作,如任意篡改页面信息、删除文章等 7、进行大量的客户端攻击,如ddos等 8、获取客户端信息,如用户的浏览历史、真实p、开放端口等 9、控制受害者机器向其他网站发起攻击; 10、结合其他漏洞,如csrf,实施进步危害; 11、提升用户权限,包括进一步渗透网站 12、传播跨站脚本蠕虫等
二、XSS常见出现的地方
2.1、数据交互的地方
get、post、cookies、headers
反馈与浏览
富文本编辑器
各类标签插入和自定义
2.2、数据输出的地方
用户资料
关键词、标签、说明
文件上传
三、基本介绍
本质: 由于过度信任用户的输入,导致对输入内容校验不严格,将用户输入的数据当作有效前端代码来执行
危害:
会话劫持,盗取Cookie,伪装用户登陆
窃取用户信息,强制弹出广告页面,页面篡改
传播跨站蠕虫,网页挂马、提权
分类:
按大类分: 可分为持久型和非持久型(又称为反射型)
按形式分: 反射型、存储型、DOM型
漏洞点:
数据交互的地方,输入框,URL参数,Cookie、POST表单、HTTP头、
翻页功能处、留言板、评论栏、UR 哈希串中
测试流程:
1.在目标站点上寻找,数据交互的地方,如:搜索框、留言板、URL参数、页码等地方
2.输入一些,特殊字符,提交后,查看源码,是否对你的输入做了处理(特殊字符过滤或转义)
3.通过搜索你的输入,查看到输出点处,是否可以对其进行标签或元素的闭合
4.构造测试代码(payload),看是否可以成功执行,执行成功则存在XSS漏洞
附: 如果在输入payload时有长度限制可以直接在查看当前输入点的源码处,修改标签属性绕过限制
四、详细剖析
4.1、反射型跨站脚本(Reflected Cross-site Scripting):
也称作非持久型、参数型跨站脚本、一次性
攻击流程: 前端输入→后端解析→前端输出
原理:
将用户输入的数据通过URL的形式直接或未经过完善的安全过滤就在浏览器中进行输出
导致输出的数据中存在可被浏览器执行的前端代码;因为只执行一次,且只有用户访问
带有该漏洞的URL时才会触发攻击,所以一般被攻击者用来做钓鱼使用,诱骗受害者访
问该页面,从而完成攻击
4.2、存储型跨站脚本(Stored Cross-site Scripting):
持久型、比反射型危害更大
攻击流程: 前端输入→经过后端→存入数据库→前端调用数据→前端输出
原理:
将用户输入的数据通过后端存入网站数据库中,当网页被浏览时,网页进行
数据查询展示时,会从数据库中获取数据内容并将数据内容在网页中输出展
示,只要用户浏览了包含此恶意代码的页面就会触发攻击,此类XSS不需要
用户访问特定的URL就能执行,攻击者事先将恶意恶意代码提交存储到服务器中
4.3、DOM型跨站脚本(DOM Cross-site Scripting):
类似反射型XSS,只不过反射型是由后端解析输出到前端而DOM型是直接由前端的JS解析后输出,一次性
攻击流程: 前端输入→前端JS解析输出
原理:
类似于反射型,只不过反射型的攻击代码在URL的参数当中,
而DOM型攻击代码在URL的哈希串中(URL中#号后面的部分)
攻击者构造好带有恶意代码的URL链接,诱使用户访问带有恶意代码的URL
用户通过浏览器打开时,JS解析URL中的恶意代码并执行
五、XSS的防御
5.1、使用XSS Filter
1、输入过滤
输入验证
对用户提交的数据进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此以外的其他任何数据。
常见的检测或过滤:
输入是否仅仅包含合法的字符
输入字符串是否超过最大长度的限制
输入如果为数字,数字是否在指定的范围内
输入是否符合特定的格式要求,如邮箱、电话号码、ip地址等
2、数据消毒
除了在客户端验证数据的合法性,输入过滤中最重要的还是过滤和净化有害的输入,例如如下常见的敏感字符:
||<> ' "&# javascript expression
2、输出编码
对输出的数据进行编码,如HTML编码,就是让可能造成危害的信息变成无害。
白名单和黑名单
5.2、定制过滤策略
5.3、web安全编码规范
5.4、防御DOM-Based XSS
两点注意点:
避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务端使用动态页面来实现。
分析和强化客户端Javascript代码,尤其是一些受到影响的Dom对象
5.5、其他防御方式
Anti_XSS
微软开发的,.Net平台下的,用于方式XSS攻击的类库,它提供了大量的编码函数来对用户输入的数据进行编码,可以实现基于白名单的输入的过滤和输出编码。
HttpOnly Cookie
当Cookie在消息头中被设置为HttpOnly时,这样支持Cookie的浏览器将阻止客户端Javascript直接访问浏览器中的cookies,从而达到保护敏感数据的作用。
Noscript
Noscript是一款免费的开源插件,该插件默认禁止所有脚本,但可以自定义设置允许通过的脚本。
WAF
使用WAF,比如软WAF,硬WAF、云WAF等。