游客发表
凌晨两点,我盯着屏幕上的用工命令行输出,心跳漏了一拍。洞利目标站点的用工响应头里赫然写着 X-Powered-By: PHP/7.0.33,配合URL结构中的洞利 /index.php?s=/index/\think\app/invokefunction,基本可以断定——这就是用工ThinkPHP 5.0.24的经典RCE入口。
这个漏洞的洞利可怕之处不在于它有多隐蔽,而在于它太容易触发了。用工官方在5.0.23版本修复了路由解析的洞利过滤逻辑,但5.0.24又引入了新的用工参数覆盖问题。攻击者只需要构造一个特殊的洞利URL,就能直接调用任意类方法,用工甚至执行系统命令。洞利网上流传的用工利用工具五花八门,但多数是洞利半成品,要么报错一堆,要么干脆不兼容PHP7.0以上的环境。
我自己写过一个精简版工具,核心代码不到30行。原理很简单:通过 POST 请求向 /index.php?s=captcha 提交恶意payload,利用 _method 参数强制将请求转为 POST,再配合 filter[] 数组注入 assert 或 system 函数。实测下来,成功率在90%以上,前提是目标没有开启WAF。
有一次渗透测试,客户的内网系统用的是这个版本。我随手丢了个 whoami 命令,返回的是 www-data。接着尝试写一句话木马到web根目录,但发现目录权限被限制了。后来改用 file_put_contents 直接写缓存文件,绕过了限制。整个过程不到三分钟,从检测到拿到shell,快得让人后背发凉。
工具本身没什么技术含量,真正考验人的是对漏洞原理的理解。很多新手拿着网上下载的利用脚本,只会替换IP和端口,一旦目标路径不是标准的 public/index.php,脚本就歇菜了。我习惯在工具里加一个路径探测功能,先自动访问 /thinkphp/logo.png 判断框架是否安装,再尝试 /public/index.php 和 /index.php 两种入口,这样能适配大部分部署方式。
还有个容易被忽略的细节——PHP版本兼容性。5.0.24的漏洞利用依赖 filter 链,但在PHP 7.2以上版本,某些回调函数被禁用了。比如 assert 在PHP 7.2里还能用,到7.3就变成了语言结构,无法作为回调。很多工具在PHP7.4环境下一跑就报 Call to undefined function assert(),其实就是这个原因。我自己的工具里专门做了版本判断,低于7.2用 assert,高于7.2改用 call_user_func 配合 system,这样能覆盖更多目标。
写这个工具的过程,其实比工具本身更有价值。你得去读框架源码,理清路由分发流程,搞明白 Request::input() 里的参数覆盖逻辑。这些底层知识,远比单纯会用某个exp重要得多。有一次我在调试时发现,只要在payload里多加一个 data 参数,就能绕过某些主机商自带的mod_security规则,这种经验是任何现成工具都给不了你的。
最后说句实在话,这类工具在GitHub上一搜一大把,但真正能根据目标环境灵活调整的少之又少。与其到处找“最新版工具”,不如自己动手改几行代码,把URL编码、超时设置、代理支持这些细节优化好。安全测试的本质是理解系统,而不是依赖某个脚本。工具只是拐杖,走不走得稳,还得看你自己。
友情链接