分享三种常见的安全漏洞
输入输出验证不充分
输入输出验证SQL注入
定义
SQL注入是SQL语句插入到传入参数的攻击,之后再将这些参数传递给SQL服务器加以解析并执行。
成因
代码中有拼接的SQL或HQL语句
危害
- 拖库:导致数据丢失、数据窃取、数据破坏或拒绝服务
- 提权:完全接管操作系统
防范
思路:预处理和参数化查询
- 预处理和参数化查询PreparedStatement
使用相关的框架如Struts、Hibernate、Ibatis等
- 执行严格的输入验证
使用正规表达式,严格检查输入的类型、长度和内容
跨站脚本攻击(XSS)
定义
跨站脚本攻击(XSS)通常是指攻击者利用网站程序对传入参数值过滤不足,输入可以显示在页面上对其他用户造成影响的HTML、JS恶意代码。
成因
- 传入值验证不严格、用户能够控制传入值
- 未经处理直接输出到客户端网页中
危害
劫持用户会话、插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器等。
防范
思路:数据在输出时转义编码处理
- 输出编码(输出至客户端前进行编码)
输入验证或过滤(客户端及服务器端双向验证)
- 严格输入验证:对用户输入的数据类型、大小、范围的验证,可避免输入危害的字符和冗余数据
- 黑名单过滤
恶意文件上传
定义
恶意文件上传是指攻击者通过修改上传功能程序的参数内容,从而达到上传恶意文件的目的
成因
未对上传文件类型和格式做合法性校验,导致攻击者可以上传WebShell恶意文件(.asp,.war,.php,.jsp等)
危害
可以获取Web服务器的控制权
防范
思路:上传文件进行白名单过滤(只允许需要的)
- 文件类型、大小检查
- 下载时直接文件名引用
上传的文件以二进制形式下载,不提供直接访问
- 上传目录禁止执行及独立保存位置
指定上传文件目录(此路径应该在Web服务器限制为只读,禁止执行),文件存储到独立的文件服务器或数据库中。
- 随机改写文件名和文件路径,使不可猜测
逻辑设计缺陷
逻辑设计缺陷业务逻辑漏洞
定义
业务逻辑漏洞是由于业务逻辑设计或流程设计不完整、不合理导致的业务相关的缺陷。
成因
业务逻辑漏洞是由于业务逻辑设计或流程设计不完整、不合理,客户端可以控制输入数据和流程、检查点
危害
- 信息泄露、越权访问、账号窃取等
- 一般是全局问题,可能比常规的安全漏洞更加严重
实例
- 资源耗尽
短信、邮件等如果没有限制发送次数就会产生拒绝服务攻击
- 注册送优惠券
手机用户注册可送优惠券,未限制每个手机次数
- 任意重置密码
密码找回的凭证太弱,如只需填入一个四位或者六位的纯数字就可以重置密码,导致可以暴力破解;
用户找回密码的邮箱或者手机号码被修改
- 绕过验证码
12306输入完验证码提交订单时必须要等待4.8秒,可绕过验证码
- 任意邮箱绑定
任意邮箱绑定账号(结合CSRF),验证码链接直接登陆。
防范
思路:业务流程需要有必要的控制参数,同时避免控制参数被绕过。
- 防止绕过流程节点和检查参考(如token等)
- 不需要用户操作或访问的数据避免发送到客户端(如验证码发送给客户端)
- 验证所有输入(数字的边界、正负值等)
- 防范资源消耗攻击(如短信等)、拒绝服务攻击(大规模数据查询,如搜索通配符)等
失效的身份认证
定义
身份认证功能存在设计缺陷或功能薄弱,这就导致攻击者绕过认证,窃取密码、密钥、会话令牌或利用实施漏洞冒充其他用户身份
成因
身份认证方式薄弱,如弱密码、无验证码等
逻辑设计缺陷导致可以重置任意用户密码
危害
绕过认证或窃取用户账户,特权账户会造成更大的破坏
防范
身份认证时第一道安全防线,身份认证需要防暴力破解、弱口令攻击。密码策略和验证码时互联网系统认证标配。
- 密码策略
一般系统:8字符以上,且进行弱密码检查,并禁止包含用户名
重要系统:使用多种验证方式(如动态密码、短信等)
- 首次登陆修改初始密码:首次登陆强制修改默认初始密码
- 防密码暴力破解或猜解(或撞库):使用验证码登陆(如三次密码或账号尝试错误后出现)
- 密码重置:验证旧密码或手机验证码
- 邮箱/手机绑定:绑定操作需要用户确认(需要手工输入验证码)
越权操作
定义
越权操作指对系统进行超越自己权限的操作;
横向越权:非法获取同类用户权限
纵向越权:非法获取管理员或特权用户权限
成因
缺乏对用户权限的判断,及隐藏URL失效
危害
越权可造成非授权用户对所有数据、功能进行操作
防范
思路:用户全部请求进行权限检查
- 验证每次请求(URL、数据资源)的用户权限
- 参数随机化(避免可预测)
- 管理后台加强认证和访问控制(如IP地址限制)
环境漏洞
环境漏洞.png)]
第三方代码或组件
在使用第三方产品前,需要进行安全评估和版本筛选,从可信的网站(如官网下载),删除不必要的功能,并及时跟踪安全补丁。
API接口安全
接口安全认证
应对接口访问进行认证(服务器端分配API KEY),如使用Token/openid防范非法访问;IP白名单限制。
接口数据有效性检查
应对接口数据有效性进行检查,防范重放攻击和代码注入攻击。
接口数据加密传输
应使用数据加密、数字签名等方式保证数据保密性和完整性
接口访问权限及记录
应对接口的访问权限、访问频次进行控制,并记录接口访问的日志。
安全开发原则
永不信任用户输入
- 对用户输入的有效性检查
- 前端+后端双向验证
- 避免执行用户输入数据
最小攻击页面
- 最小权限
- 功能最小化(只实现需要功能)
- 输出最小化
纵深防御
- Web应用安全
- 操作安全
- 中间件安全
- 数据库安全
- 网络安全
- 客户端、移动APP安全
网友评论