# [FBCTF2019]Products-Manager

考点:

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

image-20241118203842900

给了源码,分析一下的话,footer.php 没有东西,index.php 也差不多

但是 db.php 里面的:

/*
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(....), ....);
*/

SQL 语言,有一些插入的数据,可以发现 flag 在 facebook 里面,那基本上就是用一些手段讲 facebook 的密码套出来,或是直接修改

知识点:

# 1. 数据库字符串比较

在数据库对字符串进行比较时,如果两个字符串的长度不一样,则会将较短的字符串末尾填充空格,使两个字符串的长度一致,比如,字符串 A:[String] 和字符串 B:[String2] 进行比较时,由于 String2 比 String 多了一个字符串,这时 MySQL 会将字符串 A 填充为 [String ],即在原来字符串后面加了一个空格,使两个字符串长度一致。

如下两条查询语句:

select * from users where username=‘Dumb’

select * from users where username='Dumb ’

它们的查询结果是一致的,即第二条查询语句中 Dumb 后面的空格并没有对查询有任何影响。因为在 MySQL 把查询语句里的 username 和数据库里的 username 值进行比较时,它们就是一个字符串的比较操作,符合上述特征。

# 2. INSERT 截断

这是数据库的另一个特性,当设计一个字段时,我们都必须对其设定一个最大长度,比如 CHAR (10),VARCHAR (20) 等等。但是当实际插入数据的长度超过限制时,数据库就会将其进行截断,只保留限定的长度。

这里已经知道了那个定义的长度 64,我可以用

facebook                                                                                                123     

注册一个,insert 会截断 64 位(空格也算)之后的字符,但是空格又会在比较时自动对齐,就不用理会

image-20241118204624151