网络安全概述
常见的安全事件
数据泄漏 国公共卫生系统公布了一起大规模数据泄露事件,超130万人受到该事件影响。入侵网站的黑客可获取到病人的个人信息,其中包括病人的出生日期、家庭住址等。
服务瘫痪 某老牌航空公司因遭黑客攻击,官网出现技术性故障,整个系统突然崩溃中断。当天几乎所有航班均被延误,后续超188个航班受到影响。
成果失窃 某芯片制造巨头被爆逋到勒索软件攻击,入侵者成功访问并在线泄露了员工私密信息及登录数据,黑客宣称可以访问1TB的企业数据。
系统劫持 某国导弹袭击警报响彻云霄,持续了几乎一个小时,疑为网络攻击引发的误报。
蓝军
反向验证企业内部安全现状,以攻促防
红军
系统建设时候帮助企业提前规避漏洞
服务端漏洞
第三方组件漏洞
导入的第三方组件可能存在bug或者系统漏洞,会破坏我们系统的安全。
解决:
java中可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞
SQL注入
-
错误使用语言框架,或者框架本身存在安全问题
使用Mybatis-plus 的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险。
-
mybatis使用$构建SQL模板
使用「$」,实际的SQL语句:
SELECT id,name,pwd,age FROM t_user_info WHERE id = 'xx'会存在sql注入风险。而使用#就不会出现,因为用了?作为参数占位符:
使用「#」,实际的SQL语句:
SELECT id,name,pwd,age FROM t_user_info WHERE id = ?
-
go中常见错误写法。
业务场景经常遇到根据用户定义的字段进行排序的功能,如果直接将用户输入字段作为维度带到Order则会产生sQL注入,假设GORM语句为: db.Order(param).Find(&products)
正常情况用户输入维度字段即可实现自定义排序
param: code SQL语句:
SELECT * FROM products WHERE products . deleted_atIS NULL ORDER BY code攻击者可以输入sql语句来实现sql注入:
param: if(1, sleep(10),'code') SOL语句:
SELECT* FROM productsWHEREproducts deleted_at lS NULORDER BY if(1, sleep(10), 'code')
防护方式:
- 尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架
- 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题。
- 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义。
命令执行
代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制
防护方式:
- 对动态的值尽可能设置白名单进行验证。
- 如果某些位置无法白名单,需要尝试对数据类型进行校验。
- 特殊字符黑名单的过滤,或者转义。
越权漏洞
认证:你是谁
授权:你能做什么?
越权:越过权限去做自己不能做的事
未授权:
水平越权:
防护方式: 涉及资源id尽量不要使用短id(遍历难度较小),同时最重要的一定要做好资源属主校验(资源属于谁)
垂直越权:
黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情。
防护方式:如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截, Middleware获取当前用户角色以确定是否可以访问此接口。
SSRF
SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作。
SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器。 主要攻击方式如下所示。
- 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
- 攻击运行在内网或本地的应用程序。
- 对内网Web应用进行指纹识别,识别企业内部的资产信息。
- 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)。
- 利用file协议读取本地文件等。
参考文章:SSRF漏洞(原理、挖掘点、漏洞利用、修复建议) - Saint_Michael - 博客园 (cnblogs.com)
文件上传漏洞
找到公开的上传点(如视频创作/文章创作/客服反馈等),上传恶意文件(恶意视频、图片),获取图片url,然后直接分享url至外部恶意网站或QQ/微信群。
防护方案:
- 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式。
- 站库分离:应用部署的位置和上传的文件分离,一般可以使用TOS、OSs等进行文件存储。
- 防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制等。
客户端漏洞
开放重定向
开放重定向:某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的URL,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点。
危害:钓鱼攻击。
修复方案:对重定向严格进行白名单控制并正确校验匹配白名单。
XSS
跨站脚本(XSS)攻击:本质是一种Script代码注入,攻击者往目标Web 页面里插入恶意Script代码,当用户访问页面(有客户端时需要交互)时,嵌入其中 Web 里面的Script 代码会被执行,从而达到恶意攻击用户的目的。
场景:反射型,存储型,Dom型
危害:通常的危害包括窃取用户敏感信息,以用户身份执行敏感操作。
案例:
- 构造恶意链接,将username设置为恶意payload
- 攻击者通过网站反馈入口,向管理员/运营人员发送恶意链接。
- 攻击者的服务器成功收到管理员/运营人员的Session Cookie。
- 浏览器替换cookie为管理员的,获取管理员权限。
防护方法:
- 输入过滤:对输入的特殊字符进行拦截,禁止前端提交特殊字符
- 输出过滤: a. 当字符输出到Dom时候,对危险字符进行html encode,避免XSS。 b. 使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令。v-htmI/v-text
- 富文本场景:比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和attribute,可以在代码层面做白名单或者黑名单。
- CSP:用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。
Content-Security-Policy: default-src 'self; img-src *; media-src example.org example.net;script-src userscripts.example.com
CSRF
跨站请求伪造(CSRF):允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。
危害:用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等。
更改邮箱案例:
- 将更改Email的请求生成CSRF表单,并构造钓鱼链接。
- 发送链接给其他用户。
- 用户点击链接后成功执行email更改操作。
防护方式:防护的核心是判断请求的来源
- CSRF tokens:首次访问时候给客户端传递一个token,客户端每次访问时候都必须带上此token才能访问。
- SameSite cookies: Strick -> Lax(Default) -> None.核心是禁止某些场景发送第三方cookie。
- Referer-based validation:校验 Referer来源是否是合法站点。
点击劫持
点击劫持(clickjacking)是一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮之下,并诱使用户点击的手段,用户点击后往往会执行一些非预期的操作。
- 参考如下代码构造钓鱼页面链接。
代码效果:
- 发送链接给其他用户。
- 用户访问链接,点击「Win 300$」时候,实际是点击「Delete Account]
防护方式:
防护的核心是不让非预期的网站 iframe 我的站点
- X-Frame-Options: DENY/SAMEORIGIN
- CSP: frame-ancestors指令,用于设置允许frame的source列表。 Content-Security-Policy: frame-ancestors ; Content-Security-Policy: frame-ancestors 'self' example.org example.comhttps://store.exam…;
cors跨域配置错误
CORS错误配置:CORS本身不存在漏洞,而是由于开发者在配置CORS过程中,错误配置跨域访问Allow List,导致非预期的站点可以进行跨域访问,最终可能导致信息泄漏。
常见几种错误配置: 以需要跨域访问example.com所有子域名为例
- 前缀/后缀/包含/正则匹配:可用example.com.attack.com.attackexample.com、attackaexample.com域名绕过。
- 在Access-Control-Allow-Origin中反射请求的Origin值。理论上可以用任意域名绕过。
- 信任null:攻击者还可以从任意域下通过iframe sandbox构造Origin为null的跨域请求
- https信任http: http传输存在被劫持篡改可能,攻击者可能通过劫持通信流量注入恶意脚本方式窃取敏感信息。