玄镜靶场:支付漏洞通关笔记
本文最后更新于9 天前,其中的信息可能已经过时,如有错误请发送评论

前言:

2月25日我写了一个总结的碎碎念,计划是三月份开始学习SRC漏洞报告和玩一玩玄镜靶场,因为10号开始我得外出一趟,所以将看SRC漏洞报告排在后面了(人在外面也能看),就先玩玩無名大佬的玄镜靶场,因为靶场处于内测时期,知道的人比较少,所以网上找不到任何相关的文章,那就只能自己摸索了

玄镜靶场官网(点击跳转)

现在网站激活采取的是手机号+激活码,并且是免费的,激活码需要加無名的QQ群才能获取,群号是:705462336,可自行添加

这一篇文章写的是支付场景,因为看了月神的盗版课,我觉得至少支付场景我能够懂一点点,所以就先从支付漏洞开始玩吧

废话:

这不是因为换了一个电脑桌吗,宽度够了,之前白天拍的那张效果不好,昨天晚上就又拍了一张晚上的,一起来欣赏欣赏吧(后续换个主机和显示器)

ok,正片开始,一文带你速通支付漏洞靶场(目前为止是7关),如果你还没有自己上手测试过,建议先自己上手试试,别上来就看答案,这样意义不大

支付漏洞-01:

这个靶场的介绍中已经明确表示修改支付参数等等来进行攻击,并且标注简单,那我第一时间就想到可能是直接修改金额,但是未免也太简单了吧,于是打开靶场,用burpsuite抓包看看

开启靶场后会自动跳转到对应的页面,这个靶场看着还是挺可以的,那就上手试试,直接点击立即购买,看看burpsuite抓到的数据

点击“立即购买”按钮后,burpsuite抓到了这个数据包,可以看到这个数据包中带了一个order_id(表id),skuid(款式id),price(价格),amount(数量),ctype(类型),stype(类型),data(类型)和sign(签名),这是一个标注了简单的靶场,上来就要绕签名验证的可能性不大,再加上介绍中的提示,或许真是直接修改金额(也就是price参数),为了验证猜想鼠标右键将数据包添加到Repeater模块,当然也可以直接改然后提交,但是如果不是那就需要重新抓包了

发送到Repeater模块后直接尝试修改金额看看

可以看到服务器直接返回了true,也就是购买成功,那么不出意外这个靶场就过了,也是挺简单的,返回抓到的数据包修改price(金额)为0直接发送,成功通关!

支付漏洞-02:

可以看到这个靶场的介绍,跟第一个差不多,只不过标识为中等,那就可能不是直接修改金额就能解决的了,开启靶场后抓包看看

可以看到直接修改金额为0或者其他并没有成功,服务器返回了false,应该是对金额做了校验,那就没有其他办法零元购了吗?返回靶场,可以看到有一个优惠卷的功能

现在我们有三张可用,那我们点击看一看

弹出了三张优惠卷,这里就选择第二张优惠卷测试了,选择好优惠卷后重新点击购买并且抓包

可以看到数据包中多出了一个coupon的参数,那么根据值不难猜出这个就是优惠卷金额的参数,那我们将数据包发送到Repeater模块试试直接修改优惠卷金额为商品金额能不能0元购

可以看到直接修改优惠卷的金额为8569并没有成功,那么还有什么其他办法呢?测试一下其他的参数看看,比如将数量修改,那我们可以怎么改呢?先去理解一下这个支付逻辑:

支付金额 = 商品金额 x 商品数量 – 优惠卷金额

由此,不难想到其他的方法,比如将商品数量和优惠卷都设置成负数呢?如果服务器没有对负数做校验是不是就能够零元购呢?毕竟实际情况下,只修改优惠卷的金额为负数反而会增加用户需要支付的金额,没有那个脑残会去这么做。而只修改数量为负数,那么负数的支付金额服务器肯定是会校验的,但是如果将两者都设置成负数呢?众所周知,负负得正,所以只要使商品数量和优惠卷金额都为负数即可实现零元购:

8569×1-2000=6569

8569 x -1 – (-8569) = -8569 + 8569 = 0

那么动手修改试试:

可以看到服务器返回了true,成功实现0元购!

支付漏洞-03:

可以看到这个介绍跟前两个没什么区别,不过评级是简单,那就直接打开靶场看看

还是一样的场景,没有什么大变化,那就直接选择一张优惠卷购买抓包看看

可以看到多了一个couponId的参数,也就是优惠卷id,我第一时间想到的是优惠卷叠加,结果返回false,于是尝试修改其他值,虽然靶场标识是简单,但是还是让我没想到,这关居然只是修改优惠卷金额就能够实现0元购,相比于上一个靶场,这个靶场为02我觉得还差不多

修改优惠卷金额为8569使支付金额为0,成功通关!

支付漏洞-04:

介绍一样,标识为中等,那就直接开靶场!

还是一样的场景,还是一样的数据包。当我看到这个优惠卷的id的时候我以为这一关是需要我遍历隐藏的优惠卷id,或者通过叠加优惠卷id实现零元购,叠加尝试无果后询问了一下作者是否是遍历优惠卷id,结果发现压根不是,这一关其实是需要遍历隐藏的商品id,虽然商品的id不同,但是指向的都是同一件商品,只不过是在测试时为了方便上架了这么一个商品没有下架而已

因为之前都是学习的理论知识,也就是逻辑漏洞,没有正真上手过爆破,所以花了一点时间学习了一下burpsuite自带的爆破

鼠标右键数据包将其发送到intruder模块,然后选择需要爆破的参数,在参数前后添加标识,然后切换到payloads模块

选择类型位numbers,然后设置from为0000,to为9999,step为1

点击start attack开始爆破

等待爆破出结果后,打开过滤器

输入false,勾选这三个选项,点击apply应用,就得到了这个商品id——1000,然后修改数据包发送请求,成功通关!(忘记截图了,后面又爆破了一次,不过将范围缩短了,所以是13)

支付漏洞-05:

这一关商品能同时用AB两种优惠券,但是由于业务的调整,下架了b,但是没有删除这个优惠券,只显示了a优惠券,而后端只检测了优惠券数组中,存不存在仅剩的这个优惠券金额,而没有对优惠券做绑定,并且优惠券的金额是可以被篡改的(作者群里提供的提示)

那么我们直接抓包添加一个优惠卷id和金额,这个数据包格式里面添加需要[],要不然格式不对的

可以看到,返回true了,但是有一点需要注意,添加的优惠卷金额需要是8569,而不是6569,我一开时没过关还以为思路不对,就测试别的了,但是想来想去还是没能过关,后来作者解释支付5的后端逻辑是这样的,值判断数组第一个元素是不是2000,而后端实际参与运算时用的却是数组的最后一个值,所以如果第二个值是6569就会失败,至于第二个优惠卷的id随便输入一个都行

支付漏洞-06:

还是一样,介绍没啥有用的信息,这关的思路主要是隐藏优惠卷,遍历出来就好了,直接上burpsuite爆破,具体教程看支付漏洞-04,将爆破参数设置为couponId,然后就能爆破出隐藏的优惠卷id,然后跟支付4一样用过滤器过滤一下就出来了

然后抓包修改数据包的优惠卷id为1105,发送数据包就可以看到通关提醒了

支付漏洞-07:

正常修改数据包优惠卷金额发送,可以看到这里返回签名的问题,那么这一关就没有什么大问题了,主要是添加了一个签名校验,只要绕过签名校验改优惠卷金额为8569即可成功通关

看到这个签名校验错误,我第一时间想到的是改返回值,不过很可惜的是这个靶场的优惠卷金额并不是后端传给前端的,我也跟作者据理力争了,作者并没有采纳我的建议

一开始还有一个群友跟我争,说这道题的解题思路是sign解密,后端传的只是优惠卷id给前端,我当时脑袋没转过来被绕进去了

结果写这篇文章的时候才反应过来,不对呀,你优惠卷金额后端是肯定要告诉前端的啊,不然用户怎么知道这个优惠卷有什么用,前端肯定要显示这张优惠卷的金额啊,而且这个靶场的最总目的是0元购(因为如果只是低价购买,可操作的点就比较多,所以靶场的设计是需要零元购才能通关),但是这一关校验了签名,那么不管是什么方式,只要能够绕过签名验证那就是解题思路,根本不存在跑题一说,不过后来作者也表达了,如果真要是后端传优惠卷金额给前端,那就需要额外再做一次绑定,不然就会有其他漏洞了(总结,麻烦了)

呐,没办法喽,咱们只能尝试js逆向和堆栈直接修改了,但是这并不代表思路就不对了,只是这个靶场不适用而已

js逆向:

这里搜索关键字sign可以看到这个js文件的这一部分就是生成逻辑,咱们仔细看一下:

mySign: function() {
                        var e = btoa(String(Date.now()) + "-" + String(this.basePrice) + "-" + String(this.amount) + "-" + String(this.selectedCoupon.value));
                        return e.replace(/=/g, "")
                    },

可以看到,这里是用bota进行编码,并且将=号替换成空,那么想要通关就很简单了,直接将这行编码的代码复制到控制台替换一下参数就好了:

btoa(String(Date.now()) + "-" + String(this.basePrice) + "-" + String(this.amount) + "-" + String(this.selectedCoupon.value))
btoa(String(Date.now()) + "-" + 8569 + "-" + 1 + "-" + 8569)

控制台也是输出了正确的签名,那么直接替换抓到的数据包里面的sign看看:

'MTc0MTAxNTQxODAzMC04NTY5LTEtODU2OQ=='
不过js代码将=替换成空了,所以实际是:
MTc0MTAxNTQxODAzMC04NTY5LTEtODU2OQ

直接修改影响签名的堆栈数据:

mySign: function() {
                        var e = btoa(String(Date.now()) + "-" + String(this.basePrice) + "-" + String(this.amount) + "-" + String(this.selectedCoupon.value));
                        return e.replace(/=/g, "")
                    },

可以看到这个函数是mySign,那么直接搜索这个函数名

记住这个文件名,到源代码中打开这个文件,然后在mySign这里打上断点

然后点击立即购买,会发现停在这里了

将鼠标放到这个优惠卷金额的这个上面

打开,可以看到这个value的值是2000

修改成8569然后继续允许即可,但是我这里不知道为什么,0元下单成功了,但是没有显示通关,所以还是建议大家将生成出来的签名复制然后到抓到的数据包里面替换

总结:

这个玄镜的靶场还是可以的,但是一点提示都没有,介绍说了跟没说一样,如果是没有头绪的小白,真的很让人一头雾水

最后,算上额外玩了一个登录认证缺陷漏洞-01,一共是得了75分,上了个排行榜,仅仅只是通关了支付漏洞就上排行榜了,可见目前来讲玩的人还是比较少的,也希望这个靶场越来越好

那么这篇文章就到这里了,如果有靶场相关的问题可以看前言加作者的qq群

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇