SQL注入各类型 讲解及利用 (二)

3. 常见网站架构

我们可以通过常见构架来判断数据库的类型

asp + access

asp + mssql

asp.net + mssql

php + mysql

Jsp + oracle

Jsp + mysql

具体得到采用什么模型,需要通过扫面工具,或得到的网站默认错误信息等获得.

4. 获取信息,提权

知道某个点存在注入以后,要获得数据库的内容,最直接的办法是使用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查询语句,查询语句的列数不同

猜你喜欢

转载自blog.csdn.net/lendq/article/details/80226616