从数据库说偏移注入原理
场景
在常见的SQL注入当中,一般是将数据库中的表名、列名猜解出来之后,然后通过查询的方式获取具体的数据值。如SqlMap就是采用这样的注入流程进行数据获取的。但是这样的方式存在一个问题就是当知道数据表的名字,但是列名很长,或者数据库系统比较简单,不能通过查询系统数据库中的信息获取到用户表中的表名时就很难获取到想要的数据信息,如access数据库。(比如其中SQL Server 和MySQL都可以通过查询系统数据库获取到具体的列名)
原理
简单来说偏移注入的原理就是通过连接查询方式将想要获取到的数据携带出来。其中SQL中的连接查询包含一下几种方式:
- INNER JOIN: 如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
几种连接查询方式详细使用说明
原理详情
在注入中其实是在一个表中查询数据,所以以上几种查询方式在注入中查询到的结果都是一样的,所以在这里选择INNER JOIN(和JOIN一样)作为样例。其中用到的数据库表users如下:
用到的userinfo表如下:
首先在数据表userinfo中做一个简单的查询如下: