数据库敏感数据探测技术解析

本文详细介绍了如何通过SQL脚本自动化扫描数据库中的敏感字段(如密码、银行账户等),包含完整的MSSQL查询代码实现,并探讨了与Metasploit框架集成的技术方案。

发现有趣的数据库数据

最近我开始阅读Justin Clarke的经典著作《SQL注入攻击与防御》。在开篇章节中,作者详细分析了Asprox僵尸网络的工作机制:它会扫描所有可访问的数据库,寻找文本类型的字段,并在现有数据中注入恶意JavaScript代码。

通过研究源代码,我将其改造为搜索"敏感"字段名而非单纯文本字段,并输出检测结果而非注入代码。我定义的敏感字段包括:

  • credit(信用)
  • bank(银行)
  • account(账户)
  • password(密码)

最终实现的SQL查询如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
DECLARE @dbname nvarchar(255), @id int, @sql varchar (4000);
DECLARE table_cursor CURSOR FOR 
    SELECT name FROM sys.databases OPEN table_cursor FETCH NEXT FROM table_cursor INTO @dbname

WHILE (@@FETCH_STATUS = 0) BEGIN
    SET @sql = 'SELECT '
    SET @sql = @sql + ' ''' + @dbname + ''' AS ''Database'', '
    -- 其余字段选择逻辑
    SET @sql = @sql + 'WHERE (lower(sys.columns.name) LIKE ''%password%'' OR '
    -- 其他敏感词匹配条件
    EXEC (@sql)
    FETCH NEXT FROM table_cursor INTO @dbname
END

该脚本会遍历每个数据库的模式和表,输出敏感字段的位置和数据类型。经测试兼容MSSQL 2005/2008,但需要调整才能支持2000版本。

为了帮助审计人员快速判断数据价值,我增加了数据采样功能。由于MSSQL没有MySQL的LIMIT语法,采用以下方案获取首、中、尾三条记录:

1
2
3
4
5
6
7
8
9
DECLARE @count int;
SELECT @count=count(*) FROM 目标表;

IF (@count > 3)
    BEGIN
        -- 使用ROW_NUMBER()实现分页采样
        WITH tmp AS (SELECT *,ROW_NUMBER() OVER (ORDER BY 字段) AS rownumber FROM )
            SELECT * FROM tmp WHERE rownumber IN (1, @count/2, @count);
    END

最终我将这些功能整合成Metasploit模块"MSSQL Interesting Data Finder"。当前版本因框架限制暂不支持:

  1. 数据采样功能(底层模块存在bug)
  2. Windows身份验证(仅支持SQL认证)

未来方向

该技术可扩展至MySQL/PostgreSQL/Oracle等数据库。MySQL版本已在开发计划中,其他数据库的实现留给读者作为练习。

致谢

特别感谢Justin Clarke的著作启发,促使我在渗透测试中更深入地挖掘SQL注入漏洞。唯一遗憾的是需要更多时间读完这本佳作!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计