62小时!解谜游戏“挑战一”被攻克,“挑战二”重磅来袭!
二重礼
Security Evolution:Phase Two
嗨不能停,挑战继续!
经过大佬们62小时783615次激情碰撞,DVP周年庆“二重礼”解谜游戏第一项挑战已被米斯特安全团队的大佬“SantanX”和“奶权”联手攻克,拿下5ETH的头奖,赢得开门红。
对大佬的敬意难以言表,不禁“想要SantanX带我飞,和奶权喝一杯,想去DVP的黑客松赢钱把妹追”。
咳咳,言归正传。本着学习交流的目的,我们将第一项挑战“Python Exchange”的解题思路予以公示。
第二项挑战“Deadend”将于7月21日正式发布。该挑战为智能合约相关,适合更多熟悉区块链的大佬,奖励也更加丰厚,为8ETH,欢迎大家参与挑战!
特别提示:
漏洞挖掘大赛的和谜题挑战成功者将在“三重礼”超级黑客松中获得额外优势,离百万大奖更近一步。
荣誉榜:挑战一
1. 挑战时间:
2019年7月17日-7月20日
2. 获奖者:
米斯特安全团队:SantanX,奶权
3. 解题思路:
以下由获奖者SantanX撰写
打开题目,随机帐号登录后,发现会提示没有权限
这里登录即注册,关注到remember_token和session
这道题的标题是python exchange,所以应该是用python写的,而这种一长串的session有点像flask,flask的session信息是存到客户端的cookie里的,不是存在服务端的,所以将这个session使用flask-unsign模块解一下试试。
发现其中有一个user_id,前面提示“权限不足”应该就是要我们使用有权限的账号登陆,所以接下来需要做的是伪造session。
flask中默认这两个的key是同一个的,remember_token用的是hmacsha512,随便登录后的会返回一个remember_token,一开始登录的是hackers这个帐号,密码自己设,返回的值是1118|一串加密后的字符,于是写脚本爆破key,一开始爆破8位全数字失败,然后5位全符号,也失败了,后来给出提示8位,前三位为DVP,最终爆破出key是dvpadmin,拿到key以后就可以伪造session了,既然是权限不足肯定是要高权限的账户,一般情况下高权限的账户的id都会比较靠前,所以伪造user_id=1,再用key加密回seesion
成功伪造了session后提示需要输入激活码
抓了返回包后看到返回包的set-cookie中的session,解密后发现激活码在里面
然后到了最后的充值界面,充值是一张二维码
扫描获得需要充值的地址,F12查看源码后发现了一个url
发现是一个测试网络的合约地址,于是就下载了插件metamask
下载完了这个插件后一顿研究,首先先获取了几个测试ETH,用来支付矿工费,经过测试发现进行dvp转账的时候即使余额为0依然会转账成功
这个转出的金额刚好为1024DVP,转到之前二维码的地址上,然后点“Write”发起交易
然后刷新余额
现在余额正好够了,直接点击购买flag,结束
后来经过了解到,这里没有余额发起转账交易后也能充值上是因为这个刷新余额接口存在“假充值”漏洞,只验证了交易是否执行完成,但没有验证链上的余额有没有真正的增加,这个验证逻辑肯定是存在问题的,不一定交易执行没有出错就一定收到币了,而给的测试地址的合约在转账的时候就算余额不够恰好不会抛出异常,只是会return一个false,但是整个交易还是成功完成的,所以交易的状态是true,所以才导致了这个问题。