目录
一、MySQL联合查询注入常规步骤-非盲注
1、数据库介绍
当前数据库中有2个数据库:user数据库中有users表,flag数据库中有flag_table表。需要通过SQL注入得到flag数据库中的flag值。
2、PHP代码介绍
<?php
header('content-type:text/html;charset=utf-8');
@$id=$_GET['id']; //传参
if(!isset($id)){
die('请传入GET方法id参数值');
}
$mysqli=new mysqli();
$mysqli->connect('localhost','root','root');
if($mysqli->connect_errno){
die('连接数据库失败:'.$mysqli->connect_error);
}
$mysqli->select_db('user');
if($mysqli->errno){
die('打开数据库失败:'.$mysqli->error);
}
$mysqli->set_charset('utf8');
$sql="SELECT username,passwd FROM users WHERE id={$id}"; //动态构造SQL语句
$result=$mysqli->query($sql);
if(!$result){
die('执行SQL语句失败:'.$mysqli->error); //SQL语句执行错误会显示出来,说明为报错注入
}else if($result->num_rows==0){
die('查询结果为空');
}else {
$array1=$result->fetch_all(MYSQLI_ASSOC);
foreach($array1 as $key=>$value){
echo '用户名:'.$value['username'].'<br />'.'密码:'.$value['passwd'].'<br />';
}
}
执行效果:
3、SQL注入过程
判断注入点-判断数据库版本-判断字段数-进行UNION联合查询
关键代码:$sql="SELECT username,passwd FROM users WHERE id={$id}";
判断注入点
可看到,传入的是整数1,MySQL支持运算符操作,那么传入运算符操作,如果生效则证明SQL语句运行了
id=2的情况下:
id=3-1的情况下:和id=2结果相同,说明进行了运算操作
id=1+1的情况下:和id=2结果相同,说明进行了运算操作。注意:+号在MySQL中表示空格,所以这里要进行url编码为%2B
通过在id=1后面加入单引号或双引号,使拼接的SQL语句出错
$sql="SELECT username,passwd FROM users WHERE id=1‘";
$sql="SELECT username,passwd FROM users WHERE id=1“";
进行逻辑运算,1 and 1为真
1 and 0为假,所以查询结果为空
WHERE id=1 or 1相当于WHERE 1,所以显示出表中全部数据
判断MySQL版本
通过判断MySQL数据库版本,如果是>=5版本的,可以直接查询information_schema表,如果低于5版本则只能猜解。现目前低于MySQL5.0的站点很少,但掌握该技术是有必要的。
在注释的开头部分添加一个感叹号并在后面更上数据库版本编号,那么该注释将被解析成代码,只要安装的数据库版本高于或等于注释中包含的版本,代码就会被执行。
执行了2-1操作,说明数据库版本大于或等于4.1版本
未执行了2-1操作,说明数据库版本小于5.1
执行了2-1操作,说明数据库版本为5版本
猜字段数
知道了注入点及数据库版本号,MySQL支持UNION联合查询,可通过联合查询查询其他数据库中的信息,得到我们想要的结果。但在进行联合查询前,需要知道现在表查询的字段数,因为UNION联合查询需要字段数相同及数据类型兼容才可以。
可以通过ORDER BY 指定列数进行排序,如果超过了列数,就会进行报错,则就知道了当前查询SQL中的字段数。
经过测试,字段数为2,查看当前SQL语句得知,查询的字段数确实为2个。
$sql="SELECT username,passwd FROM users WHERE id={$id}";
进行UNION联合查询
知道了当前查询的字段数,数据类型为了兼容设置为NULL。
可看到,联合查询生效了。
MySQL支持系统函数及系统变量,可替换NULL进行查询数据库信息
可以通过查询information_schema数据库得到全部数据库名、表名、字段名,查询我们想要的数据。
得到数据库名:
得到数据库下表名:
得到字段名:
知道了数据库名、表名、字段名,直接查询
以上就是MySQL联合查询注入常规操作,其他变换也是在此步骤上进行变换。
二、猜解注入
当不支持UNION联合查询时,可使用猜解数据库名、表名、字段名来进行注入。
猜解表名
猜解字段名
猜解字段记录长度
可得知,username字段第一行记录值长度为4
逐字猜解字段值
后面会学到二分搜索法,可通过二分搜索法加快猜解速度。