内容简介:之前国外的一个水准比较高的比赛,当时没空做,有时间就来复现学习一波,题目提供了源码,也算是一个比较有趣的逻辑注入了。在泄露的数据库文件中,我们发现了有关flag1的sql语句:
之前国外的一个水准比较高的比赛,当时没空做,有时间就来复现学习一波,题目提供了源码,也算是一个比较有趣的逻辑注入了。
题目背景
题目代码实现了一个简单的交易系统,每个用户在注册以后,就有 100000000MGC,用户之前可以互相交易。
题目要求
在泄露的数据库文件中,我们发现了有关flag1的 sql 语句: 因此这个题目第一步就是要能够注入出flag。
代码架构分析
代码使用了编写路由来写逻辑的形式,很像是 python 开发中的flask框架,这种方式实现起来会比较清晰,对开发者的逻辑处理有比较好的帮助。
代码入口文件
整个代码的入口文件是初始化环境加上所有路由的前置路由实现:
可以看到,默认全局是使用了google的图片验证码,由于是在国内调试,所以我们注释了这部分。
然后我们看一下基本的逻辑:
基本的登陆注册逻辑
这里我们可以只看post的部分,因为get的部分都是渲染前端模板的,post的部分是代码具体逻辑实现:
可以看到注册和登陆逻辑没有什么问题,都实现的比较严谨,如果底层没有出现问题,是可以保证稳定运行的。因为是sql注入,所以我们要尤其关注sql的部分,下面我们跟进底层去看下。
交易的逻辑实现
经过对代码的理解,这个系统其实是做了一个类似于当前流行的区块链的钱包,每个用户在第一次使用的时候,是可以生产一个唯一的钱包地址,如果别人要跟你进行交易,就需要知道你的钱包地址,否则是不能实现的,可以通过下面的图片来理解:
底层分析—发现漏洞
可以看到具体的数据库操作都封装到了 $app->db
中,并且使用了绑定变量的预处理方法执行sql语句,那我们就具体去看一下具体的实现:
可以发现刚开始的几个函数是没有问题的,都是直接把预处理给了数据库来执行,但是下面却有一个很特殊的函数:
可以看到这里并没有直接把预处理交给数据库,而是自己实现了,根据ctf中的经验,这里一定有问题:
foreach ($param as $key => $value) { $search[] = $key; $replace[] = sprintf("'%s'", mysqli_real_escape_string($this->link, $value)); } $sql = str_replace($search, $replace, $sql);
乍一看,貌似没有什么问题,但是自己想一下,这里确实是存在问题的:我们来写个demo测试一下:
可以看到如果是正常的绑定变量,确实可以完成功能。
但是如果是这样呢?
可以很明显的看到,这里是可以造成二次绑定变量的,所以按理来说,是可以造成注入的,构造如下:
找到利用点
既然我们知道了这个函数是可以造成注入的,那我们就要梳理一下这个漏洞的利用需要什么?
- 我们需要一个绑定两个参数的sql语句
- 我们需要两个参数都可控
经过简单的浏览,我们发现了可以利用的位置:
这个位置是在插入交易信息的位置,就是说我们只要能注册两个恶意用户名的用户,互相交易,就可以注入出flag。
我们继续将代码抽象出来单独构造:
经过一段时间的测试,发现可以构造如下:
first: ,1000000,100000000,(select(flag1)from(flag1)));#:notes second: ,1000000,100000000,(select(flag1)from(flag1)));#
这样经过处理我们的sql语句就变成了:
INSERT INTO account (user_id, debit, credit, notes) VALUES (',1000000,100000000,(select(flag1)from(flag1)));#',1000000,100000000,(select(flag1)from(flag1)));#
获取flag
先分别注册用户:
然后使用第一个账号,生成交易token,然后第二个账号验证token,
然后第二个账号向第一个账号发起转账:
然后我们就可以在交易记录中发现flag:
后记
整个流程略显复杂,设计到交易代码的具体实现,可能刚开始看会觉得很乱,但是自己梳理,流程还是非常清晰的。这题主要考了快速发现代码异常,以及构造poc,以及找到合适的利用点几个方面的能力,还是很有意思的,和大家分享一下。
以上所述就是小编给大家介绍的《codeblue2018 MortAl mage aGEnts题目分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Hitcon2018 BabyCake题目分析
- 从一道线下赛题目看VM类Pwn题目-debugvm
- Leetcode 题目:括号匹配
- HCTF逆向题目详析
- 一道无线流量题目引发的思考
- 小李飞刀:SQL题目刷起来!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MySQL权威指南
Randy Jay Yarger / 林琪、朱涛江 / 中国电力出版社 / 2003-11-1 / 49.00元
为一种开源数据库,MySQL已经成为最流行的服务器软件包之一。开发人员在其数据库引擎中提供了丰富的特性(只需很少的内存和CPU支持)。 因此,众多Linux和Unix服务器(以及一些Windows服务器)都采用MySQL作为其数据库引擎。由于MySQL作为Web站点后端时速度特别快而且相当方便,所有在目前流行的一个词LAMP(表示Linux、Apache、MySQL和Perl、Python或......一起来看看 《MySQL权威指南》 这本书的介绍吧!