# [FBCTF2019]Products-Manager
考点:
- 基于约束的 SQL 攻击
- 数据库字符串比较
- INSERT 截断
给了源码,分析一下的话,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 位(空格也算)之后的字符,但是空格又会在比较时自动对齐,就不用理会