第一节 什么是漏洞
一个网站的基本构成
前端:JavaScript / vue / react
网关:nginx
后端:Go / Java / Node
前后端交互:HTTP / WebSocket
网站前端负责页面展示和接口调用,网站后端负责提供接口和处理业务逻辑和数据,设计到的中间组件:网关代理,CDN(存储静态资源)
一些我们经常听到的安全事件:
-
数据泄露:公共网站受到黑客入侵导致系统内存储的用户信息被黑客获取,造成用户个人信息泄漏
-
服务瘫痪:公司受到黑客攻击,官网出现技术性故障,整个系统突然崩溃中断,公司所有服务均无法正常运转
-
成果失窃:公司遭受网络攻击,入侵者成功窃取并泄露了员工信息和公司机密数据,如芯片公司的最新研发数据等
-
系统劫持:入侵者直接控制整个系统,系统所有权限受入侵者操控
网站攻击者及意图
1. 政治目的:窃取关键系统机密数据,破坏系统运行
2. 经济目的:非法获取数据并售卖
3. 竞争目的:攻击竞品网站使对方站点无法正常运行
4. 炫技,泄愤:攻击网站彰显技术力或出于仇恨攻击对方系统网站实施报复
漏洞分类
网站的漏洞可以大致分为服务端漏洞和客户端漏洞两大类,服务端漏洞包括:SQL、RCE / 命令注入、SSRF、文件上传……
客户端漏洞包括:XSS、CSRF、点击劫持……
第二节 服务端漏洞
第三方组件漏洞
我们程序所使用的第三方组件(包括第三方库和第三方软件)可能存在漏洞,导致严重的系统安全问题
防护方式:针对java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞,通过更新最新版本组件解决安全漏洞
SQL注入
SQL 语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些 SQL 语句关键字(比如 SELECT、DROP 等等)这些 SQL 语句就可以在数据库写入或读取数据时得到执行。例如,在用户注册时,恶意攻击者可以通过在用户名和密码中加入SQL语句关键字的方式构造特殊SQL语句,绕过用户验证,直接获取或修改数据库中存储的数据。
案例展示
下图中查询订单详情的函数代码就存在SQL注入漏洞
我们可以通过union select查询出更多订单
以Java为例,错误使用语言框架或语言框架本身存在安全问题都可能产生安全漏洞:使用Mybatis-plus 的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险
以Java为例,Mybatis 使用拼接符 $ 构建 SQL 模板时无法防止SQL注入,应当使用占位符 # 构建SQL模板
Golang 常见错误写法
业务场景经常遇到根据用户自定义的字段进行排序的功能,如果直接将用户输入字段作为维度带到Order则会产生 SQL 注入,假设ORM 语句为:db.Order(param).Find(&products)
(在Mybatis框架中可以使用Order函数进行排序)
正常情况下用户输入维度字段即可自定义排序
param: code
SQL语句:SELECT *FROM `products` WHERE `products`.`deleted_at` IS NULL ORDER BY code
攻击者可以输入SQL语句,改变原始 SQL 语义
param: if(1, sleep(10),'code')
SQL语句:SELECT *FROM `products` WHERE `products`.`deleted_at` IS NULL ORDER BY if(1, sleep(10),'code')
防护方式
1. 尽量不要基于 DB 的 Raw 方法拼接构造 SQL 语句,而应该使用预编译、ORM 框架
2. 使用 ORM 框架时,应该注意框架的特性,可能存在不安全的写法导致 SQL 注入问题
3. 在复杂场景一定要拼接 SQL,需要对外部输入进行转义
命令执行(RCE)
代码中需要调用某个命令才能完成的功能时候,会涉及命令拼接,如果命令拼接没有做好安全过过滤,那么将会导致命令注入风险,服务器权限会被控制。
与SQL注入类似,恶意攻击者可以输入一些恶意值执行一些非预期的命令,获取内部数据
防护方式:
1. 对动态的值尽可能设置白名单进行验证
2. 如果某些位置无法白名单,需要尝试对数据类型进行校验
3. 特殊字符的黑名单过滤,或者转义
总结
本篇文章是对课程知识的部分归纳总结,介绍了什么是网络漏洞并详细介绍了服务端的第三方漏洞和注入式网络漏洞,希望能帮助各位快速了解或温习相关知识。