Web 安全 | 青训营

137 阅读2分钟

假如你是一个攻击者,该如何攻击

假如你是一个防御者,该如何防御

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

攻击方式

脚本被注入页面,在页面中执行

XSS主要利用了 盲目信任用户的提交内容:

image.png

特点

  • 通常难以从UI上感知(暗地里执行脚本)
  • 窃取用户信息(cookie,token)
  • 绘制UI ,诱骗用户点击/填写表单

demo

public async submit(ctx){
    const {content,id} = ctx.request.body;
     await = db.save({
         content,id
     })
   }
   
public async render(ctx){
    const {content}  = await db.query({
        id:ctx.query.id
    })
       ctx.body = `<div>${content}</div>`
}

服务端,未对传来的数据做判断,返回的时候原样返回,如果有恶意脚本攻击,则会在页面中执行这个脚本

存储型XSS攻击。

  • 恶意脚本被存在数据库中
  • 访问页面 - > 读数据 === 被攻击
  • 危害最大,对全部用户可见

反射性XSS

  • 不涉及数据库
  • 恶意攻击+执行,全在浏览器执行

image.png

巧妙攻击

先看一段代码

<noscript><p title="</noscript><img src=x onerror=alert(1)>">

但是在浏览器端进行解析之后

<div>
    <noscript><p title="</noscript>
    <img src=x onerror=alert(1)>
</div>

这样就能把代码嵌入到页面中了

CSRF 跨站伪造请求

点击链接就会使得自己的信息被带到其他网站上

<a href="https://bank.com/transfer?to=hacker&amount=100">点击抽奖</a>

<img style="display:none;" src="https://bank.com/transfer?to=hacker&amount=100"  />

SQL注入

public async renderForm(ctx){
    const { username,form_id} = ctx.query;
    const result = await sql.query(`
    SELECT A,B,C from table
    WHERE username = ${suername}
    AND form_id = ${form_id}
    `)
}

Injection demo2 --读取+修改

image.png

DOS

通过某种方式,导致服务器资源被消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应

基于正则表示的Dos

image.png

DDOS

短时间内。来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效果,无法响应新的请求

中间人攻击

image.png

防御措施

xss

永远不信任,用户的提交内容

不要将用户的提交内容直接转化为DOM

现成工具

  • 主流框架默认防御 XSS
  • google-clousure-library

服务端(node)

  • DOMPurify

如果有需求是必须动态生成DOM

String -> DOM 一定做好转义,

如果允许用户上传SVG。则需要对SVG进行一次扫描,检测内部代码

对于自定义跳转链接:需要检测好内部代码

CSP

csp

  • 那些源(域名)被认为是安全的
  • 来自安全源的脚本可以执行。否则直接抛弃
  • 对eval +inline script说不

image.png

CSRF的防御

image.png

CSRF---token

image.png

CSRF--iframe 攻击

在iframe中可以发送同源请求,

在页面头部可以加上:X-Frame-Option :DENY/SAMEORIGIN

Same-setCookie

image.png

Injection防御

  • 找到项目查询SQL的地方
  • 使用prepared statement

image.png