我正在参加 Pentesterlab 的免费在线类(class),今天我已经熟悉了 SQL 注入(inject)。 但是我没有得到说明,因为这可能是一个巨大的(技术)差异,我想知道它是如何工作的。
我正在谈论的内容: https://www.pentesterlab.com/exercises/web_for_pentester/course 请向下滚动一半以上到“SQL 注入(inject)”-->“示例 1”。
在示例中我们发现,(我的)SQL 表应该像这样的模式工作:
SELECT * FROM users WHERE name='[INPUT]';
据我了解,我通过 URL 提供的只是“INPUT”、输入前后的引号 (') 以及 SQL 自动添加的分号 (;)。
但是,指令说:
?name=root' and '1'='1: the quote in the initial query will close the one at the end of our injection.
我不明白。我以为 root 后面的引号 (') 结束了第一部分,但仍然有另一部分 '1'='1 ,不是吗? 也许这是对语言的误解,但我不确定我是否理解它。
我认为 SQL 应该如下所示(例如 1,第一个“代码”):
SELECT * FROM users WHERE name=' root' and '1'='1 ';
第二次尝试示例 1 时,情况变得越来越奇怪:
?name=root' and '1'='1' # (don't forget to encode #): the quote in the initial query will be commented out.
等等什么?我以为 SQL 提供的引用会自动被注释掉。
我认为 SQL 应该如下所示(例如 1,第二个“代码”):
SELECT * FROM users WHERE name=' root' and '1'='1' # ';
希望有人能澄清它,如果我理解正确,但对我来说很难解释,或者如果我搞砸了一些东西。
谢谢大家:)
最佳答案
Mysql 不会自动向您的查询添加任何内容。如果您不提供单引号,那么它就不会出现。期间。
SELECT * FROM users WHERE name='[INPUT]';
应用程序将在其自己的代码中包含上述 sql 语句模板,并将替换从用户接收的参数来代替 [INPUT]
占位符。
如果您按照预期提供单个名称,则执行的查询将是:
SELECT * FROM users WHERE name='root';
但是,如果您提供root'和'1'='1
作为输入,那么正在执行的sql代码将是
SELECT * FROM users WHERE name='root' and '1'='1';
root
之前和第二个 1
之后的单引号是应用程序中 sql 语句模板的一部分。
关于mysql - SQL 注入(inject) - Web for Pentester (Pentesterlab),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39402039/