曲径通幽论坛

标题: 使用 /*!...*/ 精确判断数据库版本 [打印本页]

作者: beyes    时间: 2013-9-7 23:46
标题: 使用 /*!...*/ 精确判断数据库版本
在一些 SQL 里,/* */ 是用来注释的,MySQL 也是这样,但是它还有其特殊之处,这些特殊之处是 MySQL 的一种扩展,但如果将这种扩展移植到其他的 SQL 服务器上,那么就会被忽略这些扩展,例如:
select /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...

如果在字符 '!' 后添加了版本号,那么仅当 MySQL 的版本等于或高于指定的版本号时才会执行注释中的语法:
create /*!32302 TEMPORARY */ TABLE t (a INT);
这里意味着,如果 你的版本号为 3.23.02 或更高,那么 MySQL 服务器将使用 TEMPORARY 关键字。

这里,就利用这个特新来精确猜解数据库的版本号:

1. 首先测试一下网站是否在使用 MySQL 数据库:
[attach]1872[/attach]

在注入点后接的是 /*!%20s*/ ,页面出错,说明该站用的是 MySQL 数据库。这是因为,如果是采用别的 SQL 数据库的话,那么在注入点后接 /* */ 会被当成是注释,从而出现正常的页面。正是因为它是 MySQL,所以它才会试图去解析这个 '!' ,然而在这个感叹号后接的是错误的命令,因此页面会出错,从而知道它是 MySQL 。

2. 准确定位 MySQL 版本

执行下面的语句:
[attach]1873[/attach]

上面接的是 /*!40000%20s*/ ,也出现了错误界面,因此可判断该 MySQL 的版本号大于 4.00.00 。可以依循该测试方法,直到测试出正确的版本号,如接入的是  /*!50531%20s*/ 时出错,而在  /*!50533%20s*/ 时返回正常页面,那么说明了该 MySQL 的精确版本号为 5.5.32 。


通过该方法定位 MySQL 版本号非常繁琐,但比较管用。另外,/**/ 还可以代替空格,这有利于绕过程序对空格的过滤。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2