codeblue2018 MortAl mage aGEnts题目分析

栏目: 数据库 · 发布时间: 6年前

内容简介:之前国外的一个水准比较高的比赛,当时没空做,有时间就来复现学习一波,题目提供了源码,也算是一个比较有趣的逻辑注入了。在泄露的数据库文件中,我们发现了有关flag1的sql语句:

codeblue2018 MortAl mage aGEnts题目分析

之前国外的一个水准比较高的比赛,当时没空做,有时间就来复现学习一波,题目提供了源码,也算是一个比较有趣的逻辑注入了。

题目背景

题目代码实现了一个简单的交易系统,每个用户在注册以后,就有 100000000MGC,用户之前可以互相交易。

codeblue2018 MortAl mage aGEnts题目分析

题目要求

在泄露的数据库文件中,我们发现了有关flag1的 sql 语句: codeblue2018 MortAl mage aGEnts题目分析 因此这个题目第一步就是要能够注入出flag。

代码架构分析

代码使用了编写路由来写逻辑的形式,很像是 python 开发中的flask框架,这种方式实现起来会比较清晰,对开发者的逻辑处理有比较好的帮助。

代码入口文件

整个代码的入口文件是初始化环境加上所有路由的前置路由实现:

codeblue2018 MortAl mage aGEnts题目分析

可以看到,默认全局是使用了google的图片验证码,由于是在国内调试,所以我们注释了这部分。

codeblue2018 MortAl mage aGEnts题目分析

然后我们看一下基本的逻辑:

codeblue2018 MortAl mage aGEnts题目分析

基本的登陆注册逻辑

这里我们可以只看post的部分,因为get的部分都是渲染前端模板的,post的部分是代码具体逻辑实现:

codeblue2018 MortAl mage aGEnts题目分析 codeblue2018 MortAl mage aGEnts题目分析

可以看到注册和登陆逻辑没有什么问题,都实现的比较严谨,如果底层没有出现问题,是可以保证稳定运行的。因为是sql注入,所以我们要尤其关注sql的部分,下面我们跟进底层去看下。

交易的逻辑实现

经过对代码的理解,这个系统其实是做了一个类似于当前流行的区块链的钱包,每个用户在第一次使用的时候,是可以生产一个唯一的钱包地址,如果别人要跟你进行交易,就需要知道你的钱包地址,否则是不能实现的,可以通过下面的图片来理解:

codeblue2018 MortAl mage aGEnts题目分析

底层分析—发现漏洞

可以看到具体的数据库操作都封装到了 $app->db 中,并且使用了绑定变量的预处理方法执行sql语句,那我们就具体去看一下具体的实现:

codeblue2018 MortAl mage aGEnts题目分析

可以发现刚开始的几个函数是没有问题的,都是直接把预处理给了数据库来执行,但是下面却有一个很特殊的函数:

codeblue2018 MortAl mage aGEnts题目分析

可以看到这里并没有直接把预处理交给数据库,而是自己实现了,根据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测试一下:

codeblue2018 MortAl mage aGEnts题目分析

可以看到如果是正常的绑定变量,确实可以完成功能。

但是如果是这样呢?

codeblue2018 MortAl mage aGEnts题目分析

可以很明显的看到,这里是可以造成二次绑定变量的,所以按理来说,是可以造成注入的,构造如下:

codeblue2018 MortAl mage aGEnts题目分析

找到利用点

既然我们知道了这个函数是可以造成注入的,那我们就要梳理一下这个漏洞的利用需要什么?

  1. 我们需要一个绑定两个参数的sql语句
  2. 我们需要两个参数都可控

经过简单的浏览,我们发现了可以利用的位置:

codeblue2018 MortAl mage aGEnts题目分析

这个位置是在插入交易信息的位置,就是说我们只要能注册两个恶意用户名的用户,互相交易,就可以注入出flag。

我们继续将代码抽象出来单独构造:

codeblue2018 MortAl mage aGEnts题目分析

经过一段时间的测试,发现可以构造如下:

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

先分别注册用户:

codeblue2018 MortAl mage aGEnts题目分析 codeblue2018 MortAl mage aGEnts题目分析

然后使用第一个账号,生成交易token,然后第二个账号验证token,

codeblue2018 MortAl mage aGEnts题目分析

然后第二个账号向第一个账号发起转账:

codeblue2018 MortAl mage aGEnts题目分析

然后我们就可以在交易记录中发现flag:

codeblue2018 MortAl mage aGEnts题目分析

后记

整个流程略显复杂,设计到交易代码的具体实现,可能刚开始看会觉得很乱,但是自己梳理,流程还是非常清晰的。这题主要考了快速发现代码异常,以及构造poc,以及找到合适的利用点几个方面的能力,还是很有意思的,和大家分享一下。


以上所述就是小编给大家介绍的《codeblue2018 MortAl mage aGEnts题目分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

MySQL权威指南

MySQL权威指南

Randy Jay Yarger / 林琪、朱涛江 / 中国电力出版社 / 2003-11-1 / 49.00元

为一种开源数据库,MySQL已经成为最流行的服务器软件包之一。开发人员在其数据库引擎中提供了丰富的特性(只需很少的内存和CPU支持)。 因此,众多Linux和Unix服务器(以及一些Windows服务器)都采用MySQL作为其数据库引擎。由于MySQL作为Web站点后端时速度特别快而且相当方便,所有在目前流行的一个词LAMP(表示Linux、Apache、MySQL和Perl、Python或......一起来看看 《MySQL权威指南》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器