SQL注入判断数据库类型
基于报错信息判断
如果注入点对报错信息直接进行返回的话,我们可以通过他返回的报错信息判断得到数据库的类型,以下为不完全列举,具体可以直接把报错语句丢到搜索引擎或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 | Incorrect syntax near... |
还会出现类似于
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)