ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BUUCTF [FBCTF2019] Products Manager

2021-01-08 23:57:58  阅读:329  来源: 互联网

标签:INSERT BUUCTF name .... Manager 添加 products statement FBCTF2019


BUUCTF [FBCTF2019] Products Manager

考点:

  1. 基于约束的SQL攻击
  2. 数据库字符串比较
  3. INSERT截断

启动环境:
在这里插入图片描述
产品管理,其中有三个功能:

  • 查看前5的产品
    在这里插入图片描述
  • 添加产品
    在这里插入图片描述
  • 查看产品细节
    在这里插入图片描述
    知道了大致功能,尝试正常的业务逻辑,首先添加产品,其Secret值需包含10位以上的大小写字母数字
    在这里插入图片描述
    添加成功,查询产品细节:
    在这里插入图片描述

分析题目给出的源码:
在这里插入图片描述
其中footer.php页面没用,header.php页面只是首页的三个跳转链接,index.php页面也没有可利用内容。
db.php页面中,查看到如下SQL语句:

CREATE TABLE products (
  name char(64),
  secret char(64),
  description varchar(250)
);

INSERT INTO products VALUES('facebook', sha256(....), 'FLAG_HERE');
INSERT INTO products VALUES('messenger', sha256(....), ....);
INSERT INTO products VALUES('instagram', sha256(....), ....);
INSERT INTO products VALUES('whatsapp', sha256(....), ....);
INSERT INTO products VALUES('oculus-rift', sha256(....), ....);

其中给出了提示,flag在facebook中,若想查询产品细节,需要产品的Secret值,一开始猜测本题是一道SQL注入题,但未找到可用的注入点,通过查阅大佬wp,得知是道基于约束的SQL攻击,参考资料:基于约束的SQL攻击

1. 数据库字符串比较
在数据库对字符串进行比较时,若两字符串长度不一样,则会在较短的字符串末尾填充空格,使两个字符串长度一致。
例:
str1str的比较,比较时会在str的后面添加一个空格以补足长度。

也就是说,对于查询语句:

select * from users where username='test'
select * from users where username='test '

查询结果是一致的。

2. INSERT截断
在数据插入时,若数据长度超过了预先设定的限制,例如:name char(64)时,数据库会对字符串进行截断,只保留限定的长度。

在本题db.php页面源码中,查看添加产品和查询产品详情函数:

// 添加产品
function insert_product($name, $secret, $description) {
  global $db;
  $statement = $db->prepare(
    "INSERT INTO products (name, secret, description) VALUES
      (?, ?, ?)"
  );
  check_errors($statement);
  $statement->bind_param("sss", $name, $secret, $description);
  check_errors($statement->execute());
  $statement->close();
}

插入语句中"INSERT INTO products (name, secret, description) VALUES ($name, $secret, $description)",并未做任何处理,直接插入数据库。

// 查询产品详情
function get_product($name) {
  global $db;
  $statement = $db->prepare(
    "SELECT name, description FROM products WHERE name = ?"
  );
  check_errors($statement);
  $statement->bind_param("s", $name);
  check_errors($statement->execute());
  $res = $statement->get_result();
  check_errors($res);
  $product = $res->fetch_assoc();
  $statement->close();
  return $product;
}

在查询语句中"SELECT name, description FROM products WHERE name = $name",只是对获取的$name变量进行了拼接,未进行任何处理。

结合两点,产生了本题的利用点:

  • 添加一个facebook用户,即在产品名后加大于长度限制的空格,空格后需再跟若干个字符,在添加数据时,使添加的产品名与目标一致。
  • 查询时,返回的用户名是目标信息,达到水平越权

构造添加的产品信息:

Name:facebook                                                            11
Secret:qweASDzxc123
Description:123

在这里插入图片描述
添加成功,此时再查询刚刚添加的产品详情:

Name:facebook
Secret:qweASDzxc123
// 因为在存入数据库时,添加的Name属性长度超过限制被截断

查询成功,得到flag:
在这里插入图片描述

标签:INSERT,BUUCTF,name,....,Manager,添加,products,statement,FBCTF2019
来源: https://blog.csdn.net/weixin_44037296/article/details/112385568

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有