我们可以通过常见构架来判断数据库
的类型
asp + access
asp + mssql
asp.net + mssql
php + mysql
Jsp + oracle
Jsp + mysql
知道某个点存在注入以后,要获得数据库的内容,最直接的办法是使用union
UNION
注入UNION
是数据库管理员经常使用且可以掌控的运算符之一
可以使用它连接两条或多条SELECT
语句的查询结果
其基本语法如下:
SELECT colum1,colum2,colum3,…,columN FROM table1
UNION
SELECT colum1,colum2,colum3,…,columN FROM table2
如果应用返回第一个(原始)查询得到的数据
那么通过在第一个查询后注入一个UNION
运算符,并添加另一个任意查询,便可读取到数据库用户有权限访问的任何一张表
当然这么好用的语句是有限制的
UNION
获取数据规则:
SELECT
语句返回的数据库对应的列必须类型相同或兼容
通常只有终止式注入时,可较快猜解并利用,否则要知道原始的SQL
语句才能比较方便的利用
UNION
语句的构建
0x01 确定列数量:
UNION SELECT null,null,null,…,null FROM dual
使用逐步增加null
数量,直到匹配原语句的列数量,成功匹配后返回正常页面
这是利用了两个查询返回的列数必须相同
这个原理
使用ORDER BY
确定原语句列数量, 可使用折半查找法提高猜测效率
0x02 确定列类型:
UNION SELECT 1,’2’,null,…,null FROM dual
我们这里先猜测第一列为数字,如果返回结果不正确,则判断为字符
如果还是不正确则保持null
不变(可能为二进制类型),之后依次完成部分或全部类型的判断
当然,每种方式都有不适用的情况
Union
不适用的地方
注入语句无法截断,且不清楚完整的SQL
查询语句 Web
页面中有两个SQL
查询语句,查询语句的列数不同