欢迎光临
我们一直在努力

新手向从0剖析漏洞之SQL注入--0x0001

前言:SQL注入已经是非常传统的漏洞了,在WAF站均部署,新建网站使用参数化查询的当下,这个漏洞的挖掘难度也大幅提升。但为什么今天还是对这个漏洞进行讲解,其一是因为部分建立较早的网站为了业务的持续性很少真正地对源码进行根本性修改从而避免该漏洞产生,甚至发现有的网站居然还采用前端拼接SQL语句的离谱做法,其二是随着技术的发展,在不同领域上也出现了其他SQL注入的方法,这极大扩展了该漏洞的攻击面。所以漏洞本身还是会存在的,只是有时会受到诸如WAF的种种阻拦导致黑盒渗透时难以发现。

基本原理:SQL 注入为什么发生?

1.1 SQL 与 Web 应用回顾

· 数据库、表、行、列、主键、外键。
· 常见 SQL:SELECT、INSERT、UPDATE、DELETE。
· Web 请求生命周期:浏览器/App → HTTP 请求 → 后端代码 → 数据库驱动 → SQL 解析器 → 执行 → 返回结果。
关键点:SQL 是代码,用户输入本应是数据。

1.2 核心漏洞:数据被当成代码执行

用伪代码说明:sql = “SELECT id, name FROM users WHERE username = '” + input + “'”
正常输入只是字符串,恶意输入可能改变 SQL 语法或逻辑。本质不是“引号问题”,而是:字符串拼接、模板拼接、动态 SQL、未参数化的查询构造

1.3 信任边界与污染传播

· 源:HTTP 参数、JSON 字段、Cookie、Header、URL 路径、上传文件名、第三方 API、数据库中的二次数据。
· 汇:SQL 执行函数、ORM 原生查询、存储过程、动态表名/列名、排序字段。

1.4 常见误区

· “用了 ORM 就一定安全”:错,raw、whereRaw、orderBy 拼接仍危险。
· “有 WAF 就安全”:WAF 是缓解,不是根治。
· “API 不返回错误就安全”:盲注、时间注入仍可能。
· “内网系统不用防”:横向移动、供应链、多租户越权风险更大。
总结:SQL 注入 = 用户输入进入 SQL 解释器,并且没有被正确当作数据隔离。

现代网站应用场景:SQL 注入还在哪里?

2.1 传统 Web 与 CMS

· 登录、注册、密码重置。
· 搜索、分类、分页、排序。· 后台管理、插件、主题、模块。
· 风险点:老代码、字符串拼接、动态 SQL。

2.2 REST API 与 JSON 接口

· GET /users?sort=id&order=asc
· POST /search,JSON 字段进入查询。
· 批量查询、过滤、导出接口。
· 风险点:排序字段、表名、列名、LIKE 条件拼接。

2.3 GraphQL 与微服务

· GraphQL resolver 中直接拼接 SQL。
· 微服务之间“内网信任”,内部 API 不做参数化。
· API 网关只做路由和限流,不理解 SQL。
· 风险点:嵌套查询、批量解析、服务间数据聚合。

2.4 ORM 与查询构建器

· 安全用法:参数绑定、预编译。
· 危险用法:whereRaw(“name = '” + input + “'”)、orderBy(input)
· MyBatis ${} 与 #{} 的区别。
· 动态表名、动态列名、动态排序方向无法简单参数化。

2.5 认证、账户与多租户 SaaS

· 登录、会话、权限查询、密码重置 token。
· 多租户系统:tenant_id 拼接导致跨租户读取。
· 风险点:越权 + SQL 注入组合,影响面更大。

2.6 报表、BI、数据分析与导出

· 自定义筛选、仪表盘、数据透视、Excel 导出。
· 动态 SQL、存储过程、临时表。
· 风险点:为了灵活性牺牲参数化,数据库账户权限过高。

2.7 搜索、过滤、分页

· 多条件组合查询。
· ORDER BY、LIMIT、OFFSET、表名、列名。
· 风险点:这些位置常不能直接参数化,需要白名单。

2.8 后台管理、低代码与内部工具

· 运营后台、数据导入导出、批量操作。
· 低代码平台自定义查询。
· 风险点:内部工具常被忽视,但权限高、数据敏感。

2.9 云原生、Serverless 与移动后端

· 函数计算连接云数据库。
· 环境变量、连接池、数据库代理。
· 移动 App、IoT、Webhook、第三方回调。
· 风险点:配置错误、权限过大、日志泄露。

2.10 现代新风险:NL2SQL 与 AI 生成 SQL

· 自然语言转 SQL、AI 助手生成查询。
· 若直接执行未沙箱、未校验的 SQL,可能造成注入、越权、数据泄露。

应用条件:SQL 注入成立需要什么?

3.1 必要条件

输入可控:攻击者能影响某个输入源。
输入到达 SQL:输入进入查询语句、存储过程、动态 SQL。
未正确隔离:没有参数化、预编译、白名单、严格类型转换。
SQL 被执行:数据库连接有效,语句被数据库解析执行。
有反馈或侧信道:回显、报错、布尔差异、时间延迟、带外通道。
权限足够:数据库账户能读、写、文件读写、命令执行等。

3.2 增强条件

· 数据库类型和版本已知:MySQL、PostgreSQL、SQL Server、Oracle 特性不同。
· 支持注释、多语句、子查询、堆叠查询。
· 字符集、编码、转义规则存在差异。
· WAF/过滤可被绕过或规则不全。
· 错误信息暴露表名、列名、SQL 片段。
· 数据库账户权限过高:FILE、xp_cmdshell、COPY 等。
· 网络可达:能直连数据库或通过应用代理访问。
· 二阶注入:恶意数据先存储,后续查询再触发。

后记:未来会根据这份大纲剖析漏洞帮助新手真正地去了解学习,在讲解过程中也可能会适当地新增或删除板块确保内容的时效性,也希望各位业内的老师傅能纠正文章的错误

(非商业用途,仅供交流学习,禁止转载)

赞(0)
未经允许不得转载:171主机测评 » 新手向从0剖析漏洞之SQL注入--0x0001
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址