声明:只是用于学习交流,笔记记录,不可用作违规用途。
一、业务逻辑漏洞简介
简单理解:就是编程人员的思维逻辑不够严谨导致攻击者有机可乘的漏洞。
逻辑漏洞还是一种虽然没有在owasp top10中提及到,但是往往会存在的漏洞,并且在hvv,渗透测试中广泛存在,造成的破坏可能一点不比sql注入,xss等漏洞小,如下是逻辑漏洞的top10挖掘方向。
二、常见的逻辑漏洞
交易支付、密码修改、密码找回、越权修改、越权查询、突破限制等各类逻辑漏洞,逻辑漏洞很多时候都需要脑洞大开。
三、场景
1、饮料贩卖机
- 替换订单ID,创建订单时在支付界面,在此创建订单替换订单ID(高价替换低价)
- 无限新用户优惠订单,重复创建优惠订单
- 替换优惠券ID(未达到条件使用)
- 个别情况订单数量为1.99时,客户端只支付1元,实际上服务器认为支付了2元。
- 取货时并发
2、直播
- 快速进出房间炸房
- 无限发送点赞协议
- 修改礼物数量,0,小数,负数,特定值(一般情况下为1073741824)
- 修改礼物ID,遍历尝试是否有隐藏ID。
- 并发送礼物,抽奖
- 无限创建首次优惠订单,有些首次优惠订单是一个特殊的pid,这种直接替换pid进行支付,有些是相同的ID,这种的提前创建订单,记录多个订单号在依次修改订单支付。
- 刷屏:发言刷屏,分享,点赞等有提示的地方刷屏。
- 房间内可以申请的地方进行申请取消操作,看看是否能炸房。
- 越权踢人,增加管理员,关闭房间等操作。
- 发送的表情是否可以修改长宽
3、购物APP
- 购买数量:为0,小数,负数,正负值
- 代金券:并发领取,遍历领取,同一个代金券重复使用,未满足条件使用代金券
- 越权:登录,操作别人订单,修改资料
4、外卖
- 商品数量,0,负数,小数,特定值,正负数
- 送餐员评价修改,星级,打赏金额
- 订单超出送餐地址
- 强行货到付款,取消订单,退款
- 越权操作别人订单,登录
- 优惠购买会员(重复使用优惠购买)
5、交易平台
- 钱包并发提现,负数提现
- 使用钱包支付时多个订单并发支付(是否支付金额能大于余额)
- 转账负数,并发转账
- 上架商品突破限制,例如数量,字数
- 替换订单,创建订单号如果订单状态可修改,先进到支付界面,然后将订单修改成更大的金额,然后支付提前进入的支付界面。
- 数量修改
6、社交
- 强行举报(读取本地消息上传那种)
- 强行加好友(一般尝试重发通过好友这条协议)
- 自由修改号码(靓号类)
- 群管理无限禁言
- 越权禁言,踢人,拉黑
- 会员修改金额,数量。无限优惠购买。
- 非会员使用会员功能。
7、漫画
- 打赏金额为负数,小数,特定值(溢出)
- 越权删除评论,登陆
- 修改充值金额
- 付费漫画免费看
- 评论图片数量过多会导致客户端加载卡死
8、音乐
- 唱歌类软件修改上传分数等参数
- 付费下载尝试替换下载ID
- 修改付费下载金额
- F12查看下是否有歌曲地址
9、网约车
- 无限叫车,重复发送协议造成市场混乱
- 修改评价分数
- 修改现实优惠叫车关键参数
- 替换优惠券
- 越权操作其他订单
四、根据漏洞出现位置来总结
五、如何挖掘
- 确定业务流程
- 寻找流程中可以被操控的环节
- 分析可被操控环节中可能产生的逻辑问题
- 尝试修改参数触发逻辑问题
六、注册处存在的逻辑漏洞
1、ZZCMS8.1批量注册
在这里使用phpstudy搭建好了zzcms,注册填写相关信息,然后抓包。
将数据包发送到repeater,每次修改username值,发现,只需要修改username值就可以注册
成功⽤户,图形验证码⽆效,并且未对电话,邮箱等信息校验,可批量注册
2、ZZCMS8.1批量猜解用户
同样是注册功能,在输⼊⽤户名时,发现会提示⽤户名是否存在,猜测该位置可以猜测哪些⽤户注册过该⽹站
在这里可以抓包,会发现对用户名id进行判断,发送到监测器,可以批量探测已经注册过的用户。
七、登录部分存在的逻辑漏洞
1、暴力破解用户名或密码
暴力破解用户名密码的情况,一般出现在登录部分没有验证码机制,没有根据用户名限制失败次数,没有根据IP限制失败次数等情况下。
一般来说:
- 直接拿密码字典爆破某一个用户名
- 拿固定的弱口令密码,去跑用户名
- 如果只是用户名限制失败次数,可以使用思路2的方法
- 在存在返回提示用户名错误或者密码错误的情况下,可以分别爆用户名和密码
常见限制:有时候会发现用户名或者密码是密文加密,这是可能通过前端或者其他方式加密,对于简单的来说base64编码和md5签名是很好识破的,在爆破的时候可以选择encode和hash。
2、利用cookie&session
(1)cookie的作用和介绍
1、可以在客户端上保存用户数据,起到简单的缓存和用户身份识别等作用
2、保存用户的登录状态,用户进行登录,成功登录后,服务器生成特定的cookie返回给客户端,客户端下次访问该域名下的任何页面,将该cookie的信息发送给服务器,服务器经过检验,来判断用户是否登录。
3、记录用户的行为
(2)cookie分类
cookie分为会话cookie和持久cookie。
会话cookie是指在不设定它的生命周期,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话cookie就会跟随浏览器而销毁。
持久cookie则是设定了它的生命周期,此时,cookie像商品一样,有个保质期,关闭浏览器后,它不会销毁,知到设定的过期时间。
(3)cookie伪造
cookie伪造:通过修改cookie中的某个参数来实现登录其他用户。
测试方法:
- 使用一个账号登录,找一个可以证明身份的页面,例如首页的欢迎XX或者是个人中心显示昵称的地方。
- 刷新该页面拦截请求,观察cookie中的字段和值,例如 userid=xxx,修改cookie中的值,把xxx改成admin。
- forword放行,页面显示admin信息,则存在此问题。
修复方法:对于客户端标识的用户信息,使用session会话认证方式,避免通过cookie去仿冒其他人的身份。
(4)cookie登录绕过漏洞
如果用户登录验证使用cookie身份验证会存在安全隐患,cookie信息是外部控制的,如果验证不严很容易被绕过。
模拟环境:cookie身份绕过。
cookie可以在浏览器提交的数据进行修改的。
绕过方法:用buspteuie修改username不等于空即可绕过。
修复方式:
1、使用cookie身份验证时,不要使用简单的验证,对外部输入的参数进行过滤。
2、尽量使用session安全认证,session是外部不可控的。
(5)cookie和session的区别
cookie实际上是一小段文本信息,客户端请求服务器,绕过服务器需要记录该用户的状态,就使用response向客户端浏览器颁发一个cookie,客户端浏览器会把cookie保存起来,当浏览器再次请求该网站时,浏览器就会把请求地址和cookie一同给服务器,服务器检查该cookie,从而判断用户的状态,服务器还可以根据需要修改cookie的内容。
session是另一种记录客户状态的机制,不同的是cookie保存在客户端浏览器中,而session保存在服务器上,客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session,客户端浏览器再次访问时只需要从该session中查找该客户的状态就可以了。
(6)session会话固定攻击
Session会话固定攻击:一种诱骗受害者使用攻击者指定的会话表示的攻击手段,利用了服务器的session不变的机制。
测试方法:
- Session会话注销测试
用户注销或者退出应用时,利用登录时的Session是否能再次利用登录。 - Session会话超时时间测试
用户登录系统后,在固定时间没有与服务器任何交互操作,刷新页面,看是否需要重新登录账户。
攻击者重置Session id的方法:通过xss,嗅探等方法取得用户的session,修改数据包。
修复方法:
每次登录成功之后重新生成session,session id闲置过久时,进行重置session id。
(7)Session身份绕过漏洞
使用已经登录用户的session,修改用户名为任意用户,同样可以成功登录。
修复方法:不要把session放置网站目录,绕过需要就设置权限访问,除了本地其他用户禁止访问。
八、支付时存在的逻辑漏洞
大米CMS支付逻辑漏洞复现
在产品展示中,商品大米测试产品价格6000元,网站存在支付逻辑漏洞,可以使用1毛钱购买6000元的大米测试产品。
开启抓包,点击加入购物车。
将price改为1,qty改为10,发送。(数量为10,价格为1)
在购物车即可看到已经被修改。
除了上述修改商品数量的方法,支付时的逻辑漏洞还包含以下几种思路:
修改商品编号,条件竞争,金额修改,充值中放弃订单未生效。
九、业务处理-越权漏洞
1、越权访问漏洞概念简析
(1)授权与验证
了解越权访问的概念,首先要了解授权和验证的概念,授权是指网站赋予特定人对网站特定资源的读写权限,而验证是网站用于检查操作者是否真的可以对特定资源进行读写。
(2)未授权访问
未授权访问是指用户在梦游通过认证授权的情况下,能够直接访问需要通过认证才能访问到的页面或文本信息。
2、什么是越权漏洞
由于梦游对用户权限进行严格的判断,导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超管)范围内的操作,如果能够成功操作,则称之为越权操作,越权漏洞形成的原因是后台使用了不合理的泉休闲校验规则导致的。
3、越权漏洞的产生原因
开发人员在对数据进行操作时对客户端请求的数据过分相信,遗漏了对于客户端权限的仔细判定。
4、越权漏洞常见位置
1、修改、重置、找回其他账户密码
2、查看、修改其他账户未公开的信息,例如个人资料、文件、数据、程序等
3、与账户关联的权限操作
5、越权访问漏洞的分类
越权漏洞主要分为水平越权和垂直越权两大类。
(1)水平越权
同级别(权限)的用户或者同一个角色的不同用户之间,可以越权访问,修改或者删除的非法操作,如果出现此漏洞,你们将可能会造成大批量数据泄露,严重的甚至会造成用户信息被恶意篡改。
(2)垂直越权
指使用权限低的用户可以访问权限较高的用户。
危害:
向上越权:普通用户可以执行管理员权限, 比如发布文章,删除文章等。
向下越权:一个高级用户可以访问低级用户信息(暴露用户隐私)。
6、水平越权:metinfoV40越权漏洞
在会员中心注册登录,登录后进入修改基本信息的页面,随便修改一个密码,点击提交信息的同时抓包。
抓包修改useid为管理员id。
成功修改管理员账号密码为123456,尝试后台登录。
7、垂直越权:CouchDB垂直权限绕过漏洞(CVE-2017-12635)
(1)漏洞描述
Apache CouchDB是⼀个开源数据库,专注于易⽤性和成为”完全拥抱web的数据库”。它是⼀个使⽤JSON作为存储格式,JavaScript作为查询语⾔,MapReduce和HTTP作为API的NoSQL数据库。应⽤⼴泛,如BBC⽤在其动态内容展示平台,Credit Suisse⽤在其内部的商品部⻔的市场框架,Meebo,⽤在其社交平台(web和应⽤程序)。
在2017年11⽉15⽇,CVE-2017-12635和CVE-2017-12636披露,CVE-2017-12636是⼀个任意命令执⾏漏洞,我们可以通过config api修改couchdb的配置query_server,这个配置项在设计、执⾏view的时候将被运⾏。
影响版本: 小于1.7.0 以及 小于 2.1.1。
安装好环境。
刷新抓包,将包覆盖,发送,即可使用test 123456登录成功。
(2)后记
越权漏洞的产生归根究底,还是由于网站开发者和管理者授权意识的淡薄,授权的滥用,因此,授权应当遵守如下几条原则:
- 使用最小权限原则对用户进行赋权,对待权限做一只铁公鸡。
- 使用合理(严格)的权限校验规则。
- 使用后台登录状态作为条件进行权限判断。
十、密码找回时存在的逻辑漏洞
1、邮箱弱token
(1)Unix时间戳+md5
通过邮箱找回密码,正常流程去邮箱查看重置密码链接,发现链接处有一串md5加密字符串。
重置他人密码只需力量用他人邮箱发送重置密码右键,在短时间内对Unix时间戳进行暴力破解,即可获得重置密码的链接。
(2)用户名
重置密码链接直接使用用户名进行区别,改变用户名即可更改他人密码。
(3)服务器时间
利用两个账号同时点击找回密码,去邮箱查看找回密码的链接,发现两者随机token只差1-2,而且可以猜测出为服务器时间,所以可以用一个未知账号和一个已知账号同时点击找回密码,稍微遍历随机token,就可以构造出未知账号的没密码找回链接。
2、生成可控token
例如当我们通过邮箱找回密码,正常流程下抓包查看提交验证码后返回的数据,有加密字符串,这个加密字符串和后面重新设置新密码URL链接中的加密字符串一样。
所以可以利用这个加密字符串实现新密码rul中的加密字符串可控。
根据上面提交验证码的抓包,修改user为其他用户,发送就可以返回其他用户的加密字符串。
接着重新返回到找回密码首页,利用其他用户找回,点下一步,到输入验证码处,直接修改URL链接,加入加密字符串,可以直接绕过验证码,重置密码。
3、短信验证码找回密码
1、进入某网站,找到找回密码或密码重置的功能点,首先填写自己的手机号码进行密码找回。
2、收到验证码后填入验证码和新密码提交,这时候使用数据抓包工具进行抓包,将数据包中的账户属性修改为其他账号,然后就可以使用自己设置的密码登录其他账户。
4、重新绑定用户手机
- 首先注册一个某邮箱的测试账号,然后会跳转到一个手机绑定页面上。
- 注意此链接中有个参数为UID,将UID修改为其他人的邮箱账号,填入一个可控的手机号码,获取验证码,确定后这个目标有限已经被越权绑定了密保手机。
- 走正常的密码取回流程,发现这个邮箱多了一个通过手机找回密码的方式,这个手机号就是刚绑定的手机号码。
- 获取验证码并填入新密码,最终重置目标账户的密码。
5、重新绑定用户邮箱
- 首先注册一个某网站的测试账号
- 连接尾部的一串数字时用户的ID,通过修改ID可以进入其他用户的页面,该页面提供了更改邮箱的功能,可以在此处将邮箱地址修改为自己测试的邮箱。
- 然后使用改邮箱进行密码找回。
6、密码找回漏洞
(1)模拟环境
(2)时间戳转换
(3)md5(当前时间戳+用户名)生成token原理
当前面条件都通过后就可以生成token,我们可以在提交key之前生成一分钟或者一个小时内的token值,用脚本去访问每一个链接。
(4)使用代码生成一个小时的token
<?php
function create_pass($username,$email){
$token=md5(time().$username.$email);
return $token;
}
for($i=1;$i<=3600;$i++){
$timex= create_pass('admin','admin@admin.com');
write_file($timex."\n");
echo $i."\r\n";
sleep(1);
}
function write_file($c){
fwrite(fopen("time.txt", "a+"),$c);
}
?>
(5)运行脚本,同时网页也提交我们的信息,让数据库更新token值
(6)token.php(上面代码)运行会在当前目录创建一个time.txt文件保存预测的token值
(7)此时我们可以根据预测的token值,在网页进行提交测试,如果token值多,可以使用burp枚举
(8)修改成功
链接上面是c=send&token=(获取到的)
(9)修复方法
- 修改加密算法和加密内容,一定要是强加密,也要做到增加猜解难度或密文不可猜解。
- 用户身份验证一定要在后端实现
- 在最后一步修改密码的动作时,一定要校验账号是否通过了验证、短信与手机号是否对应、发送短信与已校验账号不要使用同一个session名称。
十一、验证码存在的逻辑漏洞
1、暴力破解
要了解常见验证码机制:
- 有的验证码输入正确一次,在一定时间内不用再输入。
- 有的验证码输入正确一次,会在你session中设定一个值,告诉服务器你已经通过验证码验证了。
- 有的验证码因为逻辑问题只是一个摆设,正常的逻辑为先对比验证码是否正确,再检测账号密码是否有正确,反过来就成了摆设。
2、时间、次数突破
概念:重复提交携带验证码的数据包,查看返回包,判断次数。
测试方法:
填写正确登录信息和验证码→抓取提交数据包→重复提交该数据包→查看是否登录成功→登录成功则存在验证码重复使用问题。
3、回显测试
概念:验证码直接由客户端生成,在回显中显示,可以通过浏览器工具直接查看。
测试方法:
1、在源码中显示,源代码审计,搜索源码中有无验证码。
2、在cookie中显示,抓包时分析cookie中是否含有验证码。
4、绕过验证码
漏洞成因:
由于逻辑设计缺陷,可以绕过验证,比如直接删除cookie或验证码参数可绕过,当验证不通过清空session时,验证码参数值为空时绕过等。
测试方法:
- 输入正确账户信息和错误验证码,登录时抓包
- 删除cookie
- 客户端登录成功
5、篡改手机号
在需要手机号的短信验证处,抓包修改手机号,可能做到非本账号手机号获取能够编辑本账号的验证码。
zzcms8.1任意密码重置
忘记密码功能,我们输入用户名正确后会进行短信验证码,通过手机验证码或者游戏验证码。
要选择拦截此请求包的回应,可以抓到这个包。
将no改为yes发送。
会直接跳到更新密码。
十二、业务接口存在的逻辑漏洞
随着网络的不断发展,一些网站为了实现某些功能,需要去调用一些第三方接口,比如三大运营商的短信业务接口、支付宝、微信等第三方支付接口,那么在调用过程中,如果未能做一些安全处理,你们就会容易发生一些业务接口调用上的安全漏洞,常见的业务接口调用漏洞如下:
1、重放攻击
在短信、电话、邮件调用业务或生成业务数据环节中(短信验证码,电话验证码,邮件验证码,订单生成,评论提交等),对其业务环节进行调用(重放)测试,如果业务经过调用(重放)后被多次生成有效的业务或数据结果。
危害:
- 短信轰炸
- 电话轰炸
- 邮箱轰炸
- 恶意用户注册
- 恶意上传
- 恶意评论
2、接口未授权访问
测试方法:
只要是登录后才可以返回相关信息的接口,在未登录状态下也可以返回,就是未授权访问,在一般的网站测试中,可以http history中选择网站的根目录地址,然后右键spider from here进行爬取相关的url,然后在target栏下的site map中利用mime type进行筛选,主要关注一下json、script、xml等这些类型,然后把rul贴到浏览器中看是否能访问来验证。
修复方法:
利用token校验的方式,在url中添加一个token参数,只有token验证通过才返回接口数据且token使用一次后失效,在接口被调用时,后端对会话状态进行验证,如果已经登录,便返回接口数据,如果没有登录,则返回自定义的错误信息。