Java安全编码规范之Web安全漏洞
- 安全现状
- 漏洞案例
- 事件一
- 事件二
- 事件三
- 安全编码规范之常见的安全漏洞
- 敏感数据编码
- 概述
- 漏洞危害
- 常见关键字举例
- 解决方案
- 代码硬编码秘钥错误示例
- 日志打印导致的敏感信息泄露
- 漏洞概述
- 关键字举例
- 解决方案
- 代码中在日志打印token 错误示例
- 文件上传
- 漏洞概述
- 漏洞危害
- 文件上传需要进行的检测
- 文件读取
- 漏洞概述
- 漏洞危害
- 文件读取漏洞流程
- 解决方案
- 跨站脚本攻击 -XSS
- 漏洞概述
- 漏洞危害
- 问题场景
- 解决方案
- 错误代码示例
- 安全随机数
- 概述
- 安全随机数生成
- 非安全随机数
- 私有/不安全加密算法
- 概述
- 常见不安全加密算法
- 使用不安全加密算法危害
- SQL注入
- 概述
- 漏洞危害
- 判断SQL注入方式
- 示例
- 错误示例
- 正确示例
- 异常处理不当导致的敏感信息泄露
- 漏洞概述
- 漏洞危害
- 常见可抛出敏感信息的异常类
- 解决方案
- 日志注入漏洞
- 概述
- 漏洞危害
- 漏洞判断方式
- 漏洞解决方案
- 命令注入
- 漏洞概述
- 漏洞危害
- 可调用系统命令的类和函数举例
- 判断命令注入的方式
- 解决方案
- 反序列化漏洞
- 概述
- 漏洞成因以及危害
- 常见可进行反序列化函数举例
- 解决方案
- 服务端请求伪造-SSRF
- 概述
- 漏洞危害
- 常见可发起网络请求的类
- 漏洞判断思路
- 错误代码示例
- URL重定向
- 概述
- 漏洞危害
- 可重定向函数举例
- 漏洞判断方式
- 解决方案
安全现状
当公司访问量增大,自然而然就会遇到网络攻击了,同时也会需要考虑如何规范代码编写来规避这些漏洞攻击。
如果你在开发中还没有遇到过,或者说还没有思考过这些问题,可以通过这篇文章多了解下 现在的攻击是多么的厉害。同时我们在编码的时候就可以多注意一些了。
现在互联网应用如此之多,最常见的漏洞就是web安全漏洞了,白帽子(白帽子一般指白客。
白客就是指从事正当行业的黑客)更善于挖掘web漏洞,黑客也更倾向于从web中寻找漏洞作为突破
口去侵入大型的网络系统。所以 web系统也成为了各大企业首要关注和重点防护的对象。
下面简单介绍下 几个实际存在因为代码不规范导致出现的漏洞的例子。并列举下多种漏洞以及如何在我们的日常编码中避免产生这样的漏洞。
漏洞案例
现列举常见的漏洞案例:
事件一
2022年8月,某用户在某论坛上发布一则消息,称出售700个中国zhenfu和企业办公系统的RDP权限,其中包括众多软件公司的权限。还可以植入木马病毒进行勒索。
事件二
2021年某月,外部发现某公司某系统存在任意文件上传漏洞。且该上传接口存在未授权访问。攻击者可以在未登录的情况下将木马病毒上传到系统并访问,从而获得服务器权限。
事件三
2022年某月。某公司中勒索病毒,客户系统被黑客加密。经溯源发现,该公司中勒索病毒的根本原因是系统中存在文件上传漏洞,对上传的文件没有进行充分的校验。导致接口可以上传木马文件,最终服务器被攻入。
安全编码规范之常见的安全漏洞
常见的安全漏洞有:
敏感信息编码,XML注入,SQL注入,跨站脚本攻击,恶意文件上传,任意文件读取,日志注入,命令注入,反序列化漏洞,服务端请求伪造,URL重定向。
敏感数据编码
概述
硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中。
漏洞危害
造成数据难以修改,被客户质疑留后门,软件包被反编译造成关键信息泄露等.
常见关键字举例
比如 password,pass,adress,session,ID,sessionID,userName,license,decrtpt,secret,token,phone等
解决方案
将数据存储在配置文件中,并进行加密存储。
代码硬编码秘钥错误示例
日志打印导致的敏感信息泄露
漏洞概述
这个就比较好理解。我们常见的print,log,logger 等日志中打印敏感信息。将会产生敏感信息泄露的风险
关键字举例
userName,password,idCard,privateKey,secreKey,token,phone,email,ip 等包含有敏感字段的信息。
解决方案
不打印敏感信息或者将敏感信息进行脱敏(将敏感信息替换)
代码中在日志打印token 错误示例
文件上传
漏洞概述
系统提供下文件上传功能,但没有对上传的文件进行充分校验,就会存在文件上传漏洞。
漏洞
漏洞危害
攻击者上传可执行文件控制服务器,恶意消耗系统资源。
文件上传需要进行的检测
检验文件类型,校验文件大小,对文件重命名,校验文件行数页数列数(上传表格),对文件上传频率进行限制,校验二进制头(图片),在解压过程中对已解压文件大小,已解压文件个数,文件名进行校验,同时上传过程中产生了缓存文件过后需要删除缓存。
文件读取
漏洞概述
系统提供文件下载或读取功能时,如果下载的文件路径,文件名可以被外界控制,且服务端下载文件的路径没有进行合法性校验,则系统存在任意文件下载漏洞的风险。
漏洞危害
造成任意文件读取,任意文件下载。
文件读取漏洞流程
解决方案
不提供目录遍历服务,文件放在web无法直接访问的目录下。下载文件之前做权限判断,对参数进行校验通过白名单的方式验证用户输入,同时验证路径是否在规定的路径之下。
跨站脚本攻击 -XSS
漏洞概述
浏览器将外部输入解析为前端代码进行之下.XSS分为存储性,反射性与DOM型,其中存储型XSS危害最大
漏洞危害
回话劫持,钓鱼攻击,网址挂马,浏览器被控制,信息被窃取等。
问题场景
xss漏洞通常会出现在页面中需要进行个性化展示的地方,如富文本,邮件标题邮件内容,URL链接,评论区等等,因此在开发这类功能的时候需要格外做好安全防范。比如 输入框 输入 这样的样式内容,保存后点击这个输入框,可能会出现一个弹出框。
解决方案
要对用户输入的数据进行类型,大小,范围的验证,充分过滤特殊字符,对输出进行编码转义等等。其中验证必须在客户端和服务端同时验证,客户端的验证可以减轻对服务端请求的次数和用户操作的方便性。服务端验证确保数据的正确性,同时也防止用户伪造请求绕过客户端的验证。
错误代码示例
可以看出代码中没有进行任何安全编码操作,容易造成XSS。
安全随机数
概述
在安全应用场景,随机数应该使用安全的随机数。密码学意义上的安全随机数,要求必须要保证其不可预测性。
安全随机数生成
byte[]values=new byte[128];
SecureRandom random=new SecureRandom();
random.nextBytes(values);
int tempNumber=random.nextInt();
非安全随机数
Random random=new Random();
rsandom.nextInt();
私有/不安全加密算法
概述
私有或非标准的加密算法,因其安全性未得到充分的验证,并且未得到业界的认可,使用可能会带来十分严重的风险,这些密码算法包括但不限于:
- 未经过专业机构评估的,自行设计的密码算法
2)自行对标准密码算法进行改造的
3)自行定义的通过变形/字符移位/替换等方式执行的数据转换算法
4)用编码的方式(如Base64编码)实现数据加密目的的伪加密实现
5)用差错控制编码(如奇偶校验,CRC)实现完整性校验.
常见不安全加密算法
DES,3DES,SKIPJACK,2TDEA,TEA,RC2,RC4,Blowfish,RSA(<2048 bits),SHA0,MD2,MD5,RIPEMD,
RIPEMD-128,ECIES(<224bits)等
使用不安全加密算法危害
主要是安全强度难以保证,容易被攻破。
SQL注入
概述
通过把SQL语句插入Web表单参数或页面请求的字符串中,最终达到欺骗数据库服务器执行恶意的SQL语句。达到恶意攻击的目的。
漏洞危害
造成信息泄露,严重的则造成脱库,获取Web管理员账号和密码,权限提升,控制服务器等。
判断SQL注入方式
示例
错误示例
正确示例
异常处理不当导致的敏感信息泄露
漏洞概述
当系统抛出异常,然后把异常的信息返回到前台或者打印到日志中,就有可能产生信息泄露。
漏洞危害
系统信息漏洞,当这些信息配合上一些特定的漏洞的时候,就产生更大的危害。
常见可抛出敏感信息的异常类
FileNotFoundException:泄露文件系统结构和文件名列举。
JarException:泄露文件系统结构
MissingResourceException:资源列举
NotOwnerException:所有人列举
OutOfMemoryError:dos攻击
StackOverflowError:dos攻击
SQLException:数据库结构,用户名列举
解决方案
打印或抛出自定义的异常信息.
日志注入漏洞
概述
也叫CRLF注入,当日志打印外部输入的数据却没过滤(\r,\n)时,就会造成日志注入
漏洞危害
造成日志污染,日志伪造
漏洞判断方式
漏洞解决方案
过滤特殊字符(主要是回车与换行符),常见过滤的字符
%0a,%0b,%0d,%08,%7f,\r,\n.
命令注入
漏洞概述
系统中存在调用系统命令的功能,当系统命令或者命令中的某些参数外部可控,并且系统没有对参数进行校验的时候,就会产生任意命令执行。
漏洞危害
造成任意命令执行,服务器被控制
可调用系统命令的类和函数举例
process,processBuilder,getRuntime(),exec()等。当在使用这些危险的函数的时候,应当注意做好安全访问。
判断命令注入的方式
所执行命令或者命令中的部分参数是否为外部可控,在外部可控的情况下是否进行安全校验
解决方案
将命令硬编码
使用白名单控制外部可执行命令
反序列化漏洞
概述
序列化 是将对象转换为字节序列的过程,反序列化 是将字节序列转为为对象的过程。当反序列化的数据由外部控制且不经过安全验证时,就会产生反序列化漏洞
漏洞成因以及危害
当被反序列化的数据是经过特殊构造的,如一个重写了readObject()方法并在该方法中进行命令调用的对象序列化后生成的数据,该数据被反序列化时,重写后的方法就会被调用,从而导致任意代码执行,最终服务器被控制。
常见可进行反序列化函数举例
ObjectInputStream.readObject,
ObjectInputStream.readUnshared
XmlDecode.readObject
Yaml.load
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject等
当在使用这些反序列化函数反序列化外部数据时,应该做好充分的安全校验。
解决方案
对于不可信数据,在执行反序列化函数之前对输入数据进行安全处理,如使用白名单检查反序列化对象是否都是安全的类名,是否使用到了危险的库(如apache Commons Collections),检查反序列化的对象中是否存在代码执行;以及升级存在漏洞的第三方插件。
服务端请求伪造-SSRF
概述
一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统,攻击者向服务端发送包含恶意URL链接的请求,借由服务端去访问此URL,以获取受保护的网络资源。
漏洞危害
获取内网服务器信息,主机任意文件读取,服务端口探测等。
常见可发起网络请求的类
Httpclient
HttpUrlConnection
URLConnection
RestTemplate
HttpTemplate
Okhttp
Url
使用这些类去发起网络请求时,应当做好安全防范。
漏洞判断思路
错误代码示例
URL重定向
概述
跳转漏洞,指的是程序接受用户可控的输入作为到外部站点的链接,然后在重定向中使用该链接。
漏洞危害
被重定向到钓鱼网址
可重定向函数举例
redirect
sendRedirect
漏洞判断方式
检查重定向的URL或者URL中的参数是否为用户可控,如果用户可控且没有做充分校验,则存在问题。
解决方案
使用白名单限制跳转的URL