网络常见安全漏洞 | 青训营

83 阅读7分钟

什么是漏洞

一个网站的基本构成

  • 前端:Javascript、vue、react
  • 网关:nginx
  • 后端:Go、Java、Node
  • 前后端交互:HTTP、WebSocket

常见安全事件

  • 数据泄露
  • 服务瘫痪
  • 成果失窃
  • 系统劫持

网络攻击者意图

  • 政治目的
  • 经济目的
  • 竞争目的
  • 炫技、泄愤

服务端漏洞

第三方组件漏洞

  • 漏洞出现方式:打印日志、解析json等
  • 防护方式:针对Java可以选择使用dependency-check-maven检查项目依赖的组件是否存在安全漏洞

SQL注入

  1. Java 错误使用语言框架,或者语言框架本身存在安全问题。
    例如,使用Mybatis-plus的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险。
  2. Java Mybatis使用$构建SQL模板。
    例如,使用 $ ,实际的SQL语句为:SELECT id,name,pwd,age FROM t_user info WHERE id='xx'
  3. Golang常见错误写法:业务场景经常遇到根据用户定义的字段进行排序的功能,如果直接将用户输入字段作为维度带到Order则会产生SQL注入,假设GORM语句为:db.Order(param).Find(&products),攻击者可以输入SQL语句,改变原始SQL语义。
  • 防护方式:
  1. 尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架
  2. 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题
  3. 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义

命令执行

  • 特点:代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接。如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制。
  • 防护方式:
  1. 对动态的值尽可能设置白名单进行验证
  2. 如果某些位置无法白名单,需要尝试对数据类型进行校验
  3. 特殊字符黑名单的过滤,或者转义

越权漏洞

  • 越权:资源访问或操作时候主体权限没有进行校验就会造成越权问题,细分为:未授权、水平授权和垂直授权

水平越权

  • 黑灰产场景:订单查询功能提供订单id即可查询订单详情,这里攻击者可以遍历orderId获取其他用户的订单信息
  • 防护方式:涉及资源id尽量不要使用短id(遍历难度较小),同时最重要的一定要做好资源属主校验

垂直授权

  • 黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情
  • 防护方式:如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口

SSRF

  • SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作。
  • 黑灰产场景:由于服务端请求stockApi,获取结果返回的特性,攻击者将stockApi参数改为内网地址,访问内网资源。
  • 防护方式:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否为内网地址。

文件上传漏洞

  • 特点:找到公开的上传点(如视频创作/文章创作/客服反馈等),上传恶意文件(恶意视频、图片) ,获取图片url,然后直接分享url至外部恶意网站或QQ/微信群。
  • 防护方案:
  1. 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式
  2. 站库分离:应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储
  3. 防止图床:对图片访问链接进行限制,包括时间限制、访问身份限制等。

客户端漏洞

开放重定向

  • 特点:某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的URL,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点
  • 危害:钓鱼攻击
  • 修复方案:对重定向严格进行白名单控制并正确校验匹配白名单

XSS

  • 特点:跨站脚本攻击,本质是一种Script代码注入,攻击者往目标Web页面里插入恶意Script代码,当用户访问页面(有客户端时需要交互)时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
  • 场景:反射型,存储型,Dom型
  • 危害:通常包括窃取用户敏感信息,以用户身份执行敏感操作
  • 防护方法:
  1. 输入过滤:对输入的特殊字符进行拦截,禁止前端提交特殊字符
  2. 输出过滤:
    • 当字符输出到Dom时候,对危险字符进行html encode,避免XSS
    • 使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令。v-html/v-text
  3. 富文本场景:比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和attribute,可以在代码层面做白名单或者黑名单
  4. CSP:用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。Content-Security-Policy:default-src 'self'; img-src * ; media-src example.org example.net;srcipt-src userscripts.example.com

CSRF

  • 特点:跨站请求伪造,允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。
  • 危害:用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等。
  • 防护方式:防护的核心是判断请求的来源
  1. CSRF tokens:首次访问时候给客户端传递一个token,客户端每次访问时候都必须带上此token才能访问。
  2. SameSite cookies:Strick->Lax(Default)->None,核心是禁止某些场景发送第三方cookie。
  3. Referer-based validation:校验Referer来源是否是合法站点。

点击劫持(clickjacking)

  • 特点:是一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮)之下,并诱使用户点击的手段,用户点击后往往会执行一些非预期的操作。
  • 防护方式:防护的核心是不让非预期的网站iframe我的站点
  1. X-Frame-Options:DENY/SAMEORIGIN
  2. CSP:frame-ancestors指令,用于设置允许frame的source列表。

CORS跨域配置错误

  • 特点:全称是“跨域资源共享”,用以解决网页应用跨域访问的需求
  • 防护方式:核心是正确设置跨域白名单
  1. 代码层:Middleware统一处理
  2. 网关层:Nginx反代统一拦截处理

WebSocket

  • 特点:区别于http,只是不同的交互协议,本质上http服务端的漏洞,在WebSocket也可能存在。
  1. WSS和WS:WSS是WebScokets over SSL/TLS,提供加密通道。杜绝一些中间人攻击。
  2. 数据校验:SQL/XSS/RCE等漏洞仍然可能存在。
  3. CSWSH:Cross-Site WebSocket Hijacking,即在使用cookie作为认证方式的时候,如果WebSocket服务端没有校验好请求来源(Origin),将导致WebSocket会话劫持。
  • CSWSH防护手段:
  1. Cookie鉴权:限制请求的Origin
  2. ticket/token鉴权:http服务提供接口,用于获取临时的身份凭证,并传递到WebSocket的初始化流程中