Web安全开发(攻击篇) | 青训营

56 阅读2分钟

Cross-Site Scripting(XSS) 跨站脚本攻击

在页面中,注入恶意脚本

用户访问页面时,脚本执行,可能导致用户信息泄露

image.png

XSS特点

image.png 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危害

image.png

Reflected XSS 反射型XSS攻击

  • 不涉及数据库
  • 从 URL 上攻击

url上的query 参数

下面是服务器端的代码,服务器端代码会从用户请求的query中去读取param这个字段,并直接生成HTML片段,如果攻击者把这个片段构造成恶意的script标签,则当用户访问该页面时,就会命中这种反射型XSS攻击

image.png

DOM-based XSS

  • 不需要服务器的参与
  • 恶意攻击的发起 + 执行,全在浏览器端完成

image.png

基于DOM的XSS攻击和反射型XSS攻击比较类似,区别是注入脚本的地方

反射型XSS是在服务端进行注入,而基于DOM的XSS攻击是由浏览器这一侧完成闭环

image.png

Mutation-based XSS 基于Mutation的XSS攻击

  • 利用了浏览器渲染DOM的特性(独特优化)
  • 不同浏览器会有区别(按浏览器进行攻击)

下图中上面的p标签的内容在浏览器中会被渲染成下面的三行

其中img标签中的 src 属性的值不符合规范,所以会触发onerror错误回调函数

image.png

Cross-site request forgery(CSRF) 跨站伪造请求

  • 在用户不知情的前提下
  • 利用用户权限(cookie)
  • 构造指定HTTP请求,窃取或修改用户敏感信息

CSRF demo

用户收到email,email 中有一个恶意链接,访问恶意页面,在恶意页面中,攻击者构造了一个HTTP请求,如向银行发起一个转账请求,这个请求在另外一个域名,假设右边的server A银行的服务器接收到了这个请求,这个请求上有用户的cookie,并且这个cookie验证通过,server A 会认为这是一个合法的请求,就会执行转账,完成攻击

image.png

在整个流程中,用户并没有访问银行的页面,但银行页面中的特定接口却被请求了,并且请求还执行成功了

CSRF--GET

跨站伪造请求最常见的方式就是get请求,并且非常容易构建

写一个a标签或img标签,用户点击或图片加载,就完成请求和攻击

image.png