|
MySQL 注入基本都是靠 Union 的联合查询,所以必须要求 MySQL 的版本为 4.0 及其以上。判断数据库的版本可以参考《判断数据库版本的 ord(mid(version(),1,1)) 》和《使用 /*!...*/ 精确判断数据库版本 》。
联合查询是有一些限制的,它要求跨表查询的字段要和前边查询的字段相同。由于一般的渗透是基于黑盒测试的,因此也很难搞到网站源码来查看系统表的结构。利用 Union 联合查询字段数目不匹配及匹配时返回的不同信息,我们最终可以得到字段的数目。
下面先在 MySQL 命令行里考察一下 Union Select 的一个情况:
这里的 union select 只是在本表进行联合查询,其后一共有 23 个 1 (实际上,ppw_online 这个表里总共有 24 个字段),那么我们看到报错,错误信息为“ SELECT 命令进行了和列数(字段数)不一致的查询”。利用这一点,我们就可以猜解字段的数目。
事实上, union select 后面的 1 只是做测试用,在实际使用中并无什么用处。如果上头给出 24 个 1,其数目刚好和字段数一致,那么就会执行正确,在打印出结果时,会将 1 写在每个字段之下,如下图所示:
和命令行同样的道理,可以在 URL 中提交:
由于当前查询表的字段数总共有 27 个,因此在用 26 个 1 时测试会返回失败,在用 27 个 1 测试才会看到正常的页面返回。另外提一点,在使用 and 1=2 测试时返回的是错误页面,但并不是查询语法本身的错误,语法没错,而是查询结果为空,从而出现”错误“页面。而使用不正确的 1 个数,即和字段数不一样,这也就是语法错误,而语法错误也是返回同样一个”错误“的页面。因此同是错误页面,但产生的原因是不一样的。
使用 union select 来判断字段数比较麻烦,不能直观的得到结果。可以使用 order by 来替代,它可以轻松地判断字段数目,因为可以在 "order by" 后面跟数字,在 MySQL 中会将该数字解释为按照第几列进行查询。如果没有这一列,那就会出现错误的信息,利用这个特性就可以轻松的判断查询的字段数目。
比如下面的查询:
可以将上述语句 order by 后的 10 替换为不同的数字,如果、查询都出现了正常的页面,那么说明存在这个字段,如果是错误页面,说明不存在这个字段。这样就很容易知道该表总共有多少个字段。
由于 MySQL 3.0 不支持 Union Select 查询,但它仍然可以使用 order by 来查询,因此要查询字段数目,一般就使用 order by 来。
由于网站有防止提交非法 SQL 查询功能,帖子里也不允许含有这些语句,因此上面的示例句子使用截图。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|