信息系统可分为物理、网络、主机、应用、数据五个层面,因此应用的安全问题也涉及到这个五个方面。
安全问题类型划分
物理环境安全:
计算机设备及存储介质的安全,需要加强安全防范意识。重要信息的备份,废弃磁盘、文件的及时销毁。
通信链路安全:
入侵者可能在传输线路上安装窃听装置,窃取网上传输的信号,再通过一些技术手段读取数据信息,造成信息泄露;
或者对通信链路进行干扰,破环数据的传输和完整性。
网络系统安全:
攻击者通过网络窃听来窃取内部重要信息,或通过网络估计造成网络服务的瘫痪。(开发者需主要关注的问题)
架构安全、传输加密、访问控制和入侵防护
DDos流量清洗、web防火墙、安全卫士、漏洞扫描、堡垒机、网页防篡改、日志审计
主机安全:
身份鉴定、访问控制、审计安全、资源控制、恶意代码防护
应用系统安全:
身份鉴定、访问控制、审计安全、资源控制、软件容错(故障检测、故障恢复、缺陷处理等)
数据安全
数据保密、数据备份、个人信息保护、数据完整性
安全措施:
技术方面的措施
信息传输的安全
1、信息加密
2、数字签名
分为签名过程和验证过程,
签名过程是将签名者的私有信息作为密钥,对数据流进行加密或生成密码校验值;
验证过程是利用公开的规程和信息来确定签名是否属于正确的签名者
3、身份鉴别
只有主体了解的秘密:口令,密码
主体携带的物品:令牌
主体具备的独一无二的特征:签字、指纹等
4、访问控制
采用最小特权原则,不给用户赋予其工作范围之外的任何权限
5、网络控制技术
防火墙技术
入侵检测技术
安全协议
1)、对现有网络协议进行修改和补偿
2)、在网络传输层和应用层之间增加安全子层,如安全协议套接字层(SSL),安全超文本传输协议(https)
依据安全协议实现身份鉴别、密钥分配、数据加密、防止信息重传和不可否认等安全机制。
信息存储的安全
需保证数据库安全和终端安全
网络传输信息内容的审计
对进出内部网络的信息进行实时审计,以防止或追查可能的泄密行为
管理方面的措施
法律方面的措施
漏洞类型
1、弱口令
弱密码类型:
1、空密码。
2、用户名和密码相同情况(如用户名auth-proxy,密码为auth-proxy)
3、密码为:用户名+常见词(如用户名auth-proxy,密码为auth-proxy@2021)
4、连续的数字、字母(如123456)
5、公司(全称or简称)+连续的(字母or数字)(如:ctyun123456)
6、任意连续的键盘密码等(如:1qaz2wsx)
7、使用组件的默认密码
密码要求:
-
密码强度要求:最短8位数,建议12位以上;数字、大小写字母、特殊字符组合;
-
定期更新密码;更新密码规则:对外使用的密码建议三个月一次(例如:freeipa密码),业务系统内部使用密码六个月一次(具体根据业务情况而而定);更新密码不准用之前使用的密码。
-
禁止密码公私混用,避免私人密码泄露对业务系统的危害。
-
部署组件后,设置、更新等密码操作需要先执行安全扫描工具(cthsSecScan),确保工具支持的弱密码检测类型未报告问题
2、Web注入漏洞
SQL注入
产生原因:
在设计程序时,忽略了输入字符串中夹带的SQL指令的检查,一些有危害的指令被数据库当作正常的SQL指令执行,导致数据被窃取、更改或删除。
常见防范方法:
1、所有的查询语句都是用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户的输入变量嵌入到SQL语句中;
2、对进入数据库的特殊字符(‘ “ <>&*;等)进行转义处理,或编码转化;
3、严格控制web用户的数据库操作权限;
命令注入
产生原因:
开发人员考虑不周,在使用web应用程序执行系统命令时对用户输入的字符未进行过滤或过滤不严格。
防范方法:
1、尽量避免允许应用执行外部命令;
2、对输入的外部指令进行严格的过滤;
XXE注入
产生原因:
XXE(XML Eeternal Entity,XML外部实体),当允许引用xml外部实体时,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网等危害。
防范方法:
1、不允许应用引用xml外部实体;
2、不允许引用的外部xml中含有自己申明的DTD(document type definition)。
SSFR注入
SSFR(Server-side Request Forgery,服务端请求伪造),是一种由攻击者构造的服务端发起请求的安全漏洞,其目标是从外网无法访问的内部系统。因为它是从服务端发起的,所有能够请求到与它相连的内部系统。
产生原因:
应用加载远程资源(图片或者url)时过滤、限制不严格,可能包含一些恶意脚本,从而造成危害
危害点:
1、加载外部恶意木马文件执行
2、加载内部的敏感文件
3、访问内网进行内网端口扫描,获取内网设备信息,枚举内网服务等
防范方法:
1、对加载的url进行过滤和限制;
2、屏蔽或过滤返回的详细信息;
反序列化
反序列化API暴露,导致用户可以操作传入数据,攻击者可以精心构造反序列化对象并执行恶意代码。
产生原因:
漏洞产生原因大多是因为反序列化时没有进行校验,或者有些校验被绕过,最终使得恶意代码的序列化对象在服务器端被反序列化执行。
(15年的Apache Commons Collections 反序列化远程命令执行漏洞,其当初影响范围包括:WebSphere、JBoss、Jenkins、WebLogic 和 OpenNMSd等。
2016年Spring RMI反序列化漏洞
17年的:Jackson,FastJson)
1、利用JtaTransactionManager类中可以被控制的readObject()方法,从而构造恶意的被序列化类,其中利用readObject()会触发远程恶意类中的构造函数,达到目的。
防范方法:
1、类白名单校验
官方的ObjectInputStream中resolveClass里只进行了class是否能被load的判断,我们可以自定义ObjectInputStream,重载resolveClass的方法,对className进行白名单校验。
2、禁止执行外部Runtime.exec命令
可以通过扩展Security Manager实现
(深入理解 JAVA 反序列化漏洞 (seebug.org))
3、文件包含
开发人员希望代码更加灵活,所有通过将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,导致客户端可以调用一个恶意文件,造成文件包含漏洞。常见于php语言。
文件包含
文件包含分为LFI(Local File Inclusion,本地人间包含)和RFI(Remote File Inclusion,远程文件包含)。
任意文件读取
属于文件操作漏洞的一种,可以读取配置信息甚至重要的系统文件。
产生原因:
存在读取文件的函数;
读取文件的路径用户可控,且未校验或校验不严;
输出了文件内容;
防范防范:
严格校验读取文件的路径;
任意文件下载
有些业务需求需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就可能下载任意的敏感文件,这就是任意文件下载漏洞。
产生原因:
1、有文件读取函数;
2、读取文件的路径用户可控,且未校验或校验不严;
3、会输出文件内容;
4、存在文件下载功能,同时还会从浏览器接收文件名字;
防范方法:
严格校验读取文件的路径;
任意文件上传
文件上传的地方能够上传任意类型的文件,攻击者可恶意上传木马文件对服务器进行攻击。
产生原因:
没有对上传的文件进行严格的限制和校验
防范方法:
前后端对文件传入的文件格式均需做校验,仅前端限制做限制有可能被绕过。
总结
漏洞产生原因大多为操作或编码不规范,对信息缺乏必要的校验或校验不足。
1、在思想上要提高安全意识,坚决杜绝弱密码;
2、在开发过程中,对涉及公网的产品,能加密的尽量加密,可校验的仅可能校验;
3、密切关注涉及到的中间件及相关工具包的漏洞信息,及时更新相关的补丁和修复。