一、背景
java开发的系统在发布到互联网后都需要进行安全扫描,本文主要总结开发web系统需要注意的与系统安全相关的问题。因为在做需求开发时,很少产品会将系统安全的因素考虑在内,总觉得实现个需求很简单,就是一些页面,一些接口。以至于在构筑安全的逻辑上没给工时,开发人员也没想太多去实现这些有必要有看不见的东西。所以一般就变成了系统上线后,发现安全问题,再返工补漏洞的现象。显得非常不专业。
二、web系统安全类别
1、数据安全
前端敏感信息暴露
数据库敏感数据暴露
2、认证安全
接口权限认证
3、身份安全
验证码防范
短信验证码防范
4、会话安全
cookie信息安全
session信息安全
5、访问控制安全
水平越权防范
垂直越权防范
随机的数据过短防范
6、输入输出认证安全
文件上传下载漏洞
服务器目录遍历
SQL注入
代码注入
URL被重定向
三、安全编码原则
1、安全异常处理原则
2、安全日志记录原则
3、输入验证,输出编码原则
4、最小权限原则
5、防御性编程原则
四、如何防护
1、sql注入防护
参数化查询语句:要防御 SQL 注入,用户的输入就不能直接拼接在 SQL 语句当中。使用参数化的查询语句,用户的输入就被限制于一个参数当中。
错误消息处理:防范 SQL 注入,还要避免出现一些详细的错误消息,恶意攻击者往往会利用这些报错信息来判断后台 SQL 的拼接形式,甚至是直接利用这些报错注入将数据库中的数据通过报错信息显示出来。
最小权限原则:准确说,最小权限原则不是应用编码范畴的工作,而是DBA应遵循的安全管理原则, 并且最小权限原则本身并不能阻止产生SQL注入漏洞,而是一旦存在SQL注入漏洞,可以降低SQL注入造成的危害
2、越权防护
在web应用中,根据访问客体的不同,常见的访问控制可以分为“基于URL的访问控制”、“基于方法 (method)的访问控制”、“基于数据的访问控制”。越权访问漏洞主要有垂直越权和水平越权。 • 垂直越权漏洞,也称权限提升漏洞,由于Web应用程序没有做权限控制或者仅在菜单上做了权限控制,导致 的恶意用户只要猜测其他管理页面的URL,就可以访问或控制其他角色拥有的数据或页面,达到权限提升目 的。 • 水平越权漏洞,Web应用程序接收到用户请求,修改某条数据时,没有判断数据的所属人,或判断数据所属 人时,从用户提交的request参数(用户可控数据)中,获取了数据所属人id,导致恶意攻击者可以通过变 换数据id,或变换所属人id,修改不属于自己的数据。恶意用户可以删除或修改其他人数据。 • OWASP TOP 10 A5 失效的访问控制 • 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问 其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。
3、路径遍历防护
路径遍历是指应用程序接收了未经合理校验的用户参数用于进行与文件读取查看相关操作,而该参数包含了特殊的字符(例如“..”、“./”、“.\\”和“:”),使用了这类特殊字符可以摆 脱受保护的限制,越权访问一些受保护的文件、目录或者覆盖敏感数据
4、恶意文件上传防护
由于业务需要,应用程序通常允许用户上传图片或附件,如果程序没有对上传的文件进行检查 的话,攻击者可能会通过上传文件的功能上传一些恶意文件,如 webshell、病毒文件等,可直接获取用户服务器权限或执行恶意脚本、挂黑页等操作。 • 如果上传的文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行,导致终端感染 病毒或木马。 • 如果上传的文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。 • 攻击者直接上传一个webshell到服务器上,完全控制系统或致使系统瘫痪。 • 攻击者上传大文件到服务器,占用带宽、存储空间,资源耗尽会导致拒绝服务器攻击。
文件上传可以参考以下安全需求进行处理: 1、 服务器配置: (1)将上传目录和上传文件设置为不可执行, 杜绝脚本执行。 (2)应保证服务器安全,避免文件解析漏洞。 2、在服务端对上传文件进行检查: (1)使用白名单控制上传文件类型,即只允许指定扩展名的文件上传。 (2)对上传文件后缀与MIME Type进行匹配校验, 对文件头信息与文件后缀进行匹配校验。 (3)对单个文件大小和总文件数进行限制, 避免拒绝服务攻击 (4)对文件名进行输入校验,显示时进行输出编码。 3、文件存储: (1)上传文件应保存在指定路径下。 (2)对上传文件进行随机数重命名,避免文件被覆盖。 (3)设置上传文件路径, 使用户不能轻易访问自己上传的文件 。 (4) 文件应尽量保存在内容服务器或web目录外部,避免通过web应用直接访问上传的文件。 4、对于图片文件进行二次渲染、压缩, 避免图片写马。 5、校验失败后,记录错误日志信息,内容至少包括时间、用户、IP、操作内容、校验失败的参数及参数内容等。 上传临时文件处理:单个文件夹下文件过多,会导致访问速度下降,建议分散储存,如根据文件名哈希按首字母建立子目录;
5、弱密码防护
通常认为容易被别人 猜测到或被破解工具破解的口令均为弱口令。 • 弱口令通常危害为数据泄露,当攻击者获取用户口令后,能以用户的身份登录系统、访问数据库、访问操作系统文件等,用户账户所具备的数据权限,攻击者均可查阅。例如查询账户余额,查询数据库表记录,查询服务器敏感文件信息等。 • 执行非法操作,攻击者破解用户口令后,可执行权限范围内的功能操作,例如转账、发表非法言论、篡改删除数据库数据、修改删除服务器文件等。
基本的密码规则:
/**
* 校验复杂度
*/
public Boolean checkPWD(String PWD) {
// 规定的正则表达式
// (?![a-zA-Z]+$) 表示 字符串不能完全由大小写字母组成
// (?![A-Z0-9]+$) 表示 字符串不能完全由大写字母和数字组成
// (?![A-Z\W_]+$) 表示 字符串不能完全由大写字母和特殊字符组成
// (?![a-z0-9]+$) 表示 字符串不能完全由小写字母和数字组成
// (?![a-z\W_]+$) 表示 字符串不能完全由小写字母和特殊字符组成
// (?![0-9\W_]+$) 表示 字符串不能完全由数字和特殊字符组成
// [a-zA-Z0-9\W_]{8,} 表示 字符串应该匹配大小写字母、数字和特殊字符,至少匹配8次
String regex = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![a-z0-9]+$)(?![A-Z\\W_]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,}$";
return ReUtil.isMatch(regex, PWD);
}
6、验证码防护
服务器端未对验证码有效性进行校验,导致验证码绕过。 通常出现的安全问题如下: 验证码前端校验 验证码重复使用 验证码暴力破解
修复建议: 1、服务器端对验证码校验; 2、限制请求次数和请求频率。 3、验证码使用一次后,销毁验证码session,防止验证码多次使用;
四、常见漏洞与修复方法
Java Web系统的常见安全问题及其修复方法如下:
-
弱口令漏洞:
- 问题:使用简单密码,如123456、admin等,容易被猜测和破解。
- 修复方法:使用至少6位的数字、字母及特殊字符组合作为密码,并定期更换密码。
-
未使用用户名及密码登录后台可直接输入后台URL登录系统:
- 问题:用户无需输入用户名和密码即可访问后台系统。
- 修复方法:通过配置filter来过滤掉无效用户的连接请求。
-
JSP页面抛出的异常可能暴露程序信息:
- 问题:有经验的入侵者可以从JSP程序的异常中获取很多信息,如程序的部分架构、程序的物理路径、SQL注入爆出来的信息等。
- 修复方法:自定义一个Exception,将异常信息包装起来不要抛到页面上。
-
合法用户“注销”后,在未关闭浏览器的情况下,点击浏览器“后退”按钮,可从本地页面缓存中读取数据,绕过了服务端filter过滤:
- 问题:合法用户注销后,其数据仍可能被从本地页面缓存中读取。
- 修复方法:配置filter对存放敏感信息的页面限制页面缓存。
此外,Java Web系统还可能存在其他安全问题,如SQL注入、跨站脚本攻击(XSS)等。为了确保系统的安全性,建议采取以下措施:
- 对用户输入进行严格的验证和过滤,防止SQL注入和XSS攻击。
- 使用HTTPS协议进行通信,确保数据传输的安全性。
- 对敏感数据进行加密存储和传输。
- 定期更新和修补系统漏洞,确保系统的安全性。
- 定期备份数据,以防止数据丢失和损坏。
- 限制服务器的访问权限,确保只有授权用户可以访问系统。
- 采用安全的密码策略,避免使用弱密码。
- 对系统日志进行监控和分析,及时发现异常行为和攻击尝试。