Web安全解析Boolean注入攻击原理

 更新时间:2021年11月25日 16:32  点击:492 作者:Phanton03167

1. Boolean注入攻击

Boolean注入攻击的测试地址:http://127.0.0.1/sqli/boolean.php?id=1。

访问该网站时,页面返回yes,如图19所示。

图19 访问id=1时页面的结果

在URL后添加一个单引号,再次访问,发现返回结果由yes变成no,如图20所示。

 

图20 访问id=1'时页面的结果

访问id=1' and 1=1%23,id=1' and 1=2%23,发现返回的结果分别是yes和no,更爱ID的值,返现返回的仍然是yes或者no,由此可判断,页面只返回yes或no,而没有返回数据库中的数据,所以此处不可使用Union注入。

此处可以尝试利用Boolean注入,Boolean注入是指构造SQL判断语句,通过查看页面的返回结果来推测哪些SQL判断条件是成立的,以此获取数据库中的数据。我们先判断数据库名的长度,语句如下所示。

因为查询语句前面有单引号,所以和源码中的SQL语句拼接后会多出一个单引号,因此需要注释符来注释。

http请求中+会被替换为空格与--组合成为注释符,空格也可用%20来代替,--%20效果等同。

由于#是用来指导浏览器动作的,对服务器端完全无用,所以,HTTP请求中不包括#。在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。所以如果想用#注释符,就要将#转换为%23。

故上面的语句还可写为:

' and length(database())>=1--%20

' and length(database())>=1%23

1的位置上可以是任意数字,如' and length(database())>=3--+和' and length(database())>=4--+,我们可以构造这样的语句,然后观察也免得返回结果,如图21~23所示。

 

图21 判断数据库库名的长度(1)

 

图22 判断数据库库名的长度(2)

 

图23 判断数据库库名的长度(3)

以上几个语句的意思是,数据库库名的长度大于等于3,结果为yes;数据库库名的唱的大于等于4,结果为no。结合以上几个语句,可以判断出数据库的长度为3。

接着,使用逐字符判断的方式获取数据库库民。数据库库名的范围一般在a~z、0~9之内,可能还有一些特殊字符,这里的字母不区分大小写。逐字符判断的SQL语句为:

' and substr(database(),1,1)='t'--+

substr是截取的意思,其意思是截取database()的值,从第一个字符开始,每次只返回一个。

substr的用法和limit的有区别,需要注意。limit是从0开始排序,而substr是从1开始排序。可以使用Burp的爆破功能爆破每个位置的字符值,如图24所示,爆破结果如图25所示。

 

图24 利用Burp爆破数据库的库名(1)

 

图25 利用Burp爆破数据库的库名(2)

其实还可以使用ASCII码的字符进行查询,t的ASCII码是116,而在MySQL中,ASCII转换的函数为ord(),则逐字符判断的SQL语句应该为如下所示。

' and ord(substr(database(),1,1))=116--+

从Union注入和Burp的爆破结果中我们知道,数据库名是'test'。

查询表名、字段名的语句也应粘贴在database()的位置,从Union注入中已经知道数据库'test'的第一个表名是emails,第一个字母应当是e,判断语句如下所示。

' and substr((select table_name from information_schema.tables where table_schema='test' limit 0,1),1,1)='e'--+

以此类推,就可以查询出所有的表名和字段名,如图27所示,利用Burp爆破的结果如图28所示。

2. Boolean注入代码分析

在Boolean注入页面中程先获取GET参数ID,通过pre_match判断其中是否存在union/sleep/benchmark等危险字符。然后将参数ID拼接到SQL语句,从数据库中查询,如果有结果,则返回yes,否则返回no。当访问该页面时,代码根据数据库查询结果返回yes或no,而不返回数据库中的任何数据,所以页面上智慧显示yes或no,代码如下所示。

<?php
$con=mysqli_connect("localhost","root","root","test");
// 检测连接
if (mysqli_connect_errno())
{
    echo "连接失败: " . mysqli_connect_error();
}
$id = @$_GET['id'];
if(preg_match("/union|sleep|benchmark/i",$id))
{
    exit("no");
}
$sql = "select * from users where `id`='".$id."'";
$result = mysqli_query($con,$sql);
if(!$result)
{
    exit("no");
}
$row = mysqli_fetch_array($result);

if ($row) {
	exit("yes");
}else{
	exit("no");
}
?>

当访问id=1' or 1=1%23时,数据库执行的语句为select * from users where ‘id'=‘1' or 1=1#,由于or 1=1是永真条件,所以此页面可定会返回yes。当访问id=1' and 1=2%23时,数据库执行的语句为select * from users where ‘id'=‘1' and 1=2#,由于and1=2是永假条件,所以此时页面肯定会返回no。

以上就是Web安全解析Boolean注入攻击原理的详细内容,更多关于Web安全Boolean注入攻击的资料请关注猪先飞其它相关文章!

原文出处:https://blog.csdn.net/qq_25505167/article/details/120186210

[!--infotagslink--]

相关文章

  • Springboot如何实现Web系统License授权认证

    这篇文章主要介绍了Springboot如何实现Web系统License授权认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-28
  • C#使用Http Post方式传递Json数据字符串调用Web Service

    这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 详解前端安全之JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本、CSRF跨站请求伪造。防御这些劫持最好的方法是从后端入手,前端能做的太少。而且由于源码的暴露,攻击者很容易绕过防御手段。但这不代表我们去了解这块的相关知识是没意义的,本文的许多方法,用在其他方面也是大有作用。...2021-05-24
  • InterlliJ IDEA2020新建java web项目找不到Static Web的解决

    这篇文章主要介绍了InterlliJ IDEA2020新建java web项目找不到Static Web的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-02
  • 详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)

    这篇文章主要介绍了在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • 安全地关闭MySQL服务的教程

    普通关闭 我的mysql是自己下载的tar包,自己设定安装目录来安装的。停止mysql服务,说来简单,但不知道的话,还真是挠头。在这和mysql入门的同学们共享:)正确方法是,进入mysql的bin目录下,然后执行./mysqladmin -uroot -p shut...2015-11-24
  • jQuery mobile 移动web(6)

    这篇文章主要介绍了jQuery mobile 移动web(6)的相关资料,需要的朋友可以参考下...2015-12-21
  • 阿里规范:为何boolean类型变量命名禁用is开头

    这篇文章主要给大家介绍了关于阿里规范:为何boolean类型变量命名禁用is开头的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-31
  • C#实现线程安全的简易日志记录方法

    这篇文章主要介绍了C#实现线程安全的简易日志记录方法,比较实用的功能,需要的朋友可以参考下...2020-06-25
  • apache中配置整合tomcat环境与安全配置

    系统:centos 5.9 环境:apache 2.2.25 tomcat 7.0.42 jdk 1.7.0 1.安装apache 我这里是直接yum安装的,如果你们要编译安装也不是不行. 代码如下 ...2016-01-28
  • Tomcat首次部署web项目流程图解

    这篇文章主要介绍了Tomcat首次部署web项目流程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-11
  • Microsoft Expression Web 简体中文正式版 官方下载地址

    Microsoft Expression Web 简体中文正式版相对于早期的 Microsoft Expression Web Designer CTP1(英文)除了它是正式的中文版外,有进步的地方1.对标签的id名称加上了css的代...2020-06-25
  • jQuery UI结合Ajax创建可定制的Web界面

    这篇文章主要为大家详细介绍了jQuery UI结合Ajax创建可定制的Web界面,如何利用Ajax和jQuery UI创建具有各种定制功能的高度可定制的UI,感兴趣的小伙伴们可以参考一下...2016-06-24
  • web项目开发之JS函数防抖与节流示例代码

    这篇文章主要介绍了web项目开发之JS函数防抖与节流实现的示例代码及原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-24
  • 创建一个完整的ASP.NET Web API项目

    ASP.NET Web API具有与ASP.NET MVC类似的编程方式,ASP.NET Web API不仅仅具有一个完全独立的消息处理管道,而且这个管道比为ASP.NET MVC设计的管道更为复杂,功能也更为强大。下面创建一个简单的Web API项目,需要的朋友可以参考下...2021-09-22
  • Web制作验证码功能实例代码

    web开发中,经常会使用验证码功能,例如登录、注册,或其他关键功能之前经常会使用。下面通过实例代码给大家介绍Web制作验证码功能实例代码,感兴趣的朋友一起看看吧...2017-06-24
  • gateway与spring-boot-starter-web冲突问题的解决

    这篇文章主要介绍了gateway与spring-boot-starter-web冲突问题的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-17
  • MySQL数据库安全设置和常用管理方式

    当你第一次在机器上安装MySQL时,mysql数据库中的授权表是这样初始化的:你可以从本地主机(localhost)上以root连接而不指定口令。root用户拥有所有权限(包括管理权限) 并可做任何事情。...2013-09-19
  • c# JSON返回格式的WEB SERVICE

    首先用c#创建一个web service,主要是利用其WSDL的功能,当然也可以利用php创建一个,道理都是一样的...2020-06-25
  • php open_basedir安全与使用详解

    open_basedir的作用就是指定目录位置了,意思是将PHP 所能打开的文件限制在指定的目录树,包括文件本身了,并且不受是不是安全模式的影响。 如下是php.ini中的原文...2016-11-25