什么是漏洞
安全事件
- 数据泄露:黑客可以获得系统内储存的重要信息
- 服务瘫痪:航空公司系统崩溃导致航班延误
- 成果失窃:黑客访问企业数据
- 系统劫持:某国防空警报突然响起(控制权限为自己所用)
网络攻击者的意图
- 政治目的:窃取关键的机密数据,破环关键系统正常运行
- 经济目的:网站数据具有很高的经济价值,攻击者通过漏洞违法获取数据进行售卖
- 竞争目的:同类厂商通过对竞品网站进行攻击来达到让对方站点无法运行的目的
- 炫技,泄愤:通过攻击网站来彰显自己的技术实力或者报复某些系统
服务端漏洞
第三方组件漏洞
- 引用第三方组件造成的一些问题,例如,打印日志或者解析json就可能导致”中病毒“
- 防护方式:针对java选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞
SQL注入
- SQL语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些sql语句关键字(SELECT,DROP等)这些SQL语句就可能在数据库写入或者读取时得到执行。
1、[Java]错误使用语言框架,或者语言框架本身存在问题
- 使用Mybatis-plus的危险函数,比如inSql,直接支持SQL拼接,存在SQL注入风险
不安全:
SELECT 'id',test_int,test_str,creat_time,update_time,'test_enum','version'FROM test_data WHERE(id IN(select id from test_data where version = 0))
安全:
SELECT 'id',test_int,test_str,creat_time,update_time,'test_enum','version'FROM test_data WHERE(id IN(select id from test_data where version = 0 or 1 = 1))
2、[Java]Mybatis使用[$]构建SQL模板
使用[#](不安全)(?表示语句):
SELECT id ,name,pwd,age FROM t_user_info WHERE id = ?
使用[$](安全)(xx表示值):
SELECT id ,name,pwd,age FROM t_user_info WHERE id = 'xx'
3、Golang常见错误写法
假设FGORM语句为db.Order(param).Find(&products)
正常情况用户输入维度字段即可实现自定义排序
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')
防护方法
- 尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架
- 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题
- 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义。
命令执行
- 代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制
在ctx.request.query("storeId")中将storeId修改为[1|id]即可注入命令id
防护方式
- 对动态的值尽可能设置白名单进行验证
- 如果某些位置无法白名单,需要尝试对数据类型进行校验
- 特殊字符黑名单的过滤,或者转义。
越权漏洞
- 资源访问或者操作时候主题权限没有进行校验就会造成越权问题,细分为:未授权、水平越权和垂直越权
水平越权
-
黑灰产场景:订单查询功能提供订单id即可查询订单详情,这里攻击者可以遍历orderId获取其他用户的订单信息
-
防护方式:涉及资源id尽量不要使用短id(遍历难度较小),同时一定要做好资源属主校验
垂直越权
-
黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情。
-
防护方式:如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口。
SSRF
- SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作
- 防护方式:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址。
文件上传漏洞
- 找到公开的上传点(如视频创作/文章创作/客服反馈等),上传恶意文件(恶意视频、图片),获取图片url,然后直接分享url至外部恶意网站或QQ/微信群
防护方案
- 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式。
- 站库分离:应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储。
- 防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制等。
客户端漏洞
开放重定向
- 某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的URL,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点
- 修复方案:对重定向严格进行白名单控制并正确校验匹配白名单。
XSS
- 跨站脚本(XSS)攻击,本质是一种Script代码注入,攻击者往目标Web页面里插入恶意Script代码,当用户访问页面(有客户端时需要交互)时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
防护方法
- 输入过滤:对输入的特殊字符进行拦截,禁止前端提交特殊字符
- 输出过滤:
- 当字符输出到Dom时候,对危险字符进行htmlencode,避免XSS。
- 使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令。v-html/v-text
- 富文本场景:比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和attribute,可以在代码层面做白名单或者黑名单。
<tagattribute1=’value1’attribute2=‘value2’/>
- CSP:用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。
Content-Security-Policy:default-src'self';img-src*;media-srcexample.orgexample.net;script-srcuserscripts.example.com
CSRF
- 跨站请求伪造(CSRF),允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。
- 漏洞利用步骤:
- Step1:将更改Email的请求生成CSRF表单,并构造钓鱼链接。
- Step2:发送链接给其他用户。
- Step3:用户点击链接后成功执行email更改操作。
防护方式
防护的核心是判断请求的来源
- CSRFtokens:首次访问时候给客户端传递一个token,客户端每次访问时候都必须带上此token才能访问
- SameSitecookies:Strick->Lax(Default)->None.核心是禁止某些场景发送第三方cookie
- Referer-basedvalidation:校验Referer来源是否是合法站点
点击劫持(clickjacking)
- 点击劫持(clickjacking)是一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮)之下,并诱使用户点击的手段,用户点击后往往会执行一些非预期的操作
- 漏洞利用步骤:
- 参考如下代码构造钓鱼页面链接。
- 发送链接给其他用户。
- 用户访问链接,点击「Win300$」时候,实际是点击「DeleteAccount」
防护方式
- 防护的核心是不让非预期的网站iframe我的站点1.X-Frame-Options:DENY/SAMEORIGIN2.CSP:frame-ancestors指令,用于设置允许frame的source列表。Content-Security-Policy:frame-ancestors;Content-Security-Policy:frame-ancestors'self' example.org example.com store.example.com
CORS跨域配置错误
- 全称是“跨域资源共享”(Cross-originresourcesharing),用以解决网页应用跨域访问的需求
- CORS本身不存在漏洞,而是由于开发者在配置CORS过程中,错误配置跨域访问AllowList,导致非预期的站点可以进行跨域访问,最终可能导致信息泄漏
防护方式
核心是正确设置跨域白名单
- 代码层:Middleware统一处理
- 网关层:Nginx反代统一拦截处理
WebSocket
- 区别于http,只是不同的交互协议,本质上http服务端的漏洞,在WebSocket上也可能存在
防护手段
- Cookie鉴权:限制请求的Origin。
- ticket/token鉴权:http服务提供接口,用于获取临时的身份凭证,并传递到WebSocket的初始化流程中
总结
网络安全漏洞是指在网络应用程序中存在的安全漏洞,它们可能会被攻击者利用来获取敏感信息或对系统造成破坏。根据OWASP(开放式Web应用程序安全项目)发布的“10项最严重的Web应用程序安全风险列表”,其中包括注入漏洞、失效的身份认证、敏感数据泄露、XML外部实体漏洞、无效的访问控制等
作为一名计算机系的学生,我深刻地意识到网络安全漏洞对我们日常生活和工作的影响。这些漏洞不仅会导致个人信息泄露,还可能导致金融损失和企业机密泄露。因此,我们必须时刻保持警惕,采取有效的防护措施来防范这些安全威胁。
在我看来,防范网络安全漏洞需要我们从多个方面入手。首先,我们需要加强个人防护意识,不要轻信来历不明的链接和邮件,谨慎输入个人信息和密码。其次,我们需要定期更新系统和软件,以便及时修补已知的安全漏洞。此外,我们还可以使用防火墙和杀毒软件等安全工具来增强系统的防护能力。
总之,网络安全漏洞是一个不容忽视的问题。我们需要不断学习新知识,提高防护能力,才能在网络世界中更好地保护自己。