常见的逻辑漏洞

逻辑安全存在的前提

有效的区分每个用户,并且针对每个用户提供独立的服务内容,允许用户与服务器进行大量的交互
。web应用的攻击就是攻击者从零交互零权限到最后取得最高权限。以下分别总结几点逻辑安全的漏洞

用户管理功能漏洞

最大的漏洞就是避免cookie伪造,例如在cookies中存在一个字段为 admin: false,这个时候,如果黑客将其改为 true,那么就可以实现cookies的一个伪造,从而进行攻击。

用户授权管理和安全分析

授权管理分为以下几个部分

  1. 注册
  2. 密码找回
  3. 登录
  4. 密码修改、绑定信息修改
  5. 管理权限

下面总结一下,大概有哪些危险

注册

面临的危险和解决方案

  1. 恶意重复注册
1
2
3
4
5
#解决方案
限制IP注册频率
表单加上验证码
姓名和身份证验证
二次验证,例如绑定手机号码或者邮箱
  1. 注册用户与已经存在的用户重名
1
2
3
#解决方案
首先数据库字段,要加上验证,不允许重复
对用户输入要做校验。
  1. 没有对用户输入进行校验,造成xss,sql注入
1
2
3
4
#解决方案
对用户输入要做校验.
过滤特殊字符
不使用sql拼接
  1. mysql中,可能存在空格覆盖。
1
2
#解决方案
对用户输入要做校验,去除空格。

密码找回

面临的危险和解决方案

  1. 服务器没有校验修改密码的token,或者token是可猜测破解的,这回造成任意密码修改【!】。这个是存在最多的漏洞,很常见。
1
加强token的安全性
  1. session覆盖攻击,少见,即一个用户的session,会覆盖掉另一个用户的session,导致打开的时候,修改的其实是另一个用户的密码
1
很少见,估计实现都有困难。

登录

面临的危险和解决方案

  1. 暴力破解用户密码
1
使用验证码形式,用户三次输入错误,需要输入验证码,多次输入错误需要绑定的手机或者邮箱进行解锁
  1. 明文传输导致中间人攻击
1
2
HTTPS
HSTS
  1. 万能密码
1
做好防止sql注入的漏洞
  1. 用户密码存储
1
用户密码应该使用hash+随机盐的形式进行存储。
  1. 登录提示
1
不应该使用过于明显的登录提示

密码修改/个人信息修改

  1. CSRF攻击
1
加CSRF token和 refer 进行防御
  1. 确认用户本人操作
1
需要进行二次验证,确认是本人操作

管理权限漏洞

  1. 开发过程中没有对当前用户的一致性做校验工作。例如在flask中,个人中心需要登录才能看,但是如果你忘记了对当前用户的身份做一个校验,那么就会变成,只要随便登录一个用户,那么他就可以随便的修改或者查看他人的个人中心。

代码实例:

1
2
3
4
5
6
7
8
9
10
@app.route('/profile/<username>')
@login_required
def profile(username):
user = User.query.filter_by(username=username).first()
# 应该这么校验
if current_user == user:
...
else:
flash("You have no permission to access this page.")
return redirect(url_for('index'))
  1. 权限管理没做好,导致低权限用户可以访问高权限用户的页面。同上,做好权限校验

用户身份识别和安全防护

这章主要讲的是验证码和二次验证码的安全,基本上可以概括为:

  1. 无论哪种验证码,都应该要有一个过期时间。
  2. 为了保证安全,都不该可以被猜测

总结

下一步打算认认真真研究一下kali这个系统了。