SQL注入 - Pentester的Web(Pentesterlab)

时间:2016-09-09 00:27:03

标签: mysql sql sql-injection

我正在参加Pentesterlab的免费在线课程,今天我对SQL注射很满意。 但是我没有得到说明,因为它可能是一个巨大的(技术)差异,我想知道它是如何工作的。

我在谈论的东西: https://www.pentesterlab.com/exercises/web_for_pentester/course 请向下滚动超过一半到#34; SQL Injections" - > "示例1"。

在我们发现的示例中,(My)SQL-Table应该像这种模式一样工作:

SELECT * FROM users WHERE name='[INPUT]';

据我所知,我通过URL提供的只是" INPUT",输入前后的引号('),以及SQL添加的分号(;)自动。

然而,指示说:

  ?

名=根'和' 1' =' 1:初始查询中的引用将关闭   我们注射结束时的一个。

我不明白。我认为在根结束第一部分之后的引用('),但仍然是另一部分' 1' =' 1,不是吗? 也许这是对语言的误解,但我不确定我是否理解它。

Imo SQL应该是这样的(例如1,第一个"代码"):

SELECT * FROM users WHERE name=' root' and '1'='1 ';

在示例1的第二次尝试中,它变得更加陌生:

  ?

名=根'和' 1' =' 1' #(不要忘记编码#):初始查询中的引用将被注释掉。

等什么?我认为SQL提供的引用会自动被注释掉。

Imo SQL应该是这样的(例如1,第二个"代码"):

SELECT * FROM users WHERE name=' root' and '1'='1' # ';

希望有人可以清除它,如果我理解正确,只是为了我解释或者我搞砸了什么。

谢谢你们:)

2 个答案:

答案 0 :(得分:1)

Mysql不会自动向您的查询添加任何内容。如果您没有提供单一报价,那么它就不会出现。周期。

SELECT * FROM users WHERE name='[INPUT]';

应用程序将在其自己的代码中包含上述sql语句模板,并将替换从用户接收的参数来代替[INPUT]占位符。

如果您按照预期提供单个名称,则执行的查询将为:

SELECT * FROM users WHERE name='root';

但是,如果你提供root' and '1'='1作为输入,那么正在执行的sql代码将是

SELECT * FROM users WHERE name='root' and '1'='1';

root之前和第二1之后的单引号是应用程序中sql语句模板的一部分。

答案 1 :(得分:1)

我还没有读过课程,所以我们假设逻辑会检查用户是否仅存在于数据库中。

原始SQL

SELECT * FROM users WHERE name = 'admin'
(1 row affected)

通过SQL注入,您可以在此之后输入内容以使此SQL始终返回记录

  

输入用户名为[root'和'1'='1]

SELECT * FROM users WHERE name = 'root' and '1' = '1'
(20 rows affected)

但是,我们假设这个SQL也会检查密码

SELECT * FROM users WHERE name = 'admin' and pwd = 'abc'
(1 row affected)
  

输入用户名为[root'和'1'='1]

SELECT * FROM users WHERE name = 'root' and '1' = '1' and pwd = 'invalid'
(0 row affected)

我们需要绕过密码,需要做的是注释掉SQL的其余部分

  

输入用户名为[root'和'1'='1'#]

SELECT * FROM users WHERE name = 'root' and '1' = '1'#' and pwd = 'abc'
(20 rows affected)

使用此SQL,它将注释掉密码检查,即使您没有正确的用户名和密码,它也会授予访问权限