SQL注入漏洞-Mssql报错注入

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') 判断用户是否属于管理员的组


判断页面是否可以注入,首先访问页面

SQL注入漏洞-Mssql报错注入_第1张图片

在参数id=1后面添加单引号。

SQL注入漏洞-Mssql报错注入_第2张图片

 出现报错情况。然后在id=1后面添加 and 1=1,页面响应正常。

SQL注入漏洞-Mssql报错注入_第3张图片

在id=1后面添加 and 1=2,页面没有数据返回。

SQL注入漏洞-Mssql报错注入_第4张图片

根据上面的情况可以判定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注入漏洞-Mssql报错注入_第5张图片

 注入后的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注入漏洞-Mssql报错注入_第6张图片

注入后的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后面跟上前面得到的所有字段。

SQL注入漏洞-Mssql报错注入_第7张图片

接着爆下一个字段的名字,注入语句为group by id,title having 1=1。自己尝试爆出剩下的字段名。

爆字段内容。这里用到转换类型错误报错,形如1=0/columnname,因为0是整数型,而columnname为字符型。爆字段title的内容。

SQL注入漏洞-Mssql报错注入_第8张图片

注入后的sql语句为:select * from articles where ID =1 and 1/title。因为title为字符串类型,转换出错。

如果登录界面存在这种错误,那么攻击者可以通过这种方法来获取用户的用户名和密码等信息。


 

了解group by having的用法。

详细参考:

Group by与having理解 - cnby - 博客园

sql中的group by 和 having 用法解析 - 夕诺 - 博客园

你可能感兴趣的:(SQL注入,sql,sqlserver,数据库)