聊聊常用的web攻击及防御

566 阅读5分钟

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

  • XSS(Cross Site Scripting)跨站脚本攻击,因为缩写与CSS重叠,所以只叫XSS。利用方式主要是借助网站本身设计不严谨,用户注入恶意js脚本,对网站自身造成危害。
  • XSS分类
    • 反射型(通过url参数直接注入)
    • 存储型(在输入框,注入攻击脚本,页面回显时,运行这段脚本,就可以进行攻击)
    • 总结:在网站本身没有做XSS防御的情况下,反射型和存储型,二者可以形成一种链式攻击。
  • XSS危害
    • 利用脚本窃取用户的cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求
    • 显示伪造的文章或图片
    • 利用xss篡改网页
    • 总结:script能干啥,它就能改变啥。
  • 防御
    • X-XSS-Protection 是一个响应头,当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。
    • CSP
    • HttpOnly Cookie

二.CSRF 跨站请求伪造 (Cross Site Request Forgery)

  • 跨站请求伪造(Cross Site Request Forgery),是一种常见的Web攻击,它利用用户已登陆的身份,在用户毫不知情的情况下,以用户的名义完成非法操作。
  • 防御
    • 验证HTTP Referer字段
    • 在请求地址中添加token并验证
    • 在HTTP头中自定义属性并验证

三.ClickJacking 点击劫持 (视觉欺骗)

  • 点击劫持是一种视觉欺骗手段。攻击者将需要攻击的网站通过iframe嵌套的方式嵌入自己的网页中,并将iframe设置为透明,在用户透出一个按钮诱导用户点击。
  • 防御
    • 概念:X-Frame-Options是一个HTTP响应头,在现代浏览器有很好的支持,这个HTTP响应头就是为了防御用iframe嵌套的点击劫持攻击
    • DENY:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
    • SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。
    • ALLOW-FROM uri:表示该页面可以在指定来源的 frame 中展示
    ctx.set('X-Frame-Options', 'DENY')
    

四.SQL注入

  • SQL注入就是一种通过操作输入,来修改后台SQL语句达到代码执行进行攻击目的的技术。
  • 例子
      // 填入特殊密码
      1'or'1'='1
      
      // 拼接后的SQL
      SELECT *
      FROM test.user
      WHERE username = 'tiankai'
      AND password = '1'or'1'='1'
    
    // 错误写法
    const sql = `SELECT * FROM test.user WHERE username = '${ctx.request.body.username}' AND password = '${ctx.request.body.password}'
    console.log('sql', sql)
    res = await query(sql)`
    
    // 正确写法
    const sql = `SELECT * FROM test.user WHERE username = ? AND password = ?`
    console.log('sql', sql)
    res = await query(sql,[ctx.request.body.username,ctx.request.body.password])
    
  • 防御
    • 特殊字符转义:escape处理,一般会用到两个函数mysql_real_escape_string()addslashes()(PHP语法)

    • mysql_real_escape_string()函数会转义:' " \r \n NULL Control-Z

    • addslashes()函数会转义:' " 反斜线和NULL

    • 这种方式对付通过SQL注入绕过登录认证,即所谓的万能密码,特别有效。也可用来对付字符型注入,因为攻击者需要注入单引号来达到引号平衡。

五.OS命令注入

  • OS命令注入攻击指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用shell函数的地方就有存在被攻击的风险
    const exec = require('mz/child_process').exec;
    let params = {/* 输入参数 */};
    exec(`git clone ${params.repo} /some/path`)
    
  • 如果传入的参数
    https://github.com/xx/xx.git && rm -rf /* &&
    
  • 防御
    • 在进入执行命令函数和方法前,对变量进行过滤,对敏感字符进行转义。

六.请求劫持 (DNS劫持 HTTP劫持)

  • DNS劫持
    • DNS服务器被篡改,修改了域名解析的结果,使得访问到的ip不是预期的ip。
    • 防御
      • 首先,选择较为权威的DNS解析服务商做域名解析,可以有效降低因为DNS解析服务商的漏洞导致域名解析记录被篡改的发生。
      • 其次,结合使用DNS加速类的产品,可以持续不断的刷新DNS缓存,从而保障在DNS服务器缓存的数据得以实时更新,减少在解析请求过程中被劫持篡改的几率。
      • 还有一些目前推出的DNS劫持监控功能,也能及时的发现各地DNS解析的情况,一旦发生问题可以针对性的进行解决,避免损失进一步加大。
  • HTTP劫持
    • 表现形式:打开的网页,下方角落会有一些小广告,有时候这些广告,不是访问站点为了盈利而投放的广告,而是第三方的运营商提供的,这就是HTTP劫持。
    • 原理
      • 在TCP连接中,找出应用层采用了HTTP协议的连接,进行标识。
      • 篡改HTTP响应体,可以通过网关获取数据包进行内容的篡改。
      • 抢先回包,将篡改后的数据包抢先正常站点返回的数据包先到达用户侧,这样后面正常的数据包在到达之后会被直接丢弃
    • 防御
      • 使用HTTPS

七.DDOS (distributed denial of service)

  • 短时间内大量访问,把网络资源,CPU全部占满,导致网站无法正常响应,导致网站实质下线。
  • 例子
    • 我开了一家餐厅,正常情况下,最多可以容纳30个人同时进餐。你直接走进餐厅,找一张桌子坐下点餐,马上就可以吃到东西。很不幸,我得罪了一个流氓。他派出300个人同时涌进餐厅。这些人看上去跟正常的顾客一样,每个都说"赶快上餐"。但是,餐厅的容量只有30个人,根本不可能同时满足这么多的点餐需求,加上他们把门口都堵死了,里三层外三层,正常用餐的客人根本进不来,实际上就把餐厅瘫痪了。这就是 DDOS 攻击,它在短时间内发起大量请求,耗尽服务器的资源,无法响应正常的访问,造成网站实质下线。
  • 防御
    • 添加备份网站:不需要是全功能网站,只要是个静态页面就行,告诉用户网站出了问题,全力维修。
    • HTTP请求的拦截:HTTP 请求的特征一般有两种:IP 地址和 User Agent 字段。比如,恶意请求都是从某个 IP 段发出的,那么把这个 IP 段封掉就行了。
    • 带宽扩容,CDN