XSS实战
目录
XSS实战
看了美团安全系列一:如何防止XSS之后,根据指引去XSS Challenge 和 XSS Game实战了一下,然后来总结一下到底什么是XSS攻击以及常见的攻击和预防的方法。
什么是 XSS
XSS跨站脚本攻击(Cross-Site Scripting,为与 CSS 区分而简称XSS)是一种代码注入攻击。
通过在目标网站上注入恶意脚本并在用户浏览器端运行,攻击者可以盗窃用户的Cookie、SessionID 等敏感信息 ,甚至以此为入口,进而危害整个的服务器数据安全。
造成XSS漏洞的原因
XSS 的本质是:来自不可信来源的信息包含恶意代码,未经过滤,与网站正常的代码混在一起并被执行。
其中常见的不可信来源有两大类
- UGC信息:如用户评论,聊天等
- 请求信息:POST参数,URL参数,Referer,Cookie等
XSS攻击的分类
- 存储型:UGC信息(如用户评论)中含有恶意代码,并被存放在服务器中,用户访问该页面时,恶意代码执行。攻击者实际是以用户身份进行攻击,并且存储型攻击具有持久性,恶意代码在被处理前持续有效。
- 反射型:请求信息中含有恶意代码,被后端处理后,被整合到正常页面中返回给用户,造成恶意代码执行。由于恶意代码存在与请求中,攻击者需要诱导用户主动打开恶意的 URL 才能生效,是一次性的攻击。
- DOM型:与反射型类似,URL中含有恶意代码,但是由前端直接端处理后,被整合到正常页面中解析执行。DOM型攻击触发方式与反射型一致,也是一次性攻击。
常见XSS攻击思路
- 找注入点
- 注入代码
- 闭合上下标签,注入scirpt,“><
- 在url中注入,?redirect_to=javascript:alert(xxx);
- src或img中onload/onerror=alert(xxx)
- 如果存在过滤
- 转义字符\
- HTML实体符号
- 如果屏蔽<>,则无法加入新的script标签,但可以首先用"闭合上一属性,新增可以使用js的其他属性(事件处理函数),onclick/onmouseover =alert(document.domain)
- 过滤字符,如/,domain,cookie
- 利用一次过滤,通过双写:如dodomainmain和//,产生被过滤的字符
- 转unicode或16进制编码
- unicode \u
- 16进制 \x
对应的防御措施
- 开发时注意事项
- 对cookie保护:对重要的cookie设置HttpOnly,限制 Cookie 通过 JavaScript 经由 Document.cookie 属性、XMLHttpRequest 和 Request APIs 进行访问。
- 对用户输入内容的防范:通过纯前端渲染,将代码和数据分离,并对用户输入内容进行转义和过滤,具体如下:
- 编码: 对用户输入的数据进行HTML Entity编码,使用Vue/React可以在前端 render 阶段避免 innerHTML、outerHTML 的 XSS 隐患
- 过滤: 移除用户上传的DOM属性,如onerror,onclick等,移除用户上传的Style节点、Script节点、 iframe节点等 3. 限制:如控制用户输入内容长度控制等
- XSS系统性防御措施:
- 设置CSP内容安全政策(Content Security Policy:CSP 的实质就是白名单制度,开发者提供配置明确告诉客户端,哪些外部资源可以加载和执行。可以通过HTTP 头信息的Content-Security-Policy的字段或通过网页的标签进行配置。
- XSS检测工具:使用 Arachni、Mozilla HTTP Observatory等XSS自动检测工具。