跳到主要内容

逻辑漏洞

逻辑漏洞

程序逻辑问题产生的漏洞。一般出现在:

  1. 登录
  2. 注册
  3. 密码找回
  4. 信息查看
  5. 交易支付金额
  6. ……

逻辑漏洞多为合法流量,企业防护困难。

1️⃣ 注册处

  1. 注册功能可能出现任意用户注册、短信轰炸等问题。
  2. 前端验证:判断是否有任意用户注册漏洞
  3. 手机验证码验证:验证码是否可以暴力破解,验证码与当前手机号有没有检验匹配(0000-9999)
  4. 用户名密码注册:是否会导致批量注册

2️⃣ 登录处

  1. 登录处可能出现任意用户登录、短信轰炸等问题。
  2. 前端验证:判断是否有任意用户登录,是否有验证码回显,是否可以修改返回包造成任意用户登录等问 题
  3. 手机验证码验证:验证码是否可以暴力破解,验证码与当前手机号有没有检验匹配(0000-9999)
  4. 账号密码登录:没有验证码或者是否存在验证码可以被绕过,导致进行暴力破解

3️⃣ 密码找回处

  1. 验证码是否可以多次使用
  2. 验证码是否直接返回在数据包中
  3. 验证码未绑定用户
  4. 修改接收的手机或邮箱进行密码重置
  5. 前端验证绕过
  6. 验证步骤绕过(举例:先获取手机验证码,再输入要修改的邮箱和密码)
  7. 未校验用户字段的值(举例:修改密码处user_id可替换)
  8. 等等

4️⃣ 支付与越权

  1. 提交订单或者结算时对金额等参数进行修改(单价、总价)
  2. 提交订单时修改商品参数(低价购买高价商品)
  3. 修改支付接口等等(将支付链接发给别人,这也是为什么支付宝在支付的时候还要再输一次密码)

交易支付中的逻辑问题

支付漏洞的理解通常都是篡改价格。比如:一分钱买任何东西、少收款、企业收费产品被免费使用等, 直接造成企业的经济损失。

支付逻辑漏洞的呈现形式

  1. 充值的时候,程序只判断订单有没有充值成功,但没有判断金额 例如:生成订单跳至支付宝页面,在原网站上点支付失败,这时可以修改订单,改成更大的金额(订单 号没变),回到支付宝支付页面,支付成功。程序并没有重新核对支付宝实际的金额,只是把订单改为 已支付。
  2. 使用余额支付,把数量改为负数,总金额也为负数,扣除余额时,负负得正,这时余额增加。
  3. 支付逻辑漏洞的几种常见类型:
    1. 修改金额
    2. 修改商品数量
    3. 修改优惠金额
    4. 修改数量、单价,优惠价格参数为负数、小数,无限大
    5. 商品价格更改
    6. 支付 key 泄露等

漏洞案例

安装 Webug

docker pull area39/webug
docker run -d -p 8087:80 -p 33060:3306 --name=webug area39/webug

登录:http://YOUR_IP_ADDRESS/control/login.php

  • 账号:admin

  • 密码:admin

点击「立即购买」按钮,抓包修改价格,就可以看到能以修改后的价值买到该商品。

密码修改漏洞案例

进入后台查看现有用户和密码:

docker exec -it webug bash
mysql -p
# 输入密码
toor

查看现有的表:

use webug;
select * from user_test;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | admin | admin |
| 2 | aaaaa | asdfsadf |
+----+----------+----------+

打开靶场前端:

首先用账号 aaaaa/asdfsadf 登录,得到 URL http://175.178.126.31:8087/pt_env/control/auth_cross/cross_auth_passwd2.php?id=2,主要要由于靶场 bug,要把 pt_env 删除掉才能访问,接着我们在修改密码处把这里的 id 改为 2,去越权修改另外一个账号的密码:

重新查看数据库,可以看到 id 为 1 的账号密码确实被越权修改了:

mysql> select * from user_test;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | admin | abc |
| 2 | aaaaa | asdfsadf |
+----+----------+----------+

实战项目逻辑漏洞分享

  1. 验证码回传导致任意用户注册

  2. 任意用户登录。用户注册之后直接登录,分析这条注册请求的响应,替换 user_id 和 username,可实现任意用户登录

逻辑漏洞修复

  1. 正确配置用户权限信息,不要简单用 cookie 或 session
  2. 同一手机,同一时间内限制发送手机验证码数量
  3. 删除特权码,不能返回验证码
  4. 订单类应该校验每一个值,包括支付状态、MD5 加密&解密、数字签名以及验证,避免数据修改、重放攻击等
  5. 前后端都应该进行校验