)
小白程序员必看从固定验证码到数据泄露一条链教你网络安全攻防思路收藏学习本文通过一次企业SRC测试实例详细复盘了一条由固定验证码漏洞引发的全链条攻击过程。从验证码绕过、接口越权、前端密钥破解到最终数据泄露揭示了前端加密、权限校验缺失等常见安全问题。文章强调通过分析JS代码、接口行为和业务逻辑发现漏洞的关键方法并提出了从攻击面测绘、权限控制、密钥管理到安全修复的完整思路适合小白和程序员学习网络安全攻防技巧。01先说结果这条链不用一点前置条件一次企业SRC测试撞上一家持牌金融机构的机构交易平台。测到后来自己都有点意外——整条链的起点只是登录接口上一个没校验的固定验证码。最终拼出来的链条是这样的· 固定验证码 → 登录任意手机号拿到会话凭证· 接口不鉴权 → 一个接口直接返回全部9687条机构账户姓名、电话、身份证、邮箱、信用代码· 密钥写前端 → 加密字段100%解密还原明文· 再越权补手机号 → 缺失的手机号补齐形成攻击循环· 最深处 → 11269条程序化交易报告全量泄露涉及客户姓名、身份证、资金规模、交易策略、期货账号。从头到尾不需要暴力破解、不需要社工、不需要任何前置权限。一个手机号当起点几分钟拉穿。不想把这写成一份操作流水账。更想聊的是每一步看到了什么、想到了什么、为什么这么试——读JS读出来的东西往往比扫一百个目录有用得多。02攻击面测绘读JS比扫端口有效大多数机构平台都是前后端分离的SPA。拿到目标后没急着扫目录先做了两件事抓打包的前端JS看它后端的路由和鉴权方式。从JS里立刻读出三个关键信息· 登录接口是 /xxx/xxx/loginByVcode传手机号 验证码接口名就直接告诉你验证码登录· axios配置里withCredentials: true —— 这是cookie-based Session的标志不是Token认证· 登录成功服务端会种一个XJSESSIONID的Cookie这就是后续所有请求的认证凭证。这个细节决定了后面所有测试的走向。先搞清楚认证模型比急着打payload重要得多。如果是Session认证重点就在能不能伪造/拿到Session如果是Token重点就在Token的签发和校验逻辑。03第一刀验证码登录三道闸竟然是摆设验证码登录接口是必测的一刀。原因很朴素——开发为了方便经常给验证码留后门要么不校验要么留个万能值。构造请求POST /xxx/xxx/loginByVcode传任意手机号验证码随手填了个固定值000000POST /xxx/xxx/loginByVcode HTTP/1.1Content-Type: application/json{“userCode”: “admin”,“phone”: “1XXXXXXXXXX”, // 测试账号已打码“vcode”: “000000”, // 固定的万能值“requestId”: “UUIXXXX”}通了。服务端直接校验通过返回了用户数据并在响应里种下Set-Cookie。图1 · loginByVcode请求与响应返回200种下Session CookieCookie值已打码这里有个特别容易踩的坑响应body里返回了一个token字段很多人会以为是认证凭证。但看了一眼就把它排除了——因为axios配了withCredentials: true真正的凭证是Set-Cookie里的XJSESSIONID。图2 · 浏览器Cookie存储面板红色框出的SessionCookie才是认证凭证值已打码三道本该有的校验——图形验证码绑定、短信验证码与手机号session比对、固定值黑名单——一道都没有。这个点就是整条链的入口钥匙。认证绕过的危害到此还只是能登录任意人账户。但更麻烦的在后面。04第二步凭证在手直接进账户拿着这套凭证带着Cookie调了一下账户相关接口。结果发现能做的比想象中多· /xxx/xxx/getUser —— 获取用户完整信息· /xxx/xxx/account/updateLoginName —— 修改登录名· /xxx/xxx/account/updateContact —— 修改联系方式· /xxx/xxx/account/updateLoginCode —— 修改登录密码直接锁定原用户。这些接口全部跟着XJSESSIONID走。这也意味着任意一个手机号能登录就能任意接管那个账户——改名字、改绑手机、改密码一气呵成。图3 · 接管后刷新直接进入账户主页域名去尾、账号/手机号/IP均已打码但单账户接管说明不了全盘风险。真正让意识到这平台凉了的是下一个接口。05第三步一接口拉穿全量账户账户管理模块里留意到一个接口/xxx/xxx/getAccountBaseInfo。名字里带getAccountBaseInfo看着像是拉机构账户基础信息用的。正常思路是传个accountCode查某个账户。但第一反应是这个接口有没有做权限校验如果参数不传会怎样图4 · 只传分页参数、不传账户过滤条件count直接是9697红色标注数据行已打码结果非常干脆——不传accountCode服务端直接把全量数据甩回来。count 9697意味着这个平台近一万条机构账户记录任何已登录用户都能拉走。每条记录里有什么看返回的JSON字段名就够了{“code”: 20000,“count”: 9697,“data”: [ {“eid”: 57,“accountCode”: “XXX”,“orgName”: “某私募”,“contactName”: “某姓名”,“contactTel”: “RZmS…DES口令见下,“contactMobile”: RZmS…”,“contactIdNo”: “7rsr…DES”,“contactEmail”: “xxx.cn”,“orgCreditNo”: “9144…统一信用代码”} ]}姓名、机构名、电话、手机号、身份证号、邮箱、统一社会信用代码……全套PII。这里敏感字段电话/身份证已经做了加密看起来是Base64的一坨字符串——这本来是个安全措施。可惜下一刀就破了。06第四步密钥写在前端加密等于装饰看到加密字段没有立刻放弃。第一个直觉是这个加密的密钥在哪往回翻刚才抓的JS加密配置原来就写在里面。// 前端JS中硬编码secretKey “c4f39ae9……密钥全值已隐去”// 算法DES-ECB PKCS7 paddingBase64编码传输密钥在前端意味着这套加密对服务端毫无意义——任何人扒JS都能拿到钥匙。加上DES-ECB本身是弱算法、密钥还被截断成8字节用解密一条只需要几行Python。key bc4f39ae9 # 前8字节cipher DES.new(key, DES.MODE_ECB)plaintext cipher.decrypt(b64decode(ct))输出0755-XXXX-XXXX跑了明文出来了。100%可还原。解密到这一步就停下手了——只验证算法可行不去碰真实用户的完整明文这是底线。图5 · 接口返回的JSON字段结构字段名完整保留人名/证件号/账号值已打码这条线是最值钱的一课前端加密只能防肉眼看防不了攻击者。只要密钥在前端加密就是装饰品。真正的敏感数据加密密钥必须待在服务端KMS里。07第五步再一个越权补全手机号这时候遇到一个缺口getAccountBaseInfo里很多账户的mobile是空的只有座机电话手机号拿不全。手机号少了登录链就没那么通。于是又去找一个账户带一个手机号的接口很快撞见 /xxx/xxx/queryOneAcctInfo。这接口按accountCode查账户的oneAcct信息。图6 · queryOneAcctInfo按任意accountCode查询返回加密的dataStrCookie/账号值已打码同样不校验归属——传什么accountCode就查谁的。返回的dataStr解密后就是该账户真实手机号、邮箱、机构简称。解密dataStr后{“mailAddress”: [“xxx.com”],“orgShortName”: “某资本”,“phone”: [“1XXXXXXXXXX”]}到这里缺的手机号也补齐了。把几步一串联攻击循环自然浮现。08第六步串起来就是一个攻击循环几个看似独立的洞首尾相接就变成了滚雪球① 任意手机号 固定验证码 → 登录拿XJSESSIONID② 带凭证调getAccountBaseInfo → 拉9687条账户数据③ 用前端密钥解密 → 还原一批手机号/身份证号④ 带凭证调queryOneAcctInfo → 补全缺失的手机号⑤ 用新手机号 固定验证码再登录 → 拿更多账户⑥ 重复②~⑤最终接管全部账户这就是链最可怕的地方——不是单个洞而是几个洞首尾相连、互相喂养。固定验证码提供入口全量接口提供数据前端密钥负责解密越权接口补全缺口最后又回到登录口越滚越大。09第七步最深处11269条程序化交易报告账户数据已经够严重了但这套平台最深的水位在另一个模块。程序化交易模块有个 /xxx/xxx/qryReport查程序化交易报告用的。正常它该传个fundId只查特定基金。照老思路试了一下——不传fundId服务端会不会把全量报告拉回来图7 · qryReport不传fundIdcount 11269响应215 KB红色标注数据全部打码果然11269条程序化交易报告全量回来了。每条报告里有什么看字段名就懂分量客户姓名 / 身份证号(DES可解密)业务电话(DES可解密) / 资金规模交易策略 / 期货账号 ……姓名、身份证、电话能解密再加上资金规模、交易策略、期货账号——这是客户的交易底牌。对金融行业来说这就是商业机密级别的信息不是隐私问题能概括的。返回里还涉及上海、深圳、广东等地多家知名私募。顺带同模块的qryProtocol接口又暴露了内网文件服务器地址10.x.x.x:8007内网段外网接口直接返回内网地址又是一处信息泄露——为后续内网渗透留了路。10定性为什么这条链是严重级定级习惯看三件事触达难度、破坏属性、影响范围。触达难度一个手机号 固定验证码零门槛 —— 归零。破坏属性机密性全崩近万条PII 超万条交易报告 完整性被破坏改密码、接管账户。影响范围全平台账户、全量程序化交易客户涉及持牌机构与多家私募。三者叠加严重级没有悬念。而且它是一条链——单个洞修了其他洞还串着必须整条链一起堵。这条线告诉你定级别看技术上像不像高危要看攻击者站在门外几步能走到最里面、能拿到什么。三步以内进核心数据基本就是严重。11根因四个地方一起松了复盘到底不是某一行代码错了是四道本该独立起作用的闸同时失灵任何一道真起作用这条链就断。① 验证码形同虚设图形验证码不绑session、短信验证码不对比手机号、固定值没进黑名单。三道组成一道闸全漏。② 接口不做权限校验getAccountBaseInfo、queryOneAcctInfo、qryReport全都不查数据归属任何已登录用户都能拉全量/查任意账户。③ 加密密钥放前端DES密钥硬编码在JS加密等于装饰明文100%可还原。④ 内网信息外漏内网文件服务器地址通过外网接口直接返回。5修复从根上堵① 验证码做真图形验证码绑session短信验证码绑手机号session万能值进黑名单加失败次数限制。② 全接口权限审计orgManage / oneAcct / programTrd模块的每个查询接口都做数据归属校验普通用户只能查自己的。③ 密钥收回到服务端立即从前端移除密钥DES-ECB换成AES-256-GCM 随机IV密钥存KMS。④ 内网资源不外漏文件下载走代理或临时外链内网地址不出现在外网响应里。⑤ 收尾强制全部Session失效重登对批量查询接口加访问日志与异常告警。12这一条链教了三次读接口的思路回过头看这条链每一步都没有用到什么冷门奇技淫巧全是跟着接口行为走、顺着业务逻辑推。真正值钱的是那三句多问一句读JS是攻击面测绘的第一杠杆。比扫目录、跑字典省事得多接口路由、鉴权方式、加密配置全写在里面。这一步省掉后面全是瞎撞。看到查询接口先想能不能不传过滤条件。很多越权不是靠改参数枚举出来的是靠不指定对象直接拉全量试出来的。getAccountBaseInfo、queryOneAcctInfo、qryReport三个洞同出一辙。看到加密字段别急着放弃先问密钥在哪。密钥在服务端是安全在前端就是纸糊的门。13挖这种级别的洞底线放最后说· 只在授权范围内验证用自有测试账号真实用户数据只读结构、不读完整内容。· 数据量取到证明影响存在就停绝不拉全量、绝不导出、绝不留存。· 解密只验证算法可还原不解密真实用户的完整明文。· 上报讲根因、给修复方案不给可直接利用的一键脚本。一次负责任的验证抵得过一百次没头没脑的重放。尾最后说一句这条链最让感慨的不是某个环节有多刁钻而是每一个环节都只松了一点点——验证码图省事、权限校验怕麻烦、密钥放前端图方便、内网地址随手返。单独看都好像没那么危险串起来就是灾难级。安全没有差不多就行。任何一道闸真的起作用这条链就断了。可偏偏四道闸一起开着。这也是做测试最有价值的地方——不是炫技是把大家都觉得没问题的地方一个个拎出来看清楚。合规、克制、把思路讲清楚比能打穿任何一家都重要。本文为企业SRC测试的实例复盘与思路教学。平台名称、域名、会话凭证、真实用户数据、私募基金名、加密密钥全值均已脱敏接口端点、请求方法、状态码、JSON字段名作为讲解对象完整保留。内容不含可直接利用的攻击配方。只松了一点点——验证码图省事、权限校验怕麻烦、密钥放前端图方便、内网地址随手返。单独看都好像没那么危险串起来就是灾难级。安全没有差不多就行。任何一道闸真的起作用这条链就断了。可偏偏四道闸一起开着。这也是做测试最有价值的地方——不是炫技是把大家都觉得没问题的地方一个个拎出来看清楚。合规、克制、把思路讲清楚比能打穿任何一家都重要。互动话题如果你对网络攻防技术感兴趣想学习更多网安方面的知识和工具可以看看以下题外话网络安全的知识多而杂怎么科学合理安排下面给大家总结了一套适用于网安零基础的学习路线应届生和转行人员都适用学完保底6k就算你底子差如果能趁着网安良好的发展势头不断学习日后跳槽大厂、拿到百万年薪也不是不可能初级黑客1、网络安全理论知识2天①了解行业相关背景前景确定发展方向。②学习网络安全相关法律法规。③网络安全运营的概念。④等保简介、等保规定、流程和规范。非常重要2、渗透测试基础一周①渗透测试的流程、分类、标准②信息收集技术主动/被动信息搜集、Nmap工具、Google Hacking③漏洞扫描、漏洞利用、原理利用方法、工具MSF、绕过IDS和反病毒侦察④主机攻防演练MS17-010、MS08-067、MS10-046、MS12-20等3、操作系统基础一周①Windows系统常见功能和命令②Kali Linux系统常见功能和命令③操作系统安全系统入侵排查/系统加固基础4、计算机网络基础一周①计算机网络基础、协议和架构②网络通信原理、OSI模型、数据转发流程③常见协议解析HTTP、TCP/IP、ARP等④网络攻击技术与网络安全防御技术⑤Web漏洞原理与防御主动/被动攻击、DDOS攻击、CVE漏洞复现5、数据库基础操作2天①数据库基础②SQL语言基础③数据库安全加固6、Web渗透1周①HTML、CSS和JavaScript简介②OWASP Top10③Web漏洞扫描工具④Web渗透工具Nmap、BurpSuite、SQLMap、其他菜刀、漏扫等恭喜你如果学到这里你基本可以从事一份网络安全相关的工作比如渗透测试、Web 渗透、安全服务、安全分析等岗位如果等保模块学的好还可以从事等保工程师。薪资区间6k-15k到此为止大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗想要入坑黑客网络安全的朋友给大家准备了一份282G全网最全的网络安全资料包免费领取网络安全学习路线学习资源7、脚本编程初级/中级/高级在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中面对复杂多变的网络环境当常用工具不能满足实际需求的时候往往需要对现有工具进行扩展或者编写符合我们要求的工具、自动化脚本这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中想要高效地使用自制的脚本工具来实现各种目的更是需要拥有编程能力.零基础入门建议选择脚本语言Python/PHP/Go/Java中的一种对常用库进行编程学习搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP IDE强烈推荐Sublime·Python编程学习学习内容包含语法、正则、文件、 网络、多线程等常用库推荐《Python核心编程》不要看完·用Python编写漏洞的exp,然后写一个简单的网络爬虫·PHP基本语法学习并书写一个简单的博客系统熟悉MVC架构并试着学习一个PHP框架或者Python框架 (可选)·了解Bootstrap的布局或者CSS。8、高级黑客这部分内容对零基础的同学来说还比较遥远就不展开细说了贴一个大概的路线。网络安全工程师企业级学习路线很多小伙伴想要一窥网络安全整个体系这里我分享一份打磨了4年已经成功修改到4.0版本的**《平均薪资40w的网络安全工程师学习路线图》**对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。学习资料工具包压箱底的好资料全面地介绍网络安全的基础理论包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等将基础理论和主流工具的应用实践紧密结合有利于读者理解各种主流工具背后的实现机制。网络安全源码合集工具包视频教程视频配套资料国内外网安书籍、文档工具好了就写到这了,大家有任何问题也可以随时私信问我!希望大家不要忘记点赞收藏哦!特别声明此教程为纯技术分享本文的目的决不是为那些怀有不良动机的人提供及技术支持也不承担因为技术被滥用所产生的连带责任本书的目的在于最大限度地唤醒大家对网络安全的重视并采取相应的安全措施从而减少由网络安全而带来的经济损失。网络安全学习路线学习资源本文转自网络如有侵权请联系删除。