web基础漏洞-xss
1、介绍
xss,cross site script跨站脚本攻击。在用户的浏览器上解析攻击者构造的payload作为脚本执行,从而造成危害。
2、场景
2.1 反射型xss
测试参数在url的路径参数、直接参数中,或者表单请求体部中。响应体部包含该参数,并可以构造解析为脚本
title标签之间不能嵌套其他任何标签,不执行
head标签是可以嵌套body、img等体部标签的
textarea标签内部不能嵌套任何标签,会将其作为普通文本
script标签之间是不能嵌套任何标签的
style标签之间是不能嵌套任何标签的,不解析
noscript标签也不能嵌套其他标签
2.2 存储型xss
攻击者将payload保存到服务端,其它用户请求包含payload的资源,payload在响应体部中可以解析为脚本。
2.3 dom型xss
基于响应页面的脚本,读取攻击者构造的payload,执行造成危害。
eval()
window.execScript()
window.setInterval()
window.setTimeout()
document.write()
document.writeln()
document.body.innerHTML=''
document.forms[0].action=''
document.attachEvent()
document.create()
document.execCommand()
document.body.
window.attachEvent()
document.open()
window.open()
window.location.href=''
document.locaiton=''
document.location.hostname=''
document.location.replace=''
document.location.assign()
document.URL=''
window.navigate()
#jquery
2.4 其它
- 4xx或5xx,将参数写入响应体部
- 个人管理后台,csrf伪造请求将payload写入,然后再自己请求触发
3、防护
(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
4、测试&绕过
(1)反射型的测试
- 判断请求是否为非ajax、响应是否为html页面,请求是否存在测试参数
- 测试参数是否存在返回,这个过程一般是采用干扰较小的payload,比如test000
- 敏感字符过滤,主要是<>'"/五个字符,当然其它字符也有可能作为xss的利用点
- 基于输出点和敏感字符过滤构造payload
(2)存储型
与反射型基本一致,区别在于分析响应可能需要另外请求
(3)dom型
- 分析数据流向,常见的是cookie和location.hash、location.query
- 查找敏感的js函数或属性
5、渗透经验
(1)比较偏门的几个测试点
- 404等状态码页面
- 参数包含敏感字符响应警告
- jsonp或其它非html响应,直接地址栏请求或者表单请求
- 路径参数和伪静态页面的参数
(2)某次测试过程中,其它敏感字符和关键字被防火墙过滤,且cookie无法获取
先基于load方法将数据加载到当前页面的某元素中,再基于img的onerrer事件,持续读取加载的数据发送给攻击者。
需要注意,这个过程中,由于onerrer的作用是设置this.src=攻击者控制的网站接口+读取元素文本,不是合法的src属性,所以会反复触发onerrer事件。而load方法是异步加载,所以前几次onerrer并不能读取到真正的数据,需要等到加载完成才能够成功获取