作为计算机安全课程介绍的一部分,我们有一个关于SQL注入的简短单元.家庭作业(job)之一是一个基本的未经消毒的登录页面.预期的解决方案与classic ' or 1=1; --
类似,但我们始终欢迎学生寻找非常规的解决方案.
One such solution was presented to me recently: inputting '--'
for the password seems to perform a successful SQL injection. This would cause the query to be evaluated as something like:
SELECT * FROM users WHERE name='admin' AND password=''--'';
在这里,--'';
不会被解析为 comments ,因为MariaDB要求 comments 后面有空位.事实上,如果双破折号was被解析为注释,则此查询根本不会返回任何内容;同样,我们将有password=''
,假设密码非空,它的计算结果为假.
结尾处额外的一对引号似乎是必要的:将其保留为password=''--;
或在其后面插入其他数据(password=''--1;
)会导致条件被判断为假,正如预期的那样.
一些快速测试未能在其他数据库中重现这种行为--据我所知,这是MariaDB特定的行为.The documentation确认两个没有空位的破折号不会被解析为 comments ,但没有详细说明它们被解析为什么.EDIT:不知怎的,我设法错过了一个事实:这种情况也发生在SQL中.事实上,这种行为发生在任何SQL fork(不仅仅是MariaDB)中.
当--
后面没有空间时会做什么?为什么它会导致比较结果为真?
玩具示例:
CREATE TABLE users (
userid INTEGER PRIMARY KEY,
username TEXT NOT NULL,
password TEXT NOT NULL
);
INSERT INTO users VALUES (0001, 'admin', 'S3cur3P4ssw0rd!');
INSERT INTO users VALUES (0002, 'generic_user', 'Password');
SELECT * FROM users WHERE username='admin' AND password=''; -- empty password, query returns no users
SELECT * FROM users WHERE username='admin' AND password=''-- ''; -- parsed as comment, equivalent to above query, returns no users
SELECT * FROM users WHERE username='admin' AND password=''--''; -- query returns admin user
SELECT * FROM users WHERE username='admin' AND password=''--; -- query returns zero users
SELECT * FROM users WHERE username='admin' AND password=''--1; -- query returns zero users