php代码审计-文件安全(3)

CNVD-2020-27927

本篇文章是接着上一篇文章衍生出来的漏洞,并且是一个高危

image-20230723135337391

上篇说到,在lmxcms的c/admin/TemplateAction.class.php文件中存在文件读取漏洞,并且可以将读取的文件修改并提交

image-20230723140007493

image-20230723140042375

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public function editfile(){
$dir = $_GET['dir'];
//保存修改
if(isset($_POST['settemcontent'])){
if($this->config['template_edit']){
rewrite::js_back('系统设置禁止修改模板文件');
}
file::put($this->config['template'].$dir.'/'.$_POST['filename'],string::stripslashes($_POST['temcontent']));
addlog('修改模板文件'.$this->config['template'].$dir);
rewrite::succ('修改成功','?m=Template&a=opendir&dir='.$dir);
exit();
}
$pathinfo = pathinfo($dir);
//获取文件内容
$content = string::html_char(file::getcon($this->config['template'].$dir));
// echo $this->config['template'].$dir;
$this->smarty->assign('filename',$pathinfo['basename']);
$this->smarty->assign('temcontent',$content);
$this->smarty->assign('dir',dirname($_GET['dir']));
$this->smarty->display('Template/temedit.html');
}
1
file::put($this->config['template'].$dir.'/'.$_POST['filename'],string::stripslashes($_POST['temcontent']));

我们可以看到在这里有一个file::put

img

搜索一下put或者其他编辑器直接看一下声明,就能转到put函数

1
2
3
4
public static function put($path,$data){
if(file_put_contents($path,$data) === false)
rewrite::js_back('请检查【'.$path.'】是否有读写权限');
}

这段代码是一个 PHP 类中的公有静态方法,用于将字符串 $data 写入指定文件 $path 中。

具体来说,这个方法使用 file_put_contents() 函数将 $data 内容写入到 $path 指定的文件中,并返回写入的字节数。如果写入失败,则使用 rewrite::js_back() 方法返回一个 JavaScript 弹窗提示信息,内容为 ‘请检查【’.$path.’】是否有读写权限’。

file_put_contents

file_put_contents() 函数是 PHP 内置的一个文件操作函数,用于将字符串写入指定文件中。它的语法如下:

1
file_put_contents($filename, $data, $flags, $context);

其中,$filename 是要写入的文件名,可以是相对路径或绝对路径;

$data 是要写入到文件中的数据,可以是一个字符串、一个数组或者一个可迭代对象(例如 Iterator 或 Traversable);

$flags 是可选参数,用于指定写入方式和处理方法,例如在原有内容后面追加、锁定文件等;$context 是可选参数,用于传递上下文信息。

如果写入成功,则返回写入的字节数,否则返回 false。需要注意的是,在写入文件之前,必须确保该文件存在并且具有正确的写权限。如果文件不存在,则会尝试创建它。如果文件已经存在,并且没有设置覆盖标志,则会抛出一个 E_WARNING 错误。

需要特别注意的是,file_put_contents() 函数会一次性将所有数据写入到文件中,并在写入过程中锁定文件。因此,如果要写入的数据量比较大,建议考虑使用流式写入或其他更高级别的文件操作方式,以减小系统负载和避免内存占用过多问题。

editfile函数中

settemcontent要设置为真,进入if语句中,并且传递filename参数来确定文件名,temcontent来确定传递的文件内容

来组合一下

get:

http://127.0.0.1:8081/lmxcms1.4/admin.php?m=Template&a=editfile&dir=

post:

settemcontent=1&filename=test.php&temcontent=

我们这里的dir为空,那么按理来说应该会存放在template文件夹下面(上一篇已经说了$this->config[‘template’]的值),那么提交数据

现在这个文件夹下面没有文件,只有文件夹

img

img

img

发现这里出现了我们提交上去的文件

ok这个1day就审计到这里


php代码审计-文件安全(3)
https://zzhnohikari.github.io/2023/07/23/php代码审计-文件安全-3/
作者
John Doe
发布于
2023年7月23日
许可协议