基于报错信息判断

如果注入点对报错信息直接进行返回的话,我们可以通过他返回的报错信息判断得到数据库的类型,以下为不完全列举,具体可以直接把报错语句丢到搜索引擎或AI查询

MySQL错误信息

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near...

SQL Server错误信息

1
2
3
Incorrect syntax near...

Unclosed quotation mark after the character string...

还会出现类似于

1
错误[42000]:在应使用条件的上下文(在'iamasb'附近)中指定了非布尔类型的表达式

Oracle错误信息

1
ORA-00933: SQL command not properly ended

PostgreSQL错误信息

1
ERROR: syntax error at or near...

基于默认端口判断

这个一般不太实用,数据库一般不会开放端口给外网。

  • MySQL:3306
  • SQL Server:1443
  • Oracle:1251
  • PostgreSQL:5432、5433

基于特定函数判断

len() / length()

  • len():SQL Server、MySQL、DB2采用该函数返回长度值
  • length():oracle、INFORMIX采用该函数返回长度值

@@version / version()

MySQL两种都可以返回当前版本信息。SQL Server则仅能通过@@version返回版本信息,使用version()时会出现报错。

xor逻辑运算符

xor 是一个逻辑运算符,用于返回两个布尔表达式的异或结果。

SQL Server没有直接的xor运算符。

IF函数

SQL Server仅有IIF函数(IIF(condition, value_if_true, value_if_false))和CASE WHEN表达式(CASE WHEN condition THEN value1 ELSE value2 END),并无IF函数。

MySQl有IF函数(IF(condition, value_if_true, value_if_false))。

substring / substr

MySQL和SQL Server两个函数都可以调用。

Oracle仅可以使用substr

基于注释符号判断

首先是不同数据库的注释符号不同:

  • MySQL:--#/* */
  • SQL Server:--/* */
  • Oracle:--/* */
  • PostgreSQL:--/* */

因此通过是否使用#作为注释,可以排查出是否为MySQL数据库。

基于字符串连接符判断

  • Oracle/PostgreSQL:||

    1
    ?id=1' || '1'='1'--  -- 若返回正常,可能是Oracle/PG
  • SQL Server:+

    1
    ?id='a'+'b'--       -- 若返回'ab',则是SQL Server
  • MySQL: (空格)或 CONCAT()

    1
    ?id='a' 'b'         -- 返回'ab'则可能是MySQL

基于时间延迟函数判断

  • MySQL:SLEEP(5)
  • PostgreSQL:PG_SLEEP(5)
  • SQL Server:WAITFOR DELAY '0:0:5'
  • Oracle:DBMS_LOCK.SLEEP(5)