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

97 阅读8分钟

序言

本文主要记录了网站安全漏洞相关的内容,从客户端和服务端的角度分别介绍了几种常见的安全漏洞,并且,针对每一种漏洞提出了具体的防护方案,通过本文可以对网站安全漏洞方面的知识达到初步的认识和了解。

1.安全事件

  1. 数据泄露:应用系统发生大规模数据泄露事件,入侵网站的黑客可获取到病人的个人信息,其中包括病人的出生日期、家庭住址等。
  2. 服务瘫痪:系统遭黑客攻击,系统崩溃中断。
  3. 成果失窃:入侵者访问用户信息,窃取用户信息。
  4. 系统劫持:劫持系统,触发危机。

2.漏洞分类

2.1 服务的漏洞

  1. SQL注入
  2. RCE/命令注入
  3. SSRF
  4. 文件上传

2.2 客户端漏洞

  1. XSS
  2. CSRF
  3. 点击劫持

2.3 服务端漏洞

2.3.1 第三方组件漏洞

  1. 使用日志服务时,组件漏洞。
  2. 解析Json格式数据时,数据中含有漏洞信息。

保护方式: 可以选择使用相关的组件依赖工具检查项目组件是否存在安全漏洞。

2.3.2 SQL注入

SQL语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些SQL语句关键字(比如说 SELECT、DROP等等),这些SQL语句就很可以在数据库写入或读取数据时得到执行。
1.查询语句
select * from user where user_id = 这条语句通过id查询某个用户信息,当传入的id如下,通过union拼接后,会查询更多的信息。
select * from user where user_id = id + union + select +1, +1, + 1
2.错误使用框架,或者框架本身存在安全问题
例如,使用Mybatis-plus 的危险函数inSql,支持直接SQL拼接,存在SQL注入风险。
select * from user where (user_id in (select user_id from user where 字段=value or 1=1))
3.MyBatis使用#{}代替${}。

示例:select * from user where user_id = ${id},存在漏洞,实际执行的sql语句:select * from user where user_id = id
修改:select * from user where user_id = #{id},解决了漏洞,实际执行的sql语句:select * from user where user_id = ?
防护SQL注入

  1. 尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架。
  2. 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题。
  3. 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义。

2.4 命令执行

代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制。
防护方式

  1. 对动态的值尽可能设置白名单进行验证。
  2. 如果某些位置无法白名单,需要尝试对数据类型进行校验。
  3. 特殊字符黑名单的过滤,或者转义。

2.5 越权漏洞

分为:未授权、水平越权和垂直越权。

2.5.1 水平越权。

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

2.5.2 垂直越权。

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

2.6 SSRF

SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作。
服务端流程: 服务端请求stockApi,获取结果返回。
攻击者: 将stockApi参数改为内网地址,访问内网资源。

2.7 文件上传

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

2.4 客户端漏洞

2.4.1 开发重定向

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

2.4.2 XSS

跨站脚本 (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,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。

2.4.3 CSRF

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

2.4.4 点击劫持

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

3. 总结

通过本节课程内容,我们学习了网站安全漏洞相关的内容,从客户端和服务端的角度分别介绍了几种常见的安全漏洞。熟悉了解了每一种安全漏洞问题的原因和解决方式,比如针对SQL注入中,使用MyBatis框架时,#{}${}的使用,${}存在安全漏洞问题,它是一种字符串插值或变量替换的语法,用于表达将变量或表达式的值动态插入到字符串中,${}的值会被直接替换到生成的查询字符串中,如果不进行适当的转义和处理,会导致SQL注入。而#{}一种参数化查询的占位符格式,用于将用户输入作为查询的参数传递,将用户提供的参数进行适当的转义和处理,而不是将其值插入到查询语句中,如同SQL拼接中的,判断类型和值,从而防止SQL注入,保证查询的安全性。