逻辑漏洞
前言
本处所写评论均是自我猜测,后续真正有逻辑漏洞挖掘经验后我会进行更新 --- 2022/04/06
产生原因
- 业务发展迅速
- 过快的发展会导致代码安全性不高。
- 内部监管不严
- 对代码的审核不够严谨,或者确实代码测试的环节。
- 开发水平不一
- 代码模块由不同的人编写,编写者没有互相协调好。
- 第三方组件缺陷
逻辑漏洞特点
- 无有效自动化测试方法
- 利用简单
- k防护设备(?)
- 危害极大
分类
- 登录体系安全
- 暴力破解
- cookie安全
- 登录验证绕过
- 加密测试
- 任意注册
- 业务一致性
- 手机号篡改
- 邮箱和用户名篡改
- 订单ID篡改
- 商品编号篡改
- 用户ID篡改
- 流程顺序
- 业务数据篡改
- 金额数据篡改
- 商品数量篡改
- 最大数限制突破
- 金额&优惠组合突破
- 密码找回
- 分析数据包,定位敏感信息
- 分析找回机制
- 修改数据包验证
- 任意账号密码找回
- 验证码突破
- 暴力破解
- 时间,次数突破
- 回显测试
- 验证码绕过测试
- 验证码检验机制猜解
- 会话权限
- 未授权访问
- 水平&垂直越权测试
- 会话固定&会话挟持
- 数据重放
- 恶意注册
- 短信&邮箱炸弹
- 内容编辑
- 条件竞争
- 信息遍历
- 接口安全
- app接口webservice
- 邮箱&短信网关接口
- 数据库接口
- 三方接口
接口安全
- 数据库接口
- 查询搜索
- 读取写入
- 关联调用
- 三方接口
- Oauth(?)
- DB API(?)
- 分享接口
- 跳转接口
- 支付/订单接口
- 金额篡改
- 数据篡改
- 程序异常
- 订单遍历
- 登录接口
- 注册接口
- 登录接口
- 忘记密码
- 用户检测
- 短信&邮件接口
- 验证码
- 内容截获
- 数据重放
- 其他信息调用接口
- APP接口
- Web调用
- 内网应用调用
- 内置链接(结合反编译)(?获取非公开API的意思吗?)
支付接口
程序处理异常
例子:
- 金额数量大额溢出
- 115网盘存在支付绕过
- wooyun-2012-05353
- (请求重发)阿里云主机多次下订单会出现0元订单
- (参数干扰)仍有个别参数会对金额产生影响而没有一起做签名
金额数据篡改
- 直接更改价格 wooyun-2014-82754
- 结合优惠促销篡改 wooyun-2016-200301
数量修改漏洞
- 负数
- 没有对购买数量进行限制 wooyun-2012-06708
验证码突破
- 图形验证码易识别
- 验证码不刷新
- 验证码前端校验
- 验证码前端回显
- 存在无验证码页面
- 验证码控制绕过
- ....
图形验证码测试方法
验证码时间,次数测试
重复提交携带验证码的数据包,查看返回值,验证次数
验证码客户端回显测试
抓包测试,是否有回显,验证码是会被返回
验证码绕过测试
抓包,删除验证码字段,查看是否可以成功发送。
抓包,正常流程下,记录验证码厚度数据包,替换目标包中内容,直接发送,查看是否可以绕过验证码。
图片验证码突破
验证码易识别
Burpsuite抓包,随后丢进Pkav HTTP Fuzzer爆破
验证码回显
验证码出现在了前端
验证码无条件不刷新
无条件不刷新是指在某一时间段,无论登陆失败多少次,只要不刷新页面就可以对一个账号或者多个账号进行无限次的暴力破解。
验证码有条件不刷新
有条件不刷新多见于如下情况:登录失败之后,系统会打开一个新页面或者弹出一个新的警告窗口,提示用户登录失败,点击确定后返回登录界面且验证码刷新。这种情况下,只要我们不关闭新窗口或弹窗,配合使用Burpsuite的intruder模块就可以进行暴力破解了。
验证码返回状态值绕过
修改response的返回值,绕过前端的验证。
存在无验证码的页面
如果我们发现网站验证码自身并不存在缺陷,那我们可以尝试寻找一些其他的无验证码的登录页面或接口来尝试暴力破解。
(这大概就是业务水平不一定情况,因为登录接口是可以服)
验证码空值绕过
验证码空值绕过是在日常的渗透测试中很容易被我们忽略的一点,实际应用中我们可以通过直接删除验证码参数或者Cookie中的一些值来绕过判断。
数据重放
短信炸弹
burpsuits截获数据包,重放,造成短信轰炸效果。
短信炸弹 空格绕过
找回密码处,可以发送短信验证码,此处有时间频率限制,对同一目标2分钟内限一次,在手机号前面加空格即可突破频率限制
短信炸弹 \n绕过
同上
条件竞争
多线程同一时间重放。
密码找回
密码找回测试流程
- 尝试正常密码找回流程
- 选择不同的找回方式,记录所有的数据包
- 分析数据包,找出敏感部分
- 分析后台找回机制所采用的的验证手段
- 修改数据宝进行验证是否存在密码找回漏洞
密码找回漏洞挖掘
- 用户凭证暴力破解
- wooyun-2012-011833
- wooyun-2012-011720
- 返回凭证
- url返回验证码及token
- wooyun-2012-05630
- wooyun-2010-058210
- 密码找回凭证在页面中
- wooyun-2012-04728
- 返回短信验证码
- wooyun-2010-085124
- 邮箱弱token
- 时间戳的md5
- wooyun-2012-08333
- 用户名
- 服务器时间
- wooyun-2015-090226
- 用户凭证有效性
- 短信验证码
- wooyun-2010-053349
- wooyun-2010-053079
- wooyun-2010-020032
- 邮箱token
- wooyun-2012-012572
- 重置密码token
- wooyun-2010-078208
- 重新绑定
- 手机绑定
- wooyun-2012-08307
- wooyun-2010-081467
- 邮箱绑定
- wooyun-2015-092319
- wooyun-2010-086726
- 服务器验证
- 最终提交步骤
- wooyun-2013-018263
- 服务器验证可控内容
- wooyun-2014-080278
- wooyun-2010-082582
- 服务器验证逻辑为空
- wooyun-2015-088927
- 用户身份验证
- 账号与手机号码绑定
- wooyun-2014-080278
- 账号与邮箱账号绑定
- wooyun-2010-078208
- wooyun-2015-091216
- 找回步骤
- 跳过验证步骤直接到设置新密码页面
- wooyun-2010-042404
- wooyun-2015-098765
- 本地验证
- 在本地验证服务器的返回信息,确定是否执行重置密码,但其返回信息是可控的内容,或者可以得到的内容
- wooyun-2010-069987
- wooyun-2010-083035
- wooyun-2014-069987
- 发送短信等验证信息的动作在本地进行,可以通过修改返回包进行控制
- wooyun-2010-020532
- wooyun-2010-020425
- 再找回密码处存在注入漏洞
- wooyun-2010-068060
- token生成
- token生成可控
- wooyun-2015-094242
- wooyun-2015-095729
- 注册覆盖
- 注册重复的用户名
- wooyun-2010-088709
- session覆盖
- wooyun-2014-085843
用户凭证暴力破解
- 四位或六位纯数字,验证码次数未限制
例如:根据手机号找回密码,随便输个验证码,抓包,暴力破解验证码(假如只有四位),很快就可以破解出来。
返回凭证(验证码及token)
- 抓包直接返回
例如:根据手机号找回密码,抓包,可以发现验证码直接显示verifycode=xxxx,或者由 md5 加密后显示,解密即可(同理,有的时候输入用户名,抓包可以看到返回的手机号等其他信息)。 - 密码找回凭证在页面中
例如:通过密保问题找回密码,查看源码,密保问题和答案就在源码中显示。
邮箱弱token
- 用户名
重置密码链接直接使用用户名来区别,改变用户名即可更改他人密码。 - Unix时间戳 + md5
例如:
通过邮箱找回密码,正常流程去邮箱查看重置密码链接,发现链接处有一串 md5 加密字符串;
字符串解密,类似 1491293277(10位),可以判断为 Unix时间戳;
重置他人密码只需要利用他人邮箱发送重置密码邮箱,在短时间内对 Unix时间戳 进行暴力破解,即可获得重置密码的链接。 - 服务器时间
例如:利用两个帐号同时点击找回密码,去邮箱查看找回密码的链接,发现两者的随机 token 只差 1-2,而且可以猜测出为服务器时间,所以可以用一个未知帐号和一个已知帐号同时点击找回密码,稍微遍历一下随机 token,就可以构造出未知帐号的密码找回链接
用户凭证有效性
- 短信验证码
- 例如:通过他人手机号找回密码,抓包,将他人手机号替换成自己的手机号,获取验证码,提交后修改密码。
通过自己手机号找回密码,获取验证码后抓包,将数据包中的 username 改为他人用户名,提交后成功修改他人密码。 - 2.邮箱 token
例如:通过邮箱找回密码,访问链接重置密码,输入新密码后提交时抓包,虽然有 token,但是依然可以直接修改用户ID进而修改他人密码。 - 3.重置密码token
- 例如:正常流程下,对每个功能模块进行抓包,分别是发送验证码,验证验证码是否正确,获取token,重置密码;
接下来,用他人帐号通过邮箱验证,抓包,将其中 Cookie 内从 JSESSIONID 开始的内容替换至正常流程的发生验证码包内,同时替换自己接受验证码的邮箱,提交;
通过邮箱获取验证码后,将验证码、Cookie、他人帐号、自己邮箱替换至验证验证码模块,提交(不用在意返回是否错误);
继续替换内至获取 token 模块,提交获取 token;
最后将获取的 token 和上面的内容替换至最后的重置密码模块,提交成功修改密码。 - wooyun案例:https://www.secpulse.com/archives/26590.html
重新绑定
- 手机绑定
- 例如:
给已知账户绑定手机,查看绑定手机的URL链接中的uid参数,修改uid参数为他人的,看是否可实现将他人的账户绑定上自己的手机,之后通过手机来修改密码。
修改个人资料处抓包,修改userId为他人,修改mobilePhone为自己的手机,看是否可实现将他人的账户绑定上自己的手机,之后通过手机来修改密码。
- 邮箱绑定
例如:
通过邮箱找回密码,URL链接中修改用户ID为他人,邮箱不变,之后通过链接看是否可以将他人账户绑定为自己的邮箱,之后通过邮箱找回密码
服务器验证
- 最终提交步骤
例如:通过邮箱找回密码,最后通过链接至修改密码页面,修改密码后提交,抓包,即最后一步修改动作中的Uid参数,修改为他人的,看是否可以修改其他用户密码。 - 服务器验证可控内容
例如:
正常流程,通过手机号提交验证码找回密码处抓包,记录下这个包的内容;
通过已知用户名找回密码,查看源代码中是否可以发现用户其他信息(比如:手机号、邮箱);
通过发现的手机号选择通过手机找回密码,随便输入短信验证码,抓包;
修改之前记录下的包的内容,将其中 Session id、用户ID 修改为刚刚从其他用户名抓包获得的内容,提交这个包,即可成功修改他人密码。
woyun案例:https://www.secpulse.com/archives/13935.html - 服务器验证的验证逻辑为空(绕过认证)
例如:通过密码保护问题找回密码,抓包,将密码保护问题删除,直接修改密码,提交。 - 用户身份验证
帐号与手机号的绑定
例如:通过手机找回密码,到保存密码步骤时,输入验证码和新的密码,并修改自己的手机为他人手机,看是否可以修改他人密码。
帐号与邮箱的绑定
例如:通过邮箱找回密码,点击请重新发送邮件处抓包,将邮箱改为自己的邮箱,通过链接成功修改密码w.secpulse.com/archives/13935.html
找回步骤
跳过验证步骤,找回方式,直接到设置新密码页面。
越权
越权漏洞是Web应用程序中一种常见的安全漏洞。它的威胁在于一个账户即可控制全站用户数据。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。而且属于逻辑漏洞的一种,防护和检测都不好做。
越权类型
- 水平越权:相同级别(权限)的用户或者同一角色不同的用户之间,可以越权访问、修改或者删除的非法操作,如果出现此漏洞,可能会造成大批量的数据泄漏,严重的甚至会造成用户信息被恶意篡改。
- 垂直越权:不同级别之间或不同角色之间的越权。
- 向上越权
普通用户可以执行管理员权限,比如发布文章、删除文章等操作。 - 向下越权
- 一个高级用户可以访问低级用户信息(暴露用户隐私)。
- 向上越权
易发生的地方
- 基础参数:通过修改一下参数就可以产生水平越权,例如查看用户信息页面 URL 后加上自己的 id 便可查看,当修改为他人的id号时会返回他人的信息。再比如cookie中的参数就作为用户的凭据,修改这个凭据便可以其他用户身份通过验证。
- 多阶段验证:多阶段功能是一个功能有多个阶段的实现。例如修改密码,可能第一步是验证用户身份信息,号码验证码类的。当验证成功后,跳到第二步,输入新密码,很多程序会在这一步不再验证用户身份,导致恶意攻击者抓包直接修改参数值,导致可修改任意用户密码。
- 基于参数的访问控制:有的程序会在参数里面进行权限认证。如:www.xxx.com/uid=test&admin=0 ,把0改为1就有了admin权限。
- 隐藏链接:有的程序会把页面独立,让爬虫爬取不到,但是可以使用扫目录的方式扫到url,如果此时页面不做权限认证,就可直接访问到功能点,或者只是前端跳转,可以使用burp抓回包,然后删除js代码绕过。
- 越权可能存在的地方:增、删、改、查、详情、导出等功能,当有这些功能的时候提高重视,在url、post data、cookie处寻找是否有鉴权参数
- 最关键的点就是定位鉴权参数,然后替换为其他账户鉴权参数的方法来发现越权漏洞。
越权漏洞挖掘
测试水平越权漏洞一般要控制2个账号,来互相探测能否影响到对方数据,一般是使用2个浏览器,分别使用2个账号登陆,在各个功能点修改参数(get、post、cookie)观察是否会影响到另一个账号的数据。 测试垂直越权一般看是否补通过认证即可访问管理页面,或是找是否有一个参数表示身份权限是否是管理员。
在测试越权漏洞的过程中也必然会涉及到订单ID的篡改、编号篡改、用户ID遍历、数据重放等操作。
未授权访问
未授权访问是指用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问到的页面或文本信息。可以尝试在登录某网站前台或后台之后,将相关的页面链接复制于其他浏览器或其他电脑上进行访问,看是否能访问成功。
登录体系安全
- 登录账号密码可以暴力破解
- 登录默认口令/弱口令的
- 短信验证码可爆破
- 登录返回包中有验证码
- 登录返回页面hidden中有验证码
- 有些其他登陆url中不需要验证码
- 登录验证码不变,验证码没有一个完整的服务请求,只在刷新url时才变
- 第一次登录请求包验证了验证码是否正确,第二次请求不需要验证
- 登录验证码和用户名、密码是否一次同时提交
- 公众号,app无验证
- 登录时默认填充账号的
- 弱加密,未使用 HTTPS,前端加密,用密文去后台验证
账号暴力破解——未限制登录次数
未限制爆破,即对于用户登录的地方没有做什么限制爆破的策略,因此对于这个地方可以直接使用burpsuit来抓包放进intruder模块爆破
账号暴力破解——限制登录次数
限制登录次数即对某个账号的登录次数进行限制,如果超过限制次数,账号就会被锁定,除非管理员解锁或者设定一段时间过后自动解锁,对于这种情况,通常可以采用弱密码来爆破账户的方式,即设置任意的不超过爆破次数的弱密码数量来反过来爆破用户名
账号暴力破解——限制IP登录次数
限制某IP登录次数即对某个IP的登录次数进行限制,如果超过限制次数,账号就会被锁定,除非管理员解锁或者设定一段时间过后自动解锁,对于这种情况,可以采用X-Forwarded-For的方法爆破账户。
x-forwarded-for
X-Forwarded-For (XFF) 在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的IP地址。如果想要获得最初发起请求的客户端的IP地址的话,那么 X-Forwarded-For 就派上了用场。
这个消息首部会被用来进行调试和统计,以及生成基于位置的定制化内容,按照设计的目的,它会暴露一定的隐私和敏感信息,比如客户端的IP地址。所以在应用此消息首部的时候,需要将用户的隐私问题考虑在内。
HTTP 协议中的 Forwarded 是这个消息首部的标准化版本。
X-Forwarded-For也是一个电子邮件相关协议中用到的首部,用来表示一封电子邮件是从其他账户转发过来的。
账号自动填充
访问页面,发现页面自动填充了管理员账号,尝试密码123456
默认口令
如戴尔控制卡默认口令root/calvin,海康威视默认口令admin/12345等
弱口令
admin /admin123
万能密码
1' or 1=1 --登录
业务逻辑漏洞终总结
- 测试业务的时候,先了解清楚业务整体流程,可以利用思维导图快速理清各个业务之间的关系,也可以通过查看 JS 了解(JS 中可能会存在信息泄漏)
- 重点关注的业务:个人(他人)信息、密码修改(找回)、支付流程、注册流程、需要手机(邮箱)验证的业务
对每个业务模块进行抓包,分析其中各种请求,注意特殊参数,很有可能就是这些特殊参数决定了业务步骤
抓包重放的过程,需要多次实验,判断是否可以跳过(绕过),如何跳过(绕过),纯数字可以用 数字 + 字母 尝试绕过 - 返回包中数据的分析,关注特殊字符串和特殊参数
综上所述,业务流程需同时结合HTTP/HTTPS请求分析,关注重点在各种可以用于区别的参数,绕过必要验证,跳过业务步骤。
文章评论