[FBCTF2019]Products-Manager

考点:

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

image-20241118203842900

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

但是db.php里面的:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
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,我可以用

1
facebook                                                                                                123     

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

image-20241118204624151