mysql - SQL 注入(inject) - Web for Pentester (Pentesterlab)

标签 mysql sql sql-injection

我正在参加 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/

相关文章:

sql - PostgreSQL:查找以最大订单销售的每种产品的总行总数?

sql - 如何指定不会被转换为 SQL 命令查询参数的常量值 NHibernate 标准

python - 检测源代码中的 SQL 注入(inject)

php - 如何在 Yii 框架中使用 mysql_escape_string()?

mysql - SQL 选择外键链接的其他表中的条目

java - 防止该语句被SQL注入(inject)

php - SQL查询消息投票

php - 将多个数组插入不同的行

php - 基于MySQL表的动态网格构建

mysql - 存储过程中的 MySQL 临时表与服务器的一次连接的最佳方法