Cross-Site Scripting(XSS) 跨站脚本攻击
在页面中,注入恶意脚本
用户访问页面时,脚本执行,可能导致用户信息泄露
XSS特点
XSS Demo
// 在提交数据的时候没有验证用户数据,将有害脚本信息直接写入数据库
public async submit(ctx) {
const { content, id } = ctx.request.body
// 没有对content进行过滤
await db.save({
content,
id
})
}
// 读取数据库数据时也没有对content进行处理,直接将有害脚本返回给浏览器了
public async render(ctx) {
const { content } await db.query({
id: ctx.query.id
})
// 没有对 content 过滤
ctx.body = `<div>${content}</div>`
}
提交恶意脚本
// 提交请求
fetch('/submit', {
body: JSON.stringify({
id: '1',
content: `<script>alert('xss')</script>`
})
})
// 读取content时会得到
ctx.body = `<div>
<script>alert('xss')</script>
</div>`
XSS危害
Reflected XSS 反射型XSS攻击
- 不涉及数据库
- 从 URL 上攻击
url上的query 参数
下面是服务器端的代码,服务器端代码会从用户请求的query中去读取param这个字段,并直接生成HTML片段,如果攻击者把这个片段构造成恶意的script标签,则当用户访问该页面时,就会命中这种反射型XSS攻击
DOM-based XSS
- 不需要服务器的参与
- 恶意攻击的发起 + 执行,全在浏览器端完成
基于DOM的XSS攻击和反射型XSS攻击比较类似,区别是注入脚本的地方
反射型XSS是在服务端进行注入,而基于DOM的XSS攻击是由浏览器这一侧完成闭环
Mutation-based XSS 基于Mutation的XSS攻击
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器会有区别(按浏览器进行攻击)
下图中上面的p标签的内容在浏览器中会被渲染成下面的三行
其中img标签中的 src 属性的值不符合规范,所以会触发onerror错误回调函数
Cross-site request forgery(CSRF) 跨站伪造请求
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
CSRF demo
用户收到email,email 中有一个恶意链接,访问恶意页面,在恶意页面中,攻击者构造了一个HTTP请求,如向银行发起一个转账请求,这个请求在另外一个域名,假设右边的server A银行的服务器接收到了这个请求,这个请求上有用户的cookie,并且这个cookie验证通过,server A 会认为这是一个合法的请求,就会执行转账,完成攻击
在整个流程中,用户并没有访问银行的页面,但银行页面中的特定接口却被请求了,并且请求还执行成功了
CSRF--GET
跨站伪造请求最常见的方式就是get请求,并且非常容易构建
写一个a标签或img标签,用户点击或图片加载,就完成请求和攻击