曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3633|回复: 0
打印 上一主题 下一主题

[PHP+MYSQL] 使用 /*!...*/ 精确判断数据库版本

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2013-9-7 23:46:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在一些 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 数据库:


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

2. 准确定位 MySQL 版本

执行下面的语句:


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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-17 23:52 , Processed in 0.080938 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表