在线旅游及旅行管理系统项目SQL注入

1.前言

之前在网上随便逛逛的时候,发现一个有各种各样的PHP项目的管理系统,随便点进一个查看,发现还把mysql版本都写出来了,而且还是PHP语言。

https://itsourcecode.com/free-projects/php-project/online-tours-and-travels-management-system-project-in-php-and-mysql/

那这可能存在sql注入漏洞,所以代码审计了一下,并上报了CVE,现在编号下来了 CVE-2025-9008,CVE-2025-8993,于是公开发现过程。

2.漏洞详情

1.1 CVE-2025-9008

下载其源代码之后,对“在线旅游及差旅管理系统”进行安全审查期间,发现“/admin/sms_setting.php””文件中存在一个高危SQL注入漏洞。

$sql = "UPDATE sms_setting SET uname='".$_POST['uname']."',password='".$_POST['password']."',sender_id='".$_POST['sender_id']."'WHERE id='1'";

这段sql代码一眼望过去就是,直接将用户通过 $_POST超全局数组提交的数据,未经任何过滤和转义,就拼接到了 SQL 查询字符串中,那这肯定就存在sql注入漏洞。

因为sql 注入的核心在于“混淆了代码和数据”,用户的输入本应被视为普通数据,但由于直接拼接,攻击者可以精心构造输入,让其成为 sql代码的一部分,从而篡改原SQL语句的意图。

比如说在密码 password 输入框中,攻击者输入了:' OR '1'='1

那么,最终拼接出来的 SQL 语句会变成:

UPDATE sms_setting SETuname='hacker',password='' OR '1'='1',sender_id='fake_sender'
WHERE id='1'

这条语句的含义被彻底改变了。password字段的赋值不再是一个简单的字符串,而是变成了一个逻辑判断 '' OR '1'='1'。这个判断的结果是 永远为真。

更高级的攻击者甚至可以输入类似 '; DROP TABLE users; --的内容,从而执行任意sql命令,比如说删除数据库表,导出数据库数据之类的操作。

payload

---
Parameter: uname (POST)Type: boolean-based blindTitle: MySQL RLIKE boolean-based blind - WHERE, HAVING, ORDER BY or GROUP BY clausePayload: uname=111111111111' RLIKE (SELECT (CASE WHEN (2321=2321) THEN 111111111111 ELSE 0x28 END)) AND 'QhkJ'='QhkJ&password=111111111111111111&sender_id=1111111111111111111&update=Type: error-basedTitle: MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)Payload: uname=111111111111' AND EXTRACTVALUE(9139,CONCAT(0x5c,0x7178627171,(SELECT (ELT(9139=9139,1))),0x716a787171)) AND 'CAQx'='CAQx&password=111111111111111111&sender_id=1111111111111111111&update=
---

我们也可以使用一些工具来进行查看,比如说sqlmap。

sqlmap -u "http:/http://127.0.0.1/code/admin/sms_setting.php" --data="uname" --batch --dbs

通过 HTTP POST 请求 提交的、名为 uname的表单字段,选择了布尔盲注的攻击类型。

布尔盲注这是一种高级注入技术,用于当网站不会直接显示数据库错误信息,并且查询结果也不会直接返回到页面上的情况。攻击者通过向数据库发送一个“问题”,然后根据页面返回的细微差异,一般来说都是通过观察页面是否可以正常加载来判断。

帮助网安学习,全套资料S信领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

而图中的payload

uname=111111111111' RLIKE (SELECT (CASE WHEN (2321=2321) THEN 111111111111 ELSE 0x28 END)) AND 'QhkJ'='QhkJ

111111111111:这是一个随机的无效用户名,目的是让原查询的uname匹配不到结果。

RLIKE: 这是MySQL的正则表达式匹配操作符,一般用它来触发一个条件判断。

(CASE WHEN (2321=2321) THEN … ELSE … END): 这是一个SQL的CASE条件语句。这里它判断一个永恒成立的条件 2321=2321

如果条件为 True,那么整个RLIKE语句会匹配用户名111111111111,页面可能会返回一个找不到用户名存在的状态。

如果条件为 False,比如说什么1=2之类的常见语句,那么CASE语句会返回一个错误的结果,导致RLIKE匹配失败,页面可能会返回一个完全空白的状态。

把2321=2321换成 (SELECT COUNT(*) FROM information_schema.schemata) > 5),观察页面的反应,盲猜出数据库名称出来。

所以明确了这里存在sql注入漏洞。

1.2 CVE-2025-8993

接着,在“/admin/expense_report.php”文件中又发现了一个严重的SQL注入漏洞。该漏洞源于对“from_date”参数的用户输入验证不足,使得攻击者能够注入恶意SQL查询。因此,攻击者可以未经授权访问数据库,修改或删除数据,并获取敏感信息。

这段代码的核心逻辑其实就是,首先检查用户是否点击了提交按钮if (isset($_POST['submit'])),然后就去获取用户表单中输入的起始日期$from_date和结束日期$to_date,连接数据库之后用一条 sql 语句,查询 expense表中所有在用户指定日期范围内创建的记录。

而且还用了PDO,PDO最重要的就是预处理语句,从根本上防御sql注入,但是又没使用好。

它将 sql 语句的结构 和 数据 分开发送给数据库服务器处理。

比如说先把一个带“占位符”的 sql 模板发送给数据库,数据库会解析并编译这个模板,确定它的结构。

$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ? AND pwd = ?");

然后当执行阶段的时候,再把真实的数据,比如说什么用户输入的用户名和密码,发送给数据库,数据库只会把这些数据当正常数据值使用,不会把它当成 SQL 代码来解析。

这样就避免了,即使用户输入了恶意的数据比如说什么常见的 ' OR '1'='1,它也只会被当作一个普通的字符串字面值去进行匹配,而不会改变原sql语句的逻辑。从而彻底杜绝了 SQL 注入。

但是这条sql语句虽然也使用了PDO,但是它把用户要输入的from_date的值给它拼接到sql字符串了,代码和字符串直接拼接,完全绕过了PDO的安全保护,让PDO形同虚设。

$stmt = $conn->prepare("SELECT * FROM expense where created_date between '".$_POST['from_date']."' and '".$_POST['to_date']."' ");

$_POST['from_date']$_POST['to_date'] 没有任何过滤/转义,直接拼接到了 SQL 中。

攻击者只要在表单输入里构造恶意 payload,就能注入 sql。

虽然用了 PDO,但没有真正用到参数化查询。

$conn->prepare(...) 本身可以防止注入,但是这里不知道怎么回事,开发者依然把变量拼接到了 sql 里,相当于没起作用。

所以漏洞源于“from_date”参数的用户输入验证不足,导致攻击者能够注入恶意sql查询。

payload

---
Parameter: from_date (POST)Type: error-basedTitle: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)Payload: from_date=0111-11-11' AND GTID_SUBSET(CONCAT(0x71716a6271,(SELECT (ELT(8748=8748,1))),0x7162707071),8748)-- OwaD&to_date=0001-01-11&submit=Type: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: from_date=0111-11-11' AND (SELECT 5860 FROM (SELECT(SLEEP(5)))KNEf)-- vyOX&to_date=0001-01-11&submit=
---

用sqlmap进行检测

sqlmap -u "http:/http://127.0.0.1/code/admin/expense_report.php" --data="from_date" --batch --dbs

sqlmap 识别到 POST 参数 from_date 存在注入漏洞。

测试了多种方式,包括 基于报错注入 和 基于时间的盲注 ,都确认有效。

所谓的错误型注入,简单点说就是通过故意触发数据库错误,从而让数据库在报错信息中直接返回查询结果。

还有时间盲注 ,字面意思也就是通过让数据库执行延时函数,比如说什么 SLEEP(5),然后根据页面响应时间来判断注入的sql是否有效。

from_date=0111-11-11' AND (SELECT 5860 FROM (SELECT(SLEEP(5)))KNEf)-- vy0X&...

如果注入成功,数据库将会执行 SLEEP(5)命令,导致页面响应时间延迟5秒。sqlmap就会根据这个延迟就能判断出漏洞存在。

而且sqlmap 成功获取了数据库名:information_schema,这是系统库,每个cms都会有的。

tour1,这个才是该cms特有的数据库名称。

所以明确了POST参数的from_date存在注入漏洞。

3.建议修复

  1. 使用准备好的语句和参数绑定:
    准备好的语句可以防止 SQL 注入,因为它们将 SQL 代码与用户输入数据分离。使用准备好的语句时,用户输入的值将被视为纯数据,不会被解释为 SQL 代码。
  2. 输入验证和过滤:
    严格验证和过滤用户输入数据,确保其符合预期的格式。
  3. 最小化数据库用户权限:
    确保用于连接数据库的账户具有必要的最低权限。避免使用具有高级权限的账户,比如“root”或“admin”进行日常操作。
  4. 定期安全审计:
    定期进行代码和系统安全审计,及时发现并修复潜在的安全漏洞。

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

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

相关文章

Java网络编程(UDP, TCP, HTTP)

1. OSI 七层网络模型层级名称核心功能协议示例数据单元7应用层提供用户接口和网络服务HTTP, FTP, SMTP, DNS报文6表示层数据格式转换、加密/解密、压缩/解压SSL, JPEG, MPEG数据流5会话层建立、管理和终止会话连接NetBIOS, RPC会话数据4传输层端到端可靠传输、流量控制、差错校…

【P2P】P2P主要技术及RELAY服务1:python实现

P2P 技术 P2P(点对点)网络的核心是去中心化的网络拓扑和通信协议。DP的应用相对较少,但可能出现在: 路由优化:在一些复杂的P2P网络中,一个节点需要向另一个节点发送消息。为了找到一条延迟最低或跳数最少的路径,可能会用到类似最短路径的算法,而这类算法(如Bellman-F…

docker 安装 redis 并设置 volumes 并修改 修改密码(一)

在 Docker 中安装 Redis 并设置volumes持久化数据,同时修改 Redis 密码的完整步骤如下: 安装 Docker 如果还没有安装 Docker,可以参考以下步骤安装: 在 Alibaba Cloud Linux 上安装 Docker # 更新系统 sudo yum update -y# 安装 Docker 依赖 sudo yum install -y yum-util…

如何找出所有连接到本机指定端口的客户端 IP

在日常运维或排查网络问题时,我们常常需要知道:有哪些客户端正在连接我的服务?连接数是否异常?是否存在恶意扫描或 DDoS 行为?本文将教你使用一条简洁高效的 Linux 命令组合,统计连接到本机某个端口&#x…

java IDE安装idea社区版步骤

IntelliJ IDEA 社区版(Community Edition)是一款功能强大且完全免费的集成开发环境,非常适合 Java 和 Kotlin 初学者或进行基础开发2。我会为你提供详细的安装步骤。 🛠 IntelliJ IDEA 社区版安装指南 📋 系统要求与…

Agent智能体

什么是 Agent? Agent 是一个智能体,可以接收用户请求,利用大模型(LLM)的推理能力,自动决定: 自己回答还是调用外部工具(数据库、API、脚本等) 最终把结果返回给用户。 能…

【VSCode】使用VSCode打开md文件以及转化为PDF

【VSCode】使用VSCode打开md文件以及转化为PDF在 Visual Studio Code (VS Code) 中渲染 Markdown 并保存为 PDF,可以通过以下步骤实现。 首先安装好 VSCode,可以参考下述链接 https://blog.csdn.net/weixin_43848614/article/details/148042035 安装m…

苹果ImageIO零日漏洞分析:攻击背景与iOS零点击漏洞历史对比

苹果公司已紧急发布全生态系统安全更新,修复编号为CVE-2025-43300的ImageIO框架高危零日漏洞(zero-day),该漏洞已被用于复杂的定向攻击。这是苹果在2025年修复的第七个零日漏洞,凸显iOS和macOS设备面临的威胁持续升级。…

面试 TOP101 递归/回溯专题题解汇总Java版(BM55 —— BM61)

8月刷题挑战,多重好礼等你拿 递归/回溯 题号题目名称核心思路时间复杂度空间复杂度代码亮点牛客原题链接BM55没有重复项数字的全排列使用回溯法生成所有排列O(n!)O(n)使用回溯法生成所有排列,逻辑清晰🔗 直达BM56有重复项数字的全排列使用回…

音频相关数学知识

时域(Time domain)是描述数学函数或物理信号对时间的关系,如果声音对应频率正负波动,对应事件x轴为时间,y轴为振幅频域信号在频率方面特性,如射频范围正弦型函数可以用来虚拟音频,正弦&#xff…

SAP-ABAP:SAP HANA 架构解析:主从(Scale-Out)与主备(High Availability)架构深度对比

SAP HANA 架构解析:主从(Scale-Out)与主备(High Availability)架构深度对比 一、架构概述 在SAP HANA数据库系统中,两种核心架构模式解决了不同的业务需求:主从架构(Scale-Out&#…

【Hadoop】HDFS 分布式存储系统

Namenode是整个HDFS文件系统的前端,只有一个,管理数据块映射信息,配置副本策略,处理客户端的读写请求。Secondary namenode是namenode的热备,当active namenode出现故障时,快速切换为新的active namenode。…

[特殊字符] 如何在自己的仓库开发,同时保持同步原作者更新(超详细教程)

在开源协作开发中,很多时候我们会遇到这样一种情况: 👉 我们想基于一个开源项目继续开发,代码要推送到自己的仓库里; 👉 但原作者可能还会更新,我们也希望能随时把最新的改动同步过来。 本文以 …

Spring Ai (Function Calling / Tool Calling) 工具调用

1.工具调用介绍 工具调用是现代大语言模型(LLM)的一项重要能力,允许模型在生成回复时“决定”是否需要调用某个外部函数来获取信息或执行操作。例如: 联网搜索 (实现查询到大模型未学习和RAG知识库中不存在的数据&am…

LabVIEW 正弦波噪声滤波

利用 LabVIEW 搭建程序,先合成含噪正弦波(正弦信号与高通滤波后的噪声叠加),再通过低通滤波提取纯净正弦波,实现噪声去除,常用于信号处理、测试测量场景,验证滤波算法对正弦信号的降噪效果。​功…

基于django的梧桐山水智慧旅游平台设计与开发(代码+数据库+LW)

摘要 随着信息技术的飞速发展,旅游行业面临着用户需求多样化、信息获取不便、服务体验不佳等问题。传统的旅游服务多依赖人工管理和线下宣传,难以高效整合资源与提供个性化服务。为解决这些问题,本文设计开发一个基于Django的梧桐山水智慧旅…

微服务相关面试题

写在前面 🔥我把后端Java面试题做了一个汇总,有兴趣大家可以看看!这里👉 ⭐️在反复复习面试题时,我发现不同资料的解释五花八门,容易造成概念混淆。尤其是很多总结性的文章和视频,要么冗长难…

循环神经网络——pytorch实现循环神经网络(RNN、GRU、LSTM)

循环神经网络——pytorch实现循环神经网络(RNN、GRU、LSTM) 本文将深入探讨循环神经网络的理论基础,并通过PyTorch深度学习框架来展示如何实现循环神经网络模型。我们将首先介绍循环神经网络的基本概念。通过PyTorch代码示例,我们…

系统架构设计师备考第8天——嵌入式系统

一、嵌入式系统概述定义 为特定应用构建的专用计算机系统,软硬件紧密结合,满足功能、可靠性、成本、体积、功耗等严格要求。核心特征:专用性强、技术融合(计算机通信半导体技术)、软硬一体以软件为主、资源受限、程序固…

HarmonyOS 中的 sharedTransition:实现流畅的页面过渡动画

HarmonyOS 中的 sharedTransition:实现流畅的页面过渡动画 在移动应用开发中,页面之间的过渡动画是提升用户体验的关键因素之一。HarmonyOS 提供了 sharedTransition 功能,让开发者能够轻松实现元素在不同页面间的平滑过渡效果,创…