文章总结: 本文是网络安全老宋的实战技术文章,系统解析SQL注入到Getshell的完整链路。文章指出三条落地路径:数据库写文件、日志落地、配合文件上传或包含,并分析securefilepriv参数变化导致写马难度上升,PHP危险函数禁用及云WAF与EDR构成新卡点。绕过技巧包括编码变形、小马拉大马两阶段落地及内存马。防御建议强调数据库与Web隔离、上传执行分离、关闭错误信息及运行时监控。 综合评分: 85 文章分类: 渗透测试,红队,WEB安全,免杀,内网渗透
渗透测试从业者的实战课:SQL注入到Getshell
宝十八 宝十八
网络安全老宋
2026年10月4日 12:00 山东
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
导语: 你好,我是网络安全老宋。安全攻防干货准时送达!
网络安全老宋// 实战 · 渗透测试
// 实战 · 渗透测试
渗透测试从业者的实战课:SQL注入到Getshell 现在还能这么打
一条注入点,从读到数据到执行命令,中间隔着好几道卡。
SQL注入Getshell免杀绕过
目录 · Table of Contents
01从注入到 shell,到底有几条路
02为什么现在这条路越来越窄
03拦得住文件,拦不住脑子:绕过的三板斧
04防御视角:别玩猫鼠游戏,把规则改了
前几天刷到一篇实战笔记,作者拿到一个后台,翻功能点时发现”查看实验报告”接口有注入,sqlmap 一把梭之后,顺着 ThinkPHP 报错泄露的绝对路径,用 INTO OUTFILE把上传入口写进网站目录,结果木马刚传上去就被防火墙删了。他没放弃,转念把一句话木马做十六进制编码再写进去,绕过了实时查杀,最后拿到了 shell。
这篇文章写得挺实在,就是典型的”我踩了什么坑、怎么绕过去”的一线记录。但老宋看完想补几句:他走通的那条路,在今天的默认环境里其实越来越窄了。这篇就把”SQL 注入到 getshell”这件事摊开讲——有哪些路、哪些路已经被堵、哪些绕过思路真正还在用、站在防御侧又该怎么把门焊死。
01从注入到 shell,到底有几条路
先把链路捋清楚。一个 SQL 注入点,能不能变成服务器上的命令执行,中间隔着好几步,不是”有注入就有 shell”。最常见的落地路径有三条。
第一条,数据库直接写文件。就是原作者用的那招:SELECT ... INTO OUTFILE '网站目录/xxx.php',把一句话木马当成文件内容写进 Web 目录,然后浏览器访问这个文件就能执行命令。这条路的杀伤力最大,因为一步到位,但它对条件要求也最苛刻:数据库用户得有 FILE 权限、Web 目录得对 MySQL 进程可写、网站得能解析你写进去的文件后缀。
第二条,借日志或临时文件落地。有时候 OUTFILE 被禁,可以往 MySQL 的错误日志、慢查询日志路径写内容,或者利用 general_log 把 SQL 语句记录到指定文件,曲线救国。这条路更隐蔽,但同样依赖文件权限和路径可控。
第三条,注入配合文件上传或文件包含。纯注入写不进去,就先注入拿到后台权限、读到配置文件里的上传密钥,再用文件上传漏洞传马,或者用 php://filter、日志包含这类包含漏洞把内容当代码执行。原作者那个站点,本质就是”注入拿到后台 + 报错泄露路径 + 写文件”三件套。
无论哪条路,到头来都绕不开一句话:你最终要往磁盘上放一个能被 Web 容器解析、又能执行系统命令的文件。而今天的防御,恰恰是在这一环层层设卡。
02为什么现在这条路越来越窄
原作者能走通,很大程度是因为他碰到的那台 MySQL 配置不够硬。我们得承认一个事实:十年前 INTO OUTFILE 写马是入门级操作,今天默认环境里它基本失效了。
关键变量是 secure_file_priv。这个参数专门管”MySQL 能不能通过 SQL 往文件系统读写”。它的默认值这些年一直在变:5.6 及更早默认是 NULL,意味着文件读写功能整个关掉;5.7 早期有过一段默认空字符串的”宽松期”,那段时间写马最舒服;到了 5.7.6 之后改成平台相关的固定目录(Linux 上多是 /var/lib/mysql-files),8.0 又回到了 NULL。换句话说,你现在遇到的 MySQL 如果是 8.0 默认安装,光是 INTO OUTFILE 这一条就直接报权限错误,连文件都创建不了。
| | | | | — | — | — | | MySQL 版本 | secure_file_priv 默认 | 写马难度 | | 5.6 及更早 | NULL(禁用) | 几乎走不通 | | 5.7 早期 | 空字符串(任意目录) | 最舒服 | | 5.7.6+ | 固定目录 | 受限 | | 8.0 | NULL(禁用) | 几乎走不通 |
第二个卡点是 PHP 的危险函数。就算你写进去了 .php 文件,对方要是把 eval、system、exec、assert 这些函数用 disable_functions 禁了,你的一句马也起不来。再往上还有 open_basedir 把你能碰的目录锁死。
第三个卡点是云 WAF 加主机 EDR。原作者遇到的”木马传上去秒删”,就是这一层在起作用。现在的云 WAF 不只拦请求特征,主机侧的 EDR 还会扫磁盘上的文件内容,匹配 eval($_POST、<%@ 这类 webshell 特征码。你传得再快,落到盘上那一刻就可能被查杀。
💡 现实是:注入漏洞依然到处都是,但”注入即拿 shell”的黄金时代已经过去了。OWASP Top 10 2025 把 Injection 降到第 5,可报告里同时写了句狠话——它覆盖了 100% 的被测应用,是关联 CVE 最多的类别。Cobalt 的 2025 实测更直白:SQL 注入单独占全部渗透发现的 10.6%,加上 XSS 合计 29%。漏洞没少,只是从”一打一个准”变成了”打到了还得跟防御磨”。
03拦得住文件,拦不住脑子:绕过的三板斧
说完变难,再说说还在用的绕过思路。原作者那个十六进制编码,其实是入门级的一板斧,真正在红队圈里流转的,是下面这三招。
| | | | | — | — | — | | 🔡 编码变形 Base64 / ROT13 / 十六进制编码,运行时再解码执行,躲开静态特征。 | 🐴 小马拉大马 先传无害”写入器”,再远程发数据现造真马,两阶段落地。 | 🧠 内存马 不落盘,注入 Web 容器内存,传统文件扫描彻底失效。 |
第一板斧,编码变形。把 webshell 源码做一次 Base64、ROT13 或者十六进制编码,落盘的文件里看不到 eval、system 这些明文特征,EDR 的静态扫描就匹配不上,等访问时用 eval(base64_decode(...)) 在内存里还原执行。原作者用的就是十六进制版本——他把 <?php @eval($_POST['1']);?> 转成 0x3C3F... 写进去,盘上是乱码,运行起来才是真马。再进阶一点,把函数名拆成字符串拼接:$a='ev'.'al'; $a(...),连 eval 这个单词都不出现。
第二板斧,小马拉大马,也叫两阶段落地。这一招专门对付”文件内容扫描”。你直接传一个功能完整的马,特征太明显;那就先传一个”无害写入器”——它就干一件事,接收 POST 数据然后写文件,里面没有 eval、没有 system,静态扫描基本放行。等它安稳落盘,你再向这个写入器发一个请求,把真正的马作为数据传过去,让它在服务器上现造一个 real_shell.php。原作者的”先写上传入口、再传木马”其实就是这个思路的雏形。
第三板斧,内存马,直接不落盘。这是近几年最让蓝队头疼的。传统 webshell 再怎么编码,终究是个文件,扫磁盘就能发现;内存马反过来,它根本不写文件,而是把恶意类注入到正在运行的 Web 容器内存里——Tomcat 的 Filter 链、Spring 的 Controller 映射、.NET 的 IIS 应用池,动态注册一个能处理特定请求路径的恶意组件。盘上干干净净,重启前都在内存里活着,著名的”哥斯拉”管理工具对这类手法已经支持得很成熟。防御侧要抓它,只能靠主机层的运行时行为监控,传统文件扫描彻底失效。
💡 想清楚一件事:这些绕过不是”技术多高深”,而是攻防双方在时间线上赛跑。你编码、他加规则;你内存马、他上运行时检测。原作者的笔记里最值得学的,不是某个具体 payload,而是那个”传上去被删了,换个写法再试”的韧性——实战里八成时间花在跟拦截较劲,而不是在找那个注入点。
04防御视角:别玩猫鼠游戏
讲了这么多打法,老宋得站在甲方这边说句实在话。不少甲方安全同学看完这类文章会紧张:”是不是得把 WAF 规则库天天更新?”真不是。和攻击者玩特征猫鼠游戏,你永远慢半拍。真正性价比高的,是把几件根本性的事做掉。
第一件,把数据库和 Web 彻底隔开。secure_file_priv 设成 NULL 或严格目录、数据库账号收回 FILE 权限、Web 应用连库用的账号只给它需要的那几张表。原作者能写文件,前提是数据库用户权限过大——这条从根上掐断,比任何 WAF 都管用。
第二件,上传与执行分离。用户上传的文件,存到 Web 根目录之外,或者一个没有脚本执行权限的独立域名(静态资源 CDN 那种)。文件重命名用随机串、后缀走白名单。一句话木马传上来,也被当成图片存着,永远没有机会被解析执行。
第三件,错误信息别往外吐。原作者能拿到绝对路径,靠的就是 ThinkPHP 报错页把路径打印出来了。生产环境关掉详细报错、用统一错误页,这一条拦掉的不是一个人,是一类攻击。
第四件,上运行时监控兜底。前面三件都做了,依然要假设有人绕过。这时候主机层的进程行为监控、Web 容器的异常类加载告警,才是最后一道能抓到内存马的网。文件扫描抓不到的,行为特征能抓到。
把这几件做了,你会发现”SQL 注入到 getshell”的难度会陡然上升,攻击者得付出多倍成本才可能落地,而你的投入是一次性的架构调整。
// 老宋说:这件事的技术本质,是注入只是入口,落点才是目的——能不能从”读到数据”走到”执行命令”,中间的每一道卡(文件权限、危险函数、查杀、运行时)都在逼攻击者换打法,而防守方最划算的动作永远是改规则而不是追特征。行业观察上,我反而觉得注入不会消失,AI 每天替人类生成上亿行代码,其中不少连参数化查询都没用对,OWASP 的那句”覆盖 100% 被测应用”短期内改不了,可渗透从”一把梭”变成”磨半天”,说明防守的整体水位在抬。给读者的建议很具体:如果你是做攻防的,下次拿到注入点先别急着 sqlmap –os-shell,先探 secure_file_priv 和 disable_functions,省下的是半天瞎折腾;如果你是甲方,今天就去查一下你们数据库那个参数到底是 NULL 还是空串。
来聊一聊
你属于哪类?留言告诉我:
A. 实战里打通过注入拿 shell
B. 只验证过注入读数据,没往下走
C. 甲方,正愁怎么防这一类
D. 内存马 / 免杀这块想多了解
E. 其他(说说你的经历)
觉得有用,点个在看,转发给你身边做安全的朋友。
网络安全老宋 · 转载请注明出处
防御,不是在演练期间发现攻击,而是在演练开始前就把攻击面收敛到最小。
end
不想错过文章内容?读完请点一下“在看”,加个“关注”,您的支持是我创作的动力
期待您的一键三连支持(点赞、在看、分享~)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:网络安全老宋 宝十八 宝十八《渗透测试从业者的实战课:SQL注入到Getshell》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论