曲径通幽论坛

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

[PHP+MYSQL] 猜解字段数目

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2013-9-9 17:15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-3 12:37 , Processed in 0.086806 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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