SQL注入学习笔记
一、SQL注入分类
- 联合查询型
- 报错型
- 盲注型
- 布尔型盲注
- 延时型盲注
- 多语句查询型
二、名词解释:
- 1.联合查询型
即通过将payload嵌入到正常的SQL语句内,在不破坏业务逻辑的情况下,通过SQL语句查询出数据库内容。 - 2.报错型
即通过强制数据库报错来提取数据库内容,适用于会抛出SQL错误到页面显示的web应用。 - 3.盲注型
即注入点即不输出查询到的数据到页面显示,也没有将SQL的错误信息输出到页面。此时可以使用如下两种类型的注入:- 1.布尔型注入
即通过判断页面的返回状态来断定此次SQL语句的执行情况,通过构造出判断语句来使数据库返回对或错,或者可以说返回真或假,虽然不能直接返回数据,但提供了猜测数据的可能性。常用的SQL函数是if函数。 - 2.时间延迟型
原理同布尔型注入类似,但在某些情况下页面既不返回查询的数据和错误信息、也不返回查询的状态,这时通过页面是无法判断SQL语句的执行情况的,通过使用时间延迟可成为另一种判断SQL语句执行情况的途径。
- 1.布尔型注入
- 4.多语句查询
即可以在原SQL语句后再跟一条独立的SQL语句,操作空间更大、更方便,但只适用于某些数据库、或在支持某些数据库驱动的情况才能使用。
三、条件要求
- 1.联合查询型,要求页面返回查询到的数据库内容。
- 2.报错型,要求页面需返回数据库的错误信息。
- 3.布尔型盲注,要求页面返回数据库查询状态。
- 4.时间延迟型,只要能执行时间函数即可。
- 5.多语句查询,需要数据库支持或驱动支持。
四、注入流程
识别数据库类型–(获取版本)–获取数据库名–获取表名–获取表结构(字段及类型)–提取数据
五、实例
1.基本流程:
获取数据库:
获取表:
获取字段:
提取数据:
2.基于报错的注入:
报错注入:
3.盲注:
outfile:
|
|
|
|
布尔盲注:
猜测表名或字段的长度:
猜测表名或字段名的内容:
其它:使用count函数可以统计表的数量或字段的数量
时间盲注:
4.Order By后注入
基于报错:
六、总结
以上的几种方法提供了完成注入的基本框架,我们需要学习的是它的原理和流程,而实际的Payload则需要结合当时情况,并不局限于书本上的知识。
举个列子,比如有一个注入点,无论sql语句是否执行完成都返回同一个页面,即页面在正常情况下是无状态的,所以基于联合查询的注入方法和基于布尔注入的方法都不可行。而同时如果sql语句执行出错则返回一个错误页面(并没有具体的错误信息),看起来也不满足报错注入的要求,但只要将它们一结合,实际上仍然可以进行布尔盲注。我们可以构造一条sql语句,如果查询成功则返回正常数据,如果查询失败则强制报错,那么我们就得到了一个判断sql执行状态的机制: 如果返回正常页面,则数据库查询成果,如果返回错误页面,则数据库查询失败。从而我们可以以此完成一次布尔盲注。