SQL 查询中的额外引号

Extra Quotation Mark in SQL Query

我正在研究 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,然后 运行 另一个字符,删除用户 table。我们以注释 -- 结束用户名以防止语法错误,但我们可以做其他事情,只要结果有效,例如 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