曲径通幽论坛

标题: 猜解字段数目 [打印本页]

作者: beyes    时间: 2013-9-9 17:15
标题: 猜解字段数目
MySQL 注入基本都是靠 Union 的联合查询,所以必须要求 MySQL 的版本为 4.0 及其以上。判断数据库的版本可以参考《判断数据库版本的 ord(mid(version(),1,1)) 》和《使用 /*!...*/ 精确判断数据库版本 》。

联合查询是有一些限制的,它要求跨表查询的字段要和前边查询的字段相同。由于一般的渗透是基于黑盒测试的,因此也很难搞到网站源码来查看系统表的结构。利用 Union 联合查询字段数目不匹配及匹配时返回的不同信息,我们最终可以得到字段的数目。

下面先在 MySQL 命令行里考察一下  Union Select 的一个情况:
[attach]1882[/attach]



这里的 union select 只是在本表进行联合查询,其后一共有 23 个 1 (实际上,ppw_online 这个表里总共有 24 个字段),那么我们看到报错,错误信息为“ SELECT 命令进行了和列数(字段数)不一致的查询”。利用这一点,我们就可以猜解字段的数目。

事实上, union select 后面的 1 只是做测试用,在实际使用中并无什么用处。如果上头给出 24 个 1,其数目刚好和字段数一致,那么就会执行正确,在打印出结果时,会将 1 写在每个字段之下,如下图所示:
[attach]1883[/attach]


和命令行同样的道理,可以在 URL 中提交:
[attach]1885[/attach]



由于当前查询表的字段数总共有 27 个,因此在用 26 个 1 时测试会返回失败,在用 27 个 1 测试才会看到正常的页面返回。另外提一点,在使用 and 1=2 测试时返回的是错误页面,但并不是查询语法本身的错误,语法没错,而是查询结果为空,从而出现”错误“页面。而使用不正确的 1 个数,即和字段数不一样,这也就是语法错误,而语法错误也是返回同样一个”错误“的页面。因此同是错误页面,但产生的原因是不一样的。

使用 union select 来判断字段数比较麻烦,不能直观的得到结果。可以使用 order by 来替代,它可以轻松地判断字段数目,因为可以在 "order by" 后面跟数字,在 MySQL 中会将该数字解释为按照第几列进行查询。如果没有这一列,那就会出现错误的信息,利用这个特性就可以轻松的判断查询的字段数目。

比如下面的查询:
[attach]1884[/attach]



可以将上述语句 order by 后的 10 替换为不同的数字,如果、查询都出现了正常的页面,那么说明存在这个字段,如果是错误页面,说明不存在这个字段。这样就很容易知道该表总共有多少个字段。

由于 MySQL 3.0 不支持 Union Select 查询,但它仍然可以使用 order by 来查询,因此要查询字段数目,一般就使用 order by 来。

由于网站有防止提交非法 SQL 查询功能,帖子里也不允许含有这些语句,因此上面的示例句子使用截图。




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