0x00 前言

偏移注入主要用于Access数据库,但不仅限于Access。由于Access数据库不存在information_schema等自带表,所以表名只能猜解,而有的时候猜测出表名,但是不能猜测出字段名、或者权限不够时,可以使用偏移注入进一步获取信息。

0x01 偏移注入

偏移注入具体是指通过当前所用的表,去获取另一张表里的字段名。

如存在两张表:

admin(id,user,passwd)

news(id,title,content,author,date)

admin表有三个字段,news表有五个字段,因此我们可以通过news表去获取admin表的字段信息:

当我们在浏览一篇新闻时,在数据库中使用的是news表,假设选取新闻的SQL语句是:

1
$sql = "select * from news where id = '$id'"

如果这里存在注入,我们构造

1
id=-1' union select 1,2,3,4,5 from admin#

如果有回显点时,接下来就可以通过回显点获取到admin表中的字段名。

已经知道admin的字段数是3,因此可以用 admin.* 去代替联合查询中的字段。(如果不知道字段数,可以依次尝试,直到页面返回正常)

admin.* 代表了admin表中的所有字段

1
id=-1' union select 1,2,admin.* from admin#

用admin.*代替了联合查询中的3,4,5后,页面返回依然正常,验证了admin的字段数为3

接下来可以通过回显点去获取admin表中的字段名了,假设回显点在2

1
id=-1' union select 1,admin.*,3 from admin#

此时就可以回显出admin表的第一个字段名:id

1
id=-1' union select admin.*,2,3 from admin#

此时就可以回显出admin表的第二个字段名:user

0x02 使用条件

1、至少需要两张表,并且当前表的字段数要大于想获取信息的那张表的字段数。

2、存在回显点

3、已知表名

0x03 局限性

1、获取到的回显信息有限,有时候并不能直接获取所有字段名。

2、对字段长度有要求。2、对字段长度有要求。