我正在参加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' # ';
希望有人可以清除它,如果我理解正确,只是为了我解释或者我搞砸了什么。
谢谢你们:)
答案 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,它将注释掉密码检查,即使您没有正确的用户名和密码,它也会授予访问权限