偏移注入
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、对字段长度有要求。
评论