Mssql即Sql Sever,SQL Server 是Microsoft 公司推出的关系型数据库管理系统,Sql Sever通常与IIS服务器搭配使用。
在mssql注入过程中,经常用到一些mssql中的系统函数,这些系统函数有助于帮助获取目标站点的信息:
User;user_name();system_user用户
db_name():当前数据库的名字
host_name():主机名字
@@version:数据库版本
@@servername:服务器名称
@@language:当前所使用语言的名称
@@spid:当前用户的进程ID
is_srvrolemember ('sysadmin') 判断用户是否属于管理员的组
判断页面是否可以注入,首先访问页面
在参数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
把参数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,可以断定当前的数据库用户属于管理员组。
用having 1=1爆出第一个字段的名字。
爆出其他字段内容,方法为在group by 后面跟上第一个字段,爆下一个字段的时候需要在group by后面跟上前面得到的所有字段。
接着爆下一个字段的名字,注入语句为group by id,title having 1=1。自己尝试爆出剩下的字段名。
爆字段内容。这里用到转换类型错误报错,形如1=0/columnname,因为0是整数型,而columnname为字符型。爆字段title的内容。
注入后的sql语句为:select * from articles where ID =1 and 1/title。因为title为字符串类型,转换出错。
如果登录界面存在这种错误,那么攻击者可以通过这种方法来获取用户的用户名和密码等信息。
了解group by having的用法。
详细参考:
Group by与having理解 - cnby - 博客园
sql中的group by 和 having 用法解析 - 夕诺 - 博客园