web基础漏洞-xss
1、介绍
xss,cross site script跨站脚本攻击,在用户的应用上解析攻击者构造的payload作为脚本执行,从而造成危害。
- 应用,广义上包含任何支持脚本解析的程序,一般特指浏览器
- 脚本,广义上包含js、vbscript和actionscript(flash)等,一般特指js
- 狭义的说,xss实际上基于js执行场景和js代码相关
2、三个问题
2.1 如何使payload作为脚本执行
- 嵌入型:payload嵌入到html文档中,由浏览器解析html和js过程中,作为脚本代码直接执行
- 解析型:js执行过程中,读取payload作为参数,然后解析为脚本执行。比如eval、document.write
- payload在响应之前,保存到了浏览器的地址栏、cookie等数据中
- payload在响应中,作为任意数据,包括js变量、注释、元素文本
- payload在响应之后,再进行请求获取
js执行场景:浏览器执行js脚本 - 挖洞404 - 博客园 (cnblogs.com)
2.2 如何构造payload
- 嵌入型:尝试直接利用当前输出点,如果不行则构造关闭当前js或者html语法结构,再尝试
- 解析型:直接构造相对独立的js代码,或者html
html语法:
2.3 攻击者构造的payload如何传递到用户浏览器中
(1)攻击者构造包含payload的url,其直接指向目标域,基于聊天工具、网站通信、邮件等传递给用户,诱使其点击
(2)攻击者控制第三方网站,用户访问时被迫向目标域跳转
- 请求方法可以是GET或POST
- 请求可以是直接基于url跳转,或者表单请求。不能是ajax
- payload可以在url中,也可以在请求体部中
(3)攻击者访问目标域,将payload存储,为公开数据。然后用户访问该数据
3、三种常见的xss分类
- 反射型,单次请求-响应过程,payload在请求中包含,然后在响应中返回
- 存储型,两次请求-响应过程,由攻击者在初次请求过程中将payload提交保存到服务端,然后其它用户在第二次请求过程中访问payload数据
- dom型,单次请求-响应过程,响应中的js脚本读取可能存储在任意处的payload解析为脚本
4、漏洞防护
(1)cookie设置为httponly
(2)编码处理
- 输出到各处时,结合输出点类型进行编码
- 一般场景是进行html实体编码,包括元素属性值、元素事件中的字面量、元素包含的文本
- 对于script内的脚本的字面量,进行js转义编码,即添加\前缀
- 某些方案中,对元素的地址属性值中的敏感字符,会使用url编码,即%编码。比如a的href、form的action、script的src、link的href等
- 是OWASP提供的一套java编码的api,可以选择编码方式对不同html输出参数进行不同编码。防止xss
(3)csp和 X-XSS-Protection
5、渗透经验
(1)比较偏门的几个测试点
- 404等状态码页面
- 参数包含敏感字符响应警告
- jsonp或其它非html响应,直接地址栏请求或者表单请求
- 路径参数和伪静态页面的参数
(2)某次测试过程中,其它敏感字符和关键字被防火墙过滤,且cookie无法获取
先基于load方法将数据加载到当前页面的某元素中,再基于img的onerrer事件,持续读取加载的数据发送给攻击者。
需要注意,这个过程中,由于onerrer的作用是设置this.src=攻击者控制的网站接口+读取元素文本,不是合法的src属性,所以会反复触发onerrer事件。而load方法是异步加载,所以前几次onerrer并不能读取到真正的数据,需要等到加载完成才能够成功获取