菜鸟科技网

如何快速识别网站数据库类型?

在网络安全测试、渗透测试或网站信息收集中,识别目标网站所使用的数据库类型是一项基础且重要的工作,不同的数据库(如MySQL、Oracle、SQL Server、PostgreSQL、MongoDB等)具有不同的特性、语法和攻击方式,准确判断数据库类型有助于后续的针对性攻击或安全加固,以下是几种常用的判断网站数据库类型的方法,涵盖了从技术细节到工具辅助的多个维度。

如何快速识别网站数据库类型?-图1
(图片来源网络,侵删)

通过错误信息判断

当网站存在SQL注入漏洞或某些参数处理不当时,可能会暴露数据库的错误信息,这些信息中通常包含明确的数据库类型标识,这是最直接的方法,但前提是网站开启了详细的错误提示,且未对错误信息进行过滤。

  1. MySQL:MySQL的错误信息中常见“MySQL”、“You have an error in your SQL syntax”等关键词。

    Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in ... on line XX

    或者在SQL注入时直接返回:

    Error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id=1'' at line 1
  2. SQL Server:SQL Server的错误信息通常包含“Microsoft OLE DB Provider for ODBC Drivers”、“SQL Server”或“Unclosed quotation mark before the character string”等。

    如何快速识别网站数据库类型?-图2
    (图片来源网络,侵删)
    Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
    [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'WHERE'.
  3. Oracle:Oracle的错误信息中会出现“Oracle”、“ORA-”等标识。

    ORA-00933: SQL command not properly ended

    或者在JSP环境中可能显示:

    java.sql.SQLException: ORA-00933: SQL command not properly ended
  4. PostgreSQL:PostgreSQL的错误信息包含“PostgreSQL”、“pg_query()”等。

    Warning: pg_query() [function.pg-query]: Query failed: ERROR: syntax error at or near "WHERE" in ... on line XX

需要注意的是,许多生产环境会关闭错误显示(如PHP中设置display_errors=Off),此时此方法可能失效。

如何快速识别网站数据库类型?-图3
(图片来源网络,侵删)

通过SQL注入语句判断

通过构造特定的SQL注入payload,根据数据库的响应特性或返回结果判断类型,这是更主动且可靠的方法,通常需要结合手工测试或工具。

  1. 基于函数的差异

    • MySQL:使用concat()函数连接字符串,如' AND 1=concat(1,2,3)-- -,若返回123则可能是MySQL。
    • SQL Server:使用连接字符串,如' AND 1=1+2-- -,若返回3则可能是SQL Server。
    • Oracle:使用连接字符串,如' AND 1=1||2-- -,若返回3则可能是Oracle。
    • PostgreSQL:同样支持,但部分版本可能对函数支持不同。
  2. 基于注释符的差异

    • MySQL支持和作为注释符。
    • SQL Server支持和。
    • Oracle和PostgreSQL主要支持。 输入' AND 1=1/*,若错误消失且正常返回,可能是支持的数据库。
  3. 基于版本查询的差异: 不同数据库的版本查询语法不同:

    • MySQL:SELECT VERSION()@@version
    • SQL Server:SELECT @@VERSION
    • Oracle:SELECT * FROM v$version
    • PostgreSQL:SELECT version() 在注入点尝试这些语句,根据返回结果直接判断。

通过HTTP响应特征判断

数据库类型有时会通过HTTP响应的头部或内容特征间接暴露。

  1. Session标识

    • MySQL的默认session名称可能包含mysqlPHPSESSID(结合PHP环境)。
    • SQL Server的ASP.NET会话可能包含ASPSESSIONID
  2. 默认页面或脚本

    某些数据库管理工具(如phpMyAdmin for MySQL、SQL Server Management Studio for SQL Server)的默认页面路径或标题可能包含数据库类型关键词。

  3. 第三方组件信息: 网站可能使用了特定数据库的连接组件,

    • ASP环境中的Provider=SQLOLEDB(SQL Server)或Provider=MSDAORA(Oracle)。
    • Java环境中的jdbc:mysql://jdbc:oracle:thin://等。

通过工具辅助判断

自动化工具可以快速高效地识别数据库类型,常用的工具包括SQLMap、Nmap、Burp Suite等。

  1. SQLMap: SQLMap是专门用于SQL注入测试的工具,通过--dbs--current-db等参数可以直接获取数据库名称和类型。

    sqlmap -u "http://example.com/page.php?id=1" --dbs

    SQLMap会根据响应自动判断数据库类型,并显示在结果中。

  2. Nmap脚本: Nmap的http-sql-injection脚本可以扫描网站的SQL注入漏洞,并在过程中识别数据库类型。

    nmap -p 80 --script http-sql-injection example.com
  3. Burp Suite: 通过Burp Suite的Intruder或Repeater模块,手动注入不同的payload,观察响应差异,结合上述方法判断数据库类型。

通过网站技术栈推断

网站的编程语言和框架可能暗示其使用的数据库类型。

  • PHP环境常搭配MySQL或MariaDB。
  • Java(Spring Boot、Hibernate)常使用MySQL、PostgreSQL或Oracle。
  • .NET环境常使用SQL Server或SQLite。
  • Python(Django、Flask)可能使用MySQL、PostgreSQL或SQLite。 通过分析网站源码、HTTP头部(如X-Powered-By)或框架特征文件,可以间接推断数据库类型。

不同数据库类型判断特征对比表

数据库类型 错误信息关键词 注释符 字符连接函数 版本查询语法 常见技术栈搭配
MySQL/MariaDB MySQL、mysql_fetch_assoc concat() SELECT VERSION() PHP、LAMP/LEMP
SQL Server OLE DB、SQL Server --、// SELECT @@VERSION .NET、ASP
Oracle ORA-、v$version // SELECT * FROM v$version
PostgreSQL PostgreSQL、pg_query // SELECT version()
SQLite SQLite、sqlite3 --、// SELECT sqlite_version()

相关问答FAQs

问题1:如果网站关闭了错误显示,如何判断数据库类型?
解答:当网站关闭错误显示时,可以通过以下方法判断:

  1. SQL注入测试:构造特定的payload(如基于函数、注释符或版本查询的语句),观察响应是否正常或返回特定结果,使用concat()函数测试MySQL,若返回异常则可能是其他数据库。
  2. 工具扫描:使用SQLMap等自动化工具,工具通过分析HTTP响应的特征(如响应时间、内容差异)来判断数据库类型,无需依赖错误信息。
  3. 技术栈分析:通过查看网站源码、HTTP头部(如Server、X-Powered-By)或使用的框架,间接推断数据库类型,检测到X-Powered-By: PHP且未指定数据库时,默认可能是MySQL。

问题2:如何区分MySQL和MariaDB?
解答:MySQL和MariaDB在语法和功能上高度兼容,但可以通过以下方法区分:

  1. 版本查询:执行SELECT VERSION(),MySQL版本通常以70等开头,MariaDB版本以25等开头。
  2. 变量查询:执行SHOW VARIABLES LIKE 'version_comment',MySQL返回MySQL,MariaDB返回MariaDB
  3. 特定函数:MariaDB支持MySQL不具备的函数,如MD5()的某些变体或JSON函数的差异。
  4. 工具识别:SQLMap等工具在获取版本信息时会明确标识为MySQL或MariaDB。
分享:
扫描分享到社交APP
上一篇
下一篇