通常我喜欢把代码审计的方向分为业务层安全
问题、代码实现
和服务架构
安全问题,。
1. 业务层安全常见问题
业务层的安全问题集中在业务逻辑
和越权
问题上,我们在代码审计的过程中尽可能的去理解系统的业务流程以便于发现隐藏在业务中的安全问题。
1.1 业务层中常见的安全问题Checklist
-
用户登陆、用户注册、找回密码等功能中密码信息未采用加密算法。
-
用户登陆、用户注册、找回密码等功能中
未采用验证码
或验证码未做安全刷新
(未刷新Session中验证码的值)导致的撞库、密码爆破漏洞。 -
找回密码逻辑问题(如:可直接跳过验证逻辑直接发包修改)。
-
手机、邮箱验证、找回密码等涉及到动态验证码等功能
未限制验证码失败次数
、验证码有效期
、验证码长度过短
导致的验证码爆破问题。 -
充值、付款等功能调用了第三方支付系统未正确校验接口(如:1分钱买IPhone X)。
-
后端采用了
ORM框架
更新操作时因处理不当导致可以更新用户表任意字段(如:用户注册、用户个人资料修改时可以直接创建管理员账号
或其他越权修改操作)。 -
后端采用了
ORM框架
查询数据时因处理不当导致可以接收任何参数导致的越权查询、敏感信息查询等安全问题。 -
用户中心转账、修改个人资料、密码、退出登陆等功能未采用验证码或Token机制导致存在CSRF漏洞。
-
后端服务过于信任前端,重要的参数和业务逻辑只做了前端验证(如:文件上传功能的文件类型只在JS中验证、后端不从Session中获取用户ID、用户名而是直接接收客户端请求的参数导致的越权问题)。
-
用户身份信息认证逻辑问题(如:后台系统自动登陆时直接读取Cookie中的用户名、用户权限不做验证)。
-
重要接口采用ID自增、ID可预测并且云端未验证参数有效性导致的越权访问、信息泄漏问题(如:任意用户订单越权访问)。
-
条件竞争问题,某些关键业务(如:用户转账)不支持并发、分布式部署时不支持锁的操作等。
-
重要接口未限制请求频率,导致短信、邮件、电话、私信等信息轰炸。
-
敏感信息未保护,如Cookie中直接存储用户密码等重要信息。
-
弱加密算法、弱密钥,如勿把Base64当成数据加密方式、重要算法密钥采用弱口令如
123456
。 -
后端无异常处理机制、未自定义50X错误页面,服务器异常导致敏感信息泄漏(如:数据库信息、网站绝对路径等)。
-
使用DWR框架开发时前后端不分漏洞(如:DWR直接调用数据库信息把用户登陆逻辑直接放到了前端来做)。
2. 代码实现常见问题
代码审计的核心是寻找代码中程序实现的安全问题,通常我们会把代码审计的重心放在SQL注入、文件上传、命令执行、任意文件读写等直接威胁到服务器安全的漏洞上,因为这一类的漏洞杀伤力极大也是最为致命的。
###2.1 代码实现中常见的安全问题Checklist
-
任意
文件读写
(文件上传、文件下载)、文件遍历
、文件删除
、文件重命名
等漏洞 -
SQL注入漏洞
-
XXE(XML实体注入攻击)
-
表达式执行(SpEL、OGNL、MVEL2、EL等)
-
系统命令执行漏洞(ProcessBuilder)
-
反序列化攻击(ObjectInputStream、JSON、XML等)
-
Java反射攻击
-
SSRF攻击