【SRC】逻辑漏洞

支付漏洞

0x01 修改支付价格

在支付当中,购买商品一般分为三步骤:订购、确认信息、付款。

那么这个修改价格具体是修改哪一步时的价格呢?在我看来,你可以在这三个步骤当中的随便一个步骤进行修改价格测试,如果前面两步有验证机制,那么你可在最后一步付款时进行抓包尝试修改金额,如果没有在最后一步做好检验,那么问题就会存在,其修改的金额值你可以尝试小数目或者尝试负数。

这里我找到了相关例子: 总价=(单价*数量-优惠券)*折扣+积分+运费

https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2016-0211806
https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2016-0203791
https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2016-0174347
http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2016-0226613

0x02 修改支付状态

这个问题我隐约的遇到过,之前在找相关资料的时候发现了一篇文章讲的是修改支付状态为已支付状态这样的思路,然后勾起了我的回想,这个问题是没有对支付状态的值跟实际订单支付状态进行校验,导致点击支付时抓包修改决定支付或未支付的参数为支付状态的值从而达到支付成功。

这个就类似于我们之前说的登录的⼀些逻辑漏洞⼀样,⽹站直接通过响应码判断是否成功。例如200成功,400失败等。
此外还有,例如A订单-0001完成——B订单-0002未完成
付款时尝试把订单B的单号给成订单A,也可能会导致未付款直接显示完成

这里是一个例子,虽然其文章作者测试失败了,但我觉得思路是非常不错的,例子:

①:https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2016-0174347

0x03 修改购买数量

在支付的过程中,数量也同时决定着价格,比如:1个数量商品对应的是100,2个数据就是200,那么当你修改这个值数量值为负数时,那么其金额也会变为负数,最后就会导致支付问题的产生。

https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2016-0167386
https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2015-0163435
https://www.freebuf.com/vuls/212089.html

0x04 支付附属值修改

比如在很多购买的时候都可以利用积分或者优惠劵等等进行代替金额付款,那么就容易存在问题。在这里我把附属值分为几类进行讲述。

①:修改优惠劵金额

优惠劵其基本都是优惠一半,一般用优惠劵进行消费一般出现在第二个步骤当中:确认购买信息,在这个步骤页面当中,你可以选择相关优惠劵,然后直接修改金额大于或等于商品的价格就可以,或者直接修改其为负值进行尝试,最后进行支付,如果对这点没有加以验证,那么问题就会产生,直接支付成功。

②:修改优惠劵金额及业务逻辑问题

可能你看到这个标题会想到,你不是上一个讲的就是这个修改优惠劵金额的问题嘛?为什么还要再讲一遍这个?请继续看!

之前遇到过这个漏洞,这个漏洞也是逻辑问题导致了成功利用,同样在是在第二部确认购买信息当中有可选择优惠劵进行支付,但是,当你修改其优惠劵值为任意值或负值想要支付的时候,会回显支付失败,或者金额有误等一些提示,可能这时很多白帽子会很失望然后就会去其它点找问题了,但当你找到个人中心,点击订单详情,如果存在这个逻辑问题,那么此时在你刚刚修改优惠劵金额后点击下一步支付的时候,其实这时候就已经产生了订单了,你在订单详情内就可以看到支付金额为0,因为你刚刚修改了优惠劵金额嘛,然后你点击支付就可以支付成功。

当然,这里还要说下小技巧,有可能会支付失败,但是如果你找到的这个问题是一个一般业务分站点,如果有自带的一个钱包功能,那么你就可以利用这个只带的钱包功能去支付这个订单,而不要利用其它支付类型,那么就可以支付成功!

③:修改积分金额

有些网站有积分,比如你消费多少,评论多少就可以拥有一定的积分数量,这个积分可以在你付款的时候进行折扣其订单金额,如果这个没有做好积分金额的校验,那么当你在支付当中选择用积分为账户减一些金额的时候,可以抓包修改其积分金额为任意数或负金额,然后可0元支付成功。

https://wy.zone.ci/bug_detail.php?wybug_id=wooyun-2015-0139556
http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2016-0214319

0x05 ⽀付接⼝替换

比如一些网站支持很多种支付,比如自家的支付工具,第三方的支付工具,然后每个支付接口值不一样,如果逻辑设计不当,当我随便选择一个点击支付时进行抓包,然后修改其支付接口为一个不存在的接口,如果没做好不存在接口相关处理,那么此时就会支付成功。

0x06 重复支付

比如一些交易市场有一类似于试用道具或者其它,这个试用道具可以依靠签到获得,而这个道具的作用可以去试用一些商品,在你进行试用的时候会扣掉你的试用道具,当你试用完成或者主动取消试用时,试用道具会返回到账户

当中,你知道,签到得到的道具肯定很少,且如果想试用好一点的商品那么道具的数量就尤为重要了。
这里的问题就是如果没有进行对订单多重提交的校验,那么就可导致无限制刷道具,比如,你试用时抓包,然后你每次试用都会产生一个订单号,然后利用刚抓到的数据包进行批量提交,你就可以看到每次提交的订单号不一样,然后这时你再看订单可以看到同一个商品的无数订单,但试用道具数只扣了你第一个试验时的道具数,那么这时你申请批量退出试用,那么这么多订单,每退一个就会退相应的道具数量到账户当中,这就构成了无限制刷得问题。

0x07 最小额支付

在很多白帽子测试支付的漏洞时候,修改的金额往往都是0.01等或者负数,我想说这很容易错失掉一些潜在的支付问题,我就深有体会,在挖掘支付漏洞的过程当中,就遇到过,直到第三次再一次检测时才发现,比如一些网站有金币或者积分什么就相当于支付可以用这些支付,那么在充值的时候,比如:10元对应的积分值为100、50对应的是5000、100对应的是10000。

这个问题如果你在充值时进行修改其支付金额为负数或者0.01等是会显示支付失败的,但是如果你修改其金额为
1.00,那么支付就会成功,也就用1元购买到任意值得积分数量了,这是为什么呢?

其实你在测试过程当中细心点就可以很好发现的,这里最低就是1元,1元对应100积分,而你如果修改为0.01,那么对应的积分就是空值了,所以会显示失败,而当你修改为1元,那么1元这个支付接口是存在的,其后面积分数为其它金额的积分数,然后跳转过去支付就会以1元购买到比它多得多的积分数量,也可以是任意积分值

0x08 值为最大值支付问题

以前也是看到过相关的例子,一些网站比如你购买商品,这里有2个思路修改值,1是直接修改支付金额值为最大值,比如999999999,或者修改附属值,如优惠卷,积分等为999999999,如果这里逻辑设计有问题,那么其支付金额会变为0。

⼀般在开发当中,商品的⾦额都会⽤int 型来定义,那么 int 的最⼤值为2147483647,可以尝试修改为2147483648。看是否造成整数溢出,有可能⽀付状态异常,从⽽导致⽀付成功。
利⽤公式:2147483647/物品单价+1=物品数量

0x09 越权支付

这个问题很早之前有过,现在可能很少存在这类问题,在支付当中会出现当前用户的ID,比如:username=XXXXX,如果没有加以验证,其支付也是一次性支付没有要求输入密码什么的机制,那么就可以修改这个用户ID为其它用户ID,达到用其他用户的账号进行支付你的商品。

或者使⽤CSRF漏洞操作等等。

0x10 无限制试用

一些网站的一些商品,比如云系列产品支持试用,试用时期一般为7天或者30天,一个账户只能试用一次,试用期间不能再试用,但如果这个试用接口会做好分配那么很容易导致问题的发生。

这也是我遇到过的例子,比如:在支付的时候它URL后面的支付接口是3,而试用接口是4,那么此时你已经使用过了,复制下确认试用时的URL,修改后面的支付接口为3,那么此时就会调用购买支付接口,但是由于你本身这个产品就是试用的,其相应值绑定了这个试用商品,那么金额就肯定是0,那么最后点击支付,你就可以看到支付成功,试用成功,又重复试用了一次,然后他们的试用时间会累加在一起,这就导致了可无限制购买任何产品了。

0x11 修改优惠价

比如一些商品有优惠价,优惠多少多少,那么在支付时抓包,修改这个优惠价就可造成支付问题的产生。

0x12 四舍五⼊导致⽀付漏洞

这个漏洞上次看⼩伙伴交的补天,获得了⼚商1.2k的奖⾦,如何操作呢,我们来分析分析。

我们以充值为例,余额值⼀般保存到分为⽌,那么如果我充值0.001元也就是1厘,⼀般开发会在前端判断我们的数字,或者将最后⼀位四舍五⼊,使⽤⽀付宝充值是直接报错的,因为第三⽅⼀般只⽀持到分。

那我们如果充值0.019呢,由于⽀付宝只判断到分,所以导致只能⽀付0.01,⽽由于我们⽀付成功,前端
会将9四舍五⼊,直接变成0.02,所以等于直接半价充值。(这个漏洞京东也是有的,不过后来修复了。)

0x13 ⾸单优惠,⽆限重购

很多⼚家为了留住⽤户,都会有⼀个⾸⽉半价,或者是免费等等的活动,我们可以抓取这个数据包,进⾏多次⽀付,就可以⼀直优惠购买。(百度云去年有这个漏洞,可以⽆限6元⼀⽉超级会员。)

0x14 并发数据包

这个思路就是在买⼀个商品的时候,⽀付操作抓包,⾼并发环境下反复多次购买,有可能会造成⽐如10块钱的东⻄,⾼并发操作下,花10块钱买了很多个。有些环境下要先满⾜兑换条件,例如兑换2次,⼀次1元,⾸先余额要够4元才可以。

(发散思路:退款等等也同样是可以并发操作的。)

0x15 盲盒类抽奖

现在由于盲盒类的兴起,在线盲盒也多了起来,我们拿⼀个简单的举例,例如现在有三个盲盒,两个普通款,⼀个隐藏款,那我们如何100%能获得隐藏款呢,我们可以尝试修改盲盒的属性,例如隐藏款对应的id为1,普通款都为2,我们就可以将所有抽到id为2的修改为1即可。

0x16 直播打赏类

⼀些直播平台的礼物可能还是根据id值来进⾏划分,其中就有可能存在⼀些内部测试的礼物,我们可以尝试对礼物的id值进⾏⼀个遍历,查看是否有其他隐藏信息。

总结

暂时就简单总结这么多,这种⽀付类逻辑漏洞现在也有点难挖,⼚商很多都有token、加密等,但是这类漏洞其实⼜很好挖,因为很多时候看你的思路有多宽,骚套路有多深,漏洞就能挖多深。此外,⽀付类漏洞适可⽽⽌,搞太多可能还是会被请进去的。

测试思路

一、订单相关

1.选择商品时修改商品价格;
2.选择商品时将商品数量设置为负数;
3.商品剩余1时,多人同时购买,是否产生冲突;
4.商品为0时是否还能购买;
5.生成订单时修改订单金额;

二、结算相关

1.优惠打折活动多次重复使用;
2.拦截数据包,修改订单金额;
3.拦截数据包,修改支付方式;
4.伪造虚假订单,刷单;

三、支付相关

1.拦截数据包,伪造第三方确认信息;
2.保存用户付款信息被窃取;

四、退货相关

1.绕过商家确认直接退货;
2.绕过商品类型直接退货;(退货是否允许)

五、收货相关

1.绕过客户确认直接收货;

真实案例

免费报名

原理就是奖品要钱,那么我们把奖品id去掉那是不是就不用钱了,就可以直接报名活动了。

image-20240409150653240

0元购

image-20240409150748284

image-20240409150803566

验证码漏洞

短信轰炸

这类漏洞存在的原因是没有对短信验证码的发送时间、用户及其IP作一些限制。

案例1、正常的短信轰炸

burp一直发包即可

案例2、并发绕过

做了限制咋办?可以试试并发(万物皆可并发)

使用turbo intruder插件进行并发

案例3、删除cookie绕过

可以尝试把cookie删掉,有些开发就可能根据cookie判断验证码是否获取过

案例4、特殊格式绕过

手机号码前后加空格,18888888888,086,0086,+86,0,00,/r,/n, 以及特殊符号等

修改cookie,变量,返回

138888888889 12位经过短信网关取前11位,导致短信轰炸

进行能解析的编码。

暴力破解(任意用户登录注册)

服务端未对验证时间、次数作出限制,存在爆破的可能性。简单的系统存在可以直接爆破的可能性,但做过一些防护的系统还得进行一些绕过才能进行爆破。

burpsuite对纯数字验证码爆破时间估计:
对于4位纯数字验证码:从0000~9999的10000种可能用多线程在5分钟内跑完并不是很难。
对于6位纯数字验证码:六位数的验证码1000000位,单从爆破时间上来看就比4位数的多100倍。

验证码回显

验证码在返回包,观察包即可

验证码绕过1

用户绑定了手机号,正常来说是获取绑定手机号的短信,通过burp修改成其他手机号

把这个手机号改成其他手机号的

然后点击提交,并抓包改成其他接收短信的手机号

验证码绕过2

修改手机号需要验证原密码,这里直接修改返回包进行绕过

{“error_msg”:”旧密码错误”,”error_code”:99999,”success”:false}改成{“success”: true,”error_code”: 1}

验证码转发

加个逗号后面接上需要转发的手机号,因为开发可能使用数组就导致同时把验证码发给两个手机号

IP绕过

XFF:127.0.0.1

换IP

其他逻辑漏洞

无限资源调用漏洞

一些收费的接口功能,可以无限进行调用

所有产品都能试用 随便点击一个-我使用人脸关键点

可以识别,利用burp跑一下看看有没有次数限制,并没有次数限制,所以不用注册和购买服务就能使用这些功能呢

实名修改漏洞

利用重放数据包,输入错误的身份信息导致实名认证驳回,可用于修改防沉迷或买卖账号的风险

免费Vip资源漏洞

一些vip的资源,比如视频、音乐、课程等需要付费的东西,观察返回的数据包,是否存在下载地址。