跳到主要内容

全栈安全工程师实录:自产→自测→自修→自验,高危漏洞闭环全流程

友情提醒

本文推荐阅读时间:5 min

如想交流讨论更多技术内容,欢迎关注公众号联系我!

CISP-TRS(威胁响应专家 · 备考中)

OSCP+ 备考经验(已通过认证)

CISSP 备考经验(已通过认证)

CCSK 云安全(已通过认证)

ISO/IEC 27001 Foundation(已通过认证)


写在前面

很多人以为漏洞都是测试测出、渗透挖到的。但单兵全栈自研项目里,有一种最真实、最锻炼能力的安全场景:

自己写的漏洞、自己测试发现、自己修复加固、自己复测验证。

近期自研安全运营平台上线前,我完整走完了 自产→自测→自修→自验 的高危漏洞全闭环。全程单人完成,无任何第三方参与。

这次实战也印证了一个核心结论:单一工具自动化扫描无法兜底安全,真正的安全需要黑白盒兼顾、工具与人工测试双向结合。


01 背景:工具扫描无告警,暗藏业务高危漏洞

项目上线前,我使用 PyCharm 自带安全工具完成全量代码静态扫描。常规 SQL 注入、XSS、代码缺陷均无告警,表面看代码安全合规。

但 SAST 静态工具只能发现代码层通用漏洞,无法识别业务权限、逻辑缺陷

因此我采用 SAST+DAST、白盒审计+黑盒渗透 的组合方式,对内网 QA 环境开展全方位安全自测。


02 漏洞自测:黑白盒结合,实锤高危越权

结合代码审计技能与黑盒扫描思路,我搭建真实业务测试场景,使用两类账号对照测试:

  • 管理员账号:拥有密码重置权限

  • 普通用户账号:仅登录权限,无任何用户管理权限

测试结果:普通用户登录后,携带自身 Session 即可直接调用密码重置接口,篡改管理员用户 ID 即可重置超级管理员密码。

全程无权限拦截,高危水平越权漏洞彻底实锤。

同时也能看出:AI 辅助生成的代码,质量参差不齐,极易出现权限逻辑缺失问题,必须人工复核。


03 漏洞自产:一行代码缺失,埋下全站风险

溯源代码发现,漏洞源于开发阶段疏忽:

密码重置接口仅添加了登录校验装饰器,遗漏核心功能权限校验。虽然后台菜单权限已有规划,但代码层未做落地拦截。

漏洞原始代码

@login_required
def user_reset_pwd(request, nid):
"""重置用户密码"""
# 先获取用户信息用于日志
user_obj = models.User.objects.filter(id=nid).first()
if not user_obj:
return JsonResponse({'code': 404, 'msg': '用户不存在'})

username = user_obj.account
random_pwd = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
encrypted_pwd = make_password(random_pwd)
models.User.objects.filter(id=nid).update(password=encrypted_pwd)

# 记录操作日志:重置密码
user_info_session = request.session.get('user_info')
current_user = models.User.objects.filter(id=user_info_session.get('id')).first() if user_info_session else None

LogManager.record_operation_log(
request=request,
user=current_user,
operation_type=7, # 修改密码
operation_desc=f"重置用户【{username}】的密码",
operation_module="用户管理",
result_status=1
)

return JsonResponse({'code': 200, 'msg': '重置成功', 'password': random_pwd})

漏洞核心危害

仅校验登录状态、未校验操作权限。任意普通登录用户,均可篡改参数重置全站任意账号密码,可直接接管超级管理员账号,属于高危 IDOR 越权漏洞。


04 漏洞自修:双层鉴权,从根源彻底修复

针对漏洞根源,补充专属权限装饰器,实现 登录校验 + 功能权限校验 双层闭环鉴权,严格匹配后台权限码。

修复后代码

from .login import login_required, require_permission

@login_required
@require_permission('user:reset_pwd') # 专属权限,仅授权角色可访问
def user_reset_pwd(request, nid):
"""重置用户密码"""
user_obj = models.User.objects.filter(id=nid).first()
if not user_obj:
return JsonResponse({'code': 404, 'msg': '用户不存在'})

username = user_obj.account
random_pwd = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
encrypted_pwd = make_password(random_pwd)
models.User.objects.filter(id=nid).update(password=encrypted_pwd)

user_info_session = request.session.get('user_info')
current_user = models.User.objects.filter(id=user_info_session.get('id')).first() if user_info_session else None

LogManager.record_operation_log(
request=request,
user=current_user,
operation_type=7,
operation_desc=f"重置用户【{username}】的密码",
operation_module="用户管理",
result_status=1
)

return JsonResponse({'code': 200, 'msg': '重置成功', 'password': random_pwd})

05 漏洞自验:多场景复测,完成安全闭环

修复完成后,在内网 QA 环境完成回归复测:

无权限普通用户访问:系统直接拦截,提示权限不足,越权链路彻底阻断。

授权管理员访问:业务功能正常可用,不影响正常运维流程。

漏洞彻底清零,完整走完 自产→自测→自修→自验 单兵安全闭环。


06 实战总结:单兵安全开发核心思维

1. 拒绝单一工具依赖,黑白盒、人工与工具必须结合

自动化静态扫描只能覆盖通用代码漏洞,权限越权、业务逻辑绕过等深层风险,必须通过白盒审计+黑盒渗透+人工自测才能检出,这是工具无法替代的。

2. 高危接口强制双层鉴权,缺一不可

密码重置、用户管理、权限分配、数据删除等高风险接口,必须同时校验登录状态与操作权限,杜绝水平、垂直越权。

3. 单兵项目必须自建安全闭环

无专职安全团队的自研项目,开发者需身兼开发、测试、安全多角色,自主完成漏洞产生、发现、修复、验证全流程管控。

4. 上线前必须做权限专项审计

全量梳理路由接口,逐一对标权限装饰器、权限码配置,提前规避隐形业务漏洞。


写在最后

安全开发从来不是写完代码即结束,而是贯穿 开发-测试-修复-验证 的全生命周期闭环。

真正的安全能力,不是只会挖掘别人的漏洞,而是能掌控自己写出的每一行代码,主动发现、规避、修复风险。


互动话题

你在单兵开发、自主迭代项目时,有没有踩过权限越权这类隐形高危漏洞?上线前会做人工安全自测吗?欢迎评论区交流探讨!


历史精彩文章

甲方攻防大戏:功劳归我,活?归供应商,钱?还想续约不?

Hi,97小伙,请远离黑灰产,珍惜创业机会!别实名制扫描我了~!

从被动写 2 小时情况说明到主动防患:一个甲方安全人牵头 fastjson 升级的全纪实


END

十二载·甲方信安

初心如磐守底线

实战沉淀赋价值

(注:部分内容可能由 AI 生成)