前言
事情是这样的,毕业季学弟学妹儿们都在递简历,积分不够用还得充值,正好碰见支付逻辑的漏洞,为什么不薅羊毛呢?这里只做技术交流,恶意利用该漏洞所造成的损害跟本人无关。
内容
只是给了一个目标名称,直接找官网就ok了,发现这个页面能注册,并且还是php开发的,那么直接注册搞一波
看到网站后台的功能虽然比较复杂,但是感觉可操作的地方太少了,能够测试的地方有三个
事实上,上传的位置有三个,但都是头像的位置,后端的代码都一致
经过walawa一波测试,发现并不可利用,心里一波mn
越权测试的话感觉没有shell的渗透是没有灵魂的,两个普通用户去测试越权真的没啥意思,,,,然后还是放弃了,但是发现了一点这个网站的用户身份认证比较有意思
用户的cookie认证有多个字段,但是某些字段的认证并没有什么用,,,这里为接下来的工作奠定了一小部分
心里开始嘀咕了,这渗透一个站连个shell都没,什么东西也没有,还要不要干渗透了,回去摆“小摊儿”撩学妹儿吧,,,,
看到功能模块儿了,不行,,,干他一票,搞不好来一波"意外收获"
上来就是干钱钱钱,,,开始支付,,,
主要字段就是这么些了,起码可以断定,支付的金额就是price字段,那么就操作这个数字能不能行?
不出意外的返回200了?这网站搞笑呢,此时我觉得开发小朋友是不是逗我?
确实在逗我,price字段竟然没有用,能够确定的是什么,可以确定这几个参数所指定的值的内容,首先第一个字段必定指定积分,第二个字段暂时看不懂含义,第三个字段就是付款金额,修改第三个字段并没有任何意义,此时联想到我们曾经遇到过的支付逻辑漏洞,上来一把梭,毕竟没有源码,成不成看运气。可以确定了修改首个字段没有用,那么第二个字段又是啥意思?修改一下
确实是少了,少了一毛钱,修改字段为22少了一毛,但是price字段的值也还是没有生效,那么猜测一下,自然就是因为在后台计算金额的时候,只是利用了
的结果作为金额值,那么这个值又代表什么含义,这次我直接修改为30,订单金额如下
同样返回信息没毛病,但是查看订单之后发现金额并未进行结算
那么猜测后端代码应该是这样的一个逻辑,在下订单的时候支付的逻辑就是不判定price的价格,事实上修改该位置的参数也是没有任何作用的上面已经做过尝试了,然后抓了一下九八折的包
这里发现字段integralid的值修改为了22,那么猜测就来了,逻辑应该是这样的
自然就直接测试九五折了,确定了猜想,直接修改参数id
发现成功测试,实现了在不满足条件的情况下的折扣打折,那么后端代码的逻辑也可以做一下猜测,在校验支付模块的时候,只是对字段integralid的值的合法性进行了校验,简单分为两种情况
1 price_int*intergraild(合法id,存在于数据库的id)
2 price_int*intergraild(不合法id)
漏洞自然出现在第一种情况,因为price_int的值未作校验,合法的逻辑应该是,对price_int的id进行校验
0<print_int<100 按照正常价格进行判断 ,不打折扣
100<print_int<500 条件下按照九九折
以此类推,但是我们想要充值最少的钱拿到最大的优惠应该怎么充值呢,所以这个时候最好的选择应该是这样的
这样的情况下得到的优惠应该是最大的,因为我想要最大的折扣还想得到最大的优惠,选择金额100000所能拿到的折扣也不过就是个九五折
对于这个漏洞的利用并且我们一次性能利用的支付逻辑得到的优惠是四块多,问题来了,想要薅羊毛怎么解决呢?这个思路的话其实原理也很简单,不做详细介绍,当然如何规避这个漏洞呢,只是需要在判断的时候增加一个对于print_int验证的过程,在提交订单的时候
伪代码:
<?php
function payment(print_int,intergraild){
if(print_int<100){
price=print_int*intergraild;//id=20
}elseif (100<print_int<500){
price=print_int*intergraild;//id=21
}
............
else(print_int>5000){
price=print_int*intergraild;//id=25
}
}
?>
在初次判断的时候对订单生成的时候调用了类似的代码,在提交订单的时候同样使用该部分代码,对订单内容的数据的合理性做校验那么就可规避这个漏洞了。
但是到这里对于该逻辑所产生的危害虽然还算可以,但是身为渗透本来来说对于现状还是不满足的,充值的目的是什么,充值的目的是为了获得积分,那么能不能直接获得积分而不用选择通过充值服务去实现呢?于是乎有了下面的内容
后面分析后台的时候有一个这样的功能,账户管理这个模块内有几个功能点,
这个数据迁移的功能成功引起了我的注意,那么此时尝试一波数据迁移
成功登录就完事儿了,尝试登录且抓包
登录了获得登录的积分,且我的之前的积分还都在,我们充值的目的就是兑换的积分,有了积分还能进行积分兑换,ahhhhha,那么思路get了,这个时候突然想到了条件竞争,,,,话不多说,直接开始构造数据包
我这边生成一个用户id的字典,我自己尽量保持上图两个位置的值一样,在重新和登录数据包,选择同样的username以及password字段,一边迁移一遍的登陆呢?
加载上我们的用户字典,开始爆破,可以发现
最开始的积分变为了
这里需要注意一点的是两个数据包的发送时间不能错,真是经过频繁的测试测试再测试,get到了,到现在才发现这网站有waf,太la了吧,起码至此,羊毛"薅"到了,起码撩到了小学妹儿不是么?发现问题分析问题尝试问题毕竟不是意见容易的事情,好了坦白了,剧本是编的的,东西是真的,ahhhh!!!
小结
理性学习,授权渗透,维护网络安全。