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题目分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Web Caching

Web Caching

Duane Wessels / O'Reilly Media, Inc. / 2001-6 / 39.95美元

On the World Wide Web, speed and efficiency are vital. Users have little patience for slow web pages, while network administrators want to make the most of their available bandwidth. A properly design......一起来看看 《Web Caching》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具