SQL 查询中的额外引号

问题描述

我正在研究 sql 注入,我在这个网站上得到了以下示例:
https://owasp.org/www-community/attacks/SQL_Injection
考虑到是专业网站,代码应该不会出错。

来自网络的文字
以下 C# 代码动态构造并执行一个 sql 查询,该查询搜索与指定名称匹配的项目。

string query = "SELECT * FROM items WHERE owner = "'"
                + userName + "' AND itemname = '"
                + ItemName.Text + "'";

查询是通过连接常量基本查询字符串和用户输入字符串动态构造的,只有当 itemName 不包含单引号字符时,查询才会正确运行...

但是,我无法理解代码,因为我注意到 =
后面有一个额外的“ 代码应该是:

string query = "SELECT * FROM items WHERE owner = '"
                + userName + "' AND itemname = '"
                + ItemName.Text + "'";

如果我错了,有人可以告诉我。谢谢。

解决方法

是的,你说得对,这个字符代表他们打错了;它甚至不会在 C# 中编译,也不应该存在:

string query = "SELECT * FROM items WHERE owner = "'"
                                                  ^

如果我们将 SQL 注入简化为一个变量,那么它可能会更容易理解:

var sql = "INSERT INTO users VALUES('" + username + "');"

usernameSys_Glitch 时,这工作正常,SQL 变为:

INSERT INTO users VALUES('Sys_Glitch');

当用户名是 Hah'); DROP TABLE Users;-- 时,这是一个问题:

INSERT INTO users VALUES('Hah'); DROP TABLE Users;--');

我们已经说服应用程序通过输入用户名构建有效的 SQL,然后添加更多字符来完成 SQL INSERT,然后运行另一个,删除用户表。我们以注释 -- 结束用户名以防止语法错误,但我们可以做其他事情,只要结果有效,例如 Sys_Glitch'); UPDATE Users SET Role='Admin' WHERE Name = 'Sys_Glitch,它不仅插入用户而且然后升级他们管理。

INSERT INTO users VALUES('Sys_Glitch'); UPDATE Users SET Role='Admin' WHERE Name = 'Sys_Glitch');
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          This part is from the text supplied by the user