目录
注册、登陆需防范的问题
- 重放数据包无限请求
- 用户名枚举
- 登陆认证绕过
- 验证码爆破、重放、可控
- 短信、邮箱轰炸
- 邮箱篡改
- 任意用户注册
- cookie仿冒
- 会话固定
注册、登陆编码建议
- 验证码不得低于6位
- 验证码验证后立马失效
- 手机、邮箱注册用户需要验证码
- 所有登陆界面都需要验证码
- 所有校验必须在后端
- 不论用户存在与否不回显明确信息
- 积分、优惠券等操作限制次数防止重放
- 限制短信、邮件的发送频率
- 业务流程的每一步都需要进行身份验证
- 图形验证码需要变形干扰增加复杂度
- 交易操作严格校验数据防止溢出或负数值
- Cookie中不存放敏感信息,不同会话使用不同Cookie
多因素认证
- 位置因素:常登陆的IP地址、地理位置等
- 生物特征因素:语言、指纹、面部特征、虹膜等
- 口令密钥:密码、PIN码、TAN码(交易验证码)、密钥等
- 拥有因素:身份证、钥匙、U盾、磁卡、安全令牌、智能手机等
口令策略
- 规定口令策略,强制验证用户输入口令的强度
- 测试账号、默认账号不使用弱口令,系统默认账号需要一人一密
- 登陆错误次数限制、登陆界面设置验证码,且验证码不易识别,不能被绕过
- 维护一张弱口令表,弱口令表中的口令禁止使用
- 数据库密码存储应该不可逆,采用存储hash值的方式
非弱口令定义与使用习惯
- 密码长度不低于8位,密码必须含有字母大小写数字和特殊字符
- 不使用有规律的密码,如:1qaz@WSX、123!@#qwe、P@ssW0rd等
- 不同网站需要使用不同密码
- 不将密码写在记事本、便条或明文保存在电脑中
- 不使用姓名、生日、工号等明显信息作为密码
- 避免使用浏览器记住密码功能
注:在此基础上可以增加密码使用期限,如一段时间内需修改一次密码等方式加强口令策略
项目上线注意事项
- 不暴露任何用户不需要的信息
- 网站部署注意隐藏源码信息
- 下线的功能、接口,需前后端同步删除
- 网站日志需要写入用户无法访问的目录
- 程序发生错误需要有统一的错误处理页面
- 物理路径、系统版本等信息需要进行保护
- 网站的备份文件不能存放在用户可访问目录
- 前端代码需要进行混淆或者压缩处理,不留注释信息
- 敏感信息如手机号,身份证号,银行卡号隐藏显示
- 控制好源代码信息公司代码上传到github等平台
预防文件操作
- 文件上传:上传可执行代码文件、上传前端静态文件、覆盖重要文件
- 文件下载:下载系统配置文件、下载系统源码、下载敏感信息文件
- 文件修改:破坏系统重要文件、修改系统源码、修改系统配置
- 文件删除:删除系统重要文件、删除安装锁定文件
文件安全编码规范
文件上传
- 类型判断:根据扩展名判断、使用白名单进行校验、严禁完全依赖文件头和ContentType
- 重命名:防止文件名的截断、使用GUID等随机文件名、避免文件路径的回显
- 不解析:上传至单独的文件服务器、上传至用户无法直接访问或者不解析目录
文件下载
- 文件ID操作:通过文件ID读取路径进行下载
- 数据过滤:通过过滤“../”等特殊字符防止目录穿透
- 类型判断:判断文件扩展名,尽量使用白名单
- 权限校验:对WEB权限进行校验,采用最小权限原则
注入漏洞类型
- SQL注入
- OS命令注入
- XML实体注入
- LDAP注入
- Xpath注入
- 注入漏洞是通过欺骗解释器来进行攻击的,能够做到任何解释器能够做到的内容
- 注入漏洞是常年漏洞榜首,特别是SQL注入漏洞,业务中离不开和数据库的交互,也就大大提升了SQL注入发送的概率
注入漏洞防范方法
- 在使用原生JDBC时能够使用参数化查询的位置必须进行参数化查询
- 使用orm框架严格按照开发标准,自定义sql语句需要进行参数化查询
- 严禁直接使用dba权限账户作为网站数据库账户
- 限制用户的输入,如果明确参数类型,需要对参数进行格式化
- 只能采用过滤的方式尽量采用白名单,黑名单很可能被绕过
- 数据的二次使用也需要注意注入问题
- 避免向客户端响应详细的错误消息,防止攻击者里有报错信息来判断后台SQL的拼接形式
权限校验问题
- 未授权访问:某些系统或者某些功能点,没有经过身份认证可直接被访问者使用,如果系统中存在敏感数据很可能造成数据泄露
- 垂直越权:虽然对用户身份进行了认证,但是在用户角色使用权限上没有进行严格划分,导致低权限用户可以使用高权限用户的功能
- 水平越权:用户角色或者身份已经经过验证,但是同一角色之间的用户在数据访问上未做限制,导致可以访问其他用户信息
权限校验问题解决方案
- 未授权访问:核查系统或组件的默认配置是否进行身份认证;不引入不安全的配置、导致身份认证失效、开发测试环境同样需要身份认证;API接口同样需要全面的身份认证
- 垂直越权:基于角色的权限控制(RABC);建立统一的权限控制功能,可以通过url、接口等形式;统一身份认证系统需要对用户角色权限进行控制
- 水平越权:查询和用户相关的信息需要与用户身份进行关联;敏感信息的唯一标识需要足够随机化
名称 | 危害 | 修复方式 |
Redis未授权访问 | 访问、修复、删除数据、写入SSH公钥、计划任务、webshell等获取服务器权限 | 可以配置redis.conf,默认只对本地开放,添加登陆密码,限制对外开放的端口或IP |
Jenkins未授权访问 | 攻击者可通过未授权访问manage、script写入恶意文件、或者直接执行命令 | 禁止把Jenkins直接暴露在公网,添加认证;设置强密码复杂度及账号锁定 |
MongoDB未授权访问 | 开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,而且可以远程访问数据库,登陆的用户可以通过默认端口无需密码对数据库进行增删改查等任意高危操作 | 为MongoDB添加认证;禁用HTTP和REST端口;限制绑定IP |
ZooKeeper未授权访问 | Zookeeper安装部署之后默认情况下不需要任何身份验证,造成攻击者可以远程利用Zookeeper,通过服务器手机敏感信息或者在Zookeeper集群内进行破坏(比如:kill命令)。攻击者能够执行所有只允许管理员运行的命令 | 禁止把Zookeeper直接暴露在公网;添加访问控制,根据情况选择应用方式(认证用户,用户名密码);绑定指定IP访问 |
Memcache未授权访问 | Memcache是一套常用key-value缓存系统,由于它本身没有权限控制模块,所以对公网开放的Memcache服务很容易被攻击者扫描发现,攻击者通过命令交互可直接读取Memcache中的敏感信息 | 设置memcache只允许本地访问;禁止外网访问Memcache11211端口;编译时加上-enable-sasl,开启SASL认证 |
Hadoop未授权访问 | 由于服务器直接在开放了Hadoop机器HDFS的50070web端口及部分默认服务端扣,黑客可以通过命令行操作多个目录下的数据,如进行删除、下载,目录浏览甚至命令执行等操作,产生极大的危害 | 如无必要,关闭Hadoop Web管理页面,开启身份验证,防止未经授权用户访问;设置“安全组”访问控制策略,将Hadoop默认开放的多个端口对公网全部禁止或限制可信任的IP大众才能访问包括50070以及WebUI等相关端口 |
CouchDB未授权访问 | CouchDB默认在5984端口开放Restful的API接口,用于数据库的管理功能。其HTTPServer默认开启时每页进行验证,而且绑定在0.0.0.0,所有用户均可通过API访问导致未授权访问。任何链接到服务器端口上的人,都可以调用相关API对服务器上的数据进行任意的增删改查,其中通过API修改local.ini配置文件,可进一步导致执行任意系统命令,获取服务器权限 | 制度CouchDB绑定的IP(需要重启CouchDB才能生效)在/etc/couchdb/local.ini文件中找到“bind_address=0.0.0.0”,把0.0.0.0修改为127.0.0.1,然后保存。注:修改后只有本机才能访问;设置访问密码(需要重启CouchDB才能生效)在/etc/couchdb/local.ini文件中找到"[admins]"字段配置密码; |
跨站脚本漏洞
定义:跨站脚本漏洞,又名XSS漏洞,程序开发的工程中对用户输入的数据未做过滤、使得恶意攻击者可以往Web页面里插入恶意js脚本代码、当用户浏览存在恶意脚本的页面时,恶意脚本执行窃取了用户敏感信息
编程建议:ESAPI(OWASP Enterprise Security API)是一个免费开源的,web应用程序安全控制库