第82天:代码审计-PHP项目&MVC 文件安全&上传&包含&下载&删除&读取等

目录

案例一:CNVD&1DAY-删除&读取&写入-梦想CMS

任意文件删除

任意文件读取

任意文件写入

​案例二: 文件安全-文件下载-功能点定位-earmusic

案例三:文件安全-文件删除-关键字搜索-zzzcms


案例一:CNVD&1DAY-删除&读取&写入-梦想CMS

任意文件删除

cnvd地址:https://www.cnvd.org.cn/flaw/show/CNVD-2020-59469

这两个文件符合标准,但是backdb看起来跟符合删除文件的特征,unlink是删除文件的函数

删除文件的函数,删除的是/file/back下的文件

查看delOne函数的引用

先在/file/back下创建一个文件

触发

因为是admin.php下触发的所以需要先登录

执行

配合重装漏洞

删除该文件

执行效果

再访问install

任意文件读取

cnvd地址: https://www.cnvd.org.cn/flaw/show/CNVD-2020-51412

php文件读取函数

在PHP中,你可以使用多种函数来读取文件。以下是其中一些常用的:

  1. file_get_contents():这是一个简单的函数,可以一次性将整个文件读取为一个字符串。

    $content = file_get_contents('filename.txt');
  2. fopen() 和 fread():使用这对函数,你可以手动打开文件句柄,然后逐块读取文件内容。

    $file = fopen('filename.txt', 'r');
    $content = fread($file, filesize('filename.txt'));
    fclose($file);
  3. fgets():这个函数逐行读取文件内容。

    $file = fopen('filename.txt', 'r');
    while (!feof($file)) {
        echo fgets($file) . "<br>";
    }
    fclose($file);
  4. file():这个函数将文件的每一行读取为一个数组元素。

    $lines = file('filename.txt');
    foreach ($lines as $line) {
        echo $line . "<br>";
    }
  5. readfile():这个函数直接将文件内容输出到输出缓冲区。

    readfile('filename.txt');

根据file_get_contents查找

发现变量由getcon函数引入,需要查找谁引入了这个函数

查找的结果

执行文件查看文件路径

自己在目录下创建一个文件去尝试读取

这里有很多文件但是都已经转成了html

尝试让他目录穿越去读取数据库配置文件

任意文件写入

在同一个文件里面,有类似文件写入的代码

查找函数定义

file_put_contents()用法

file_put_contents() 函数用于将数据写入文件。它会将一个字符串写入指定的文件。如果文件不存在,该函数会尝试创建文件。如果文件已经存在,它将被覆盖(除非你使用了 FILE_APPEND 标志来追加内容)。

这个函数的基本语法如下:

file_put_contents(filename, data, mode, context);
  • filename:要写入数据的文件路径。
  • data:要写入文件的数据,可以是字符串、数组或者流。
  • mode:可选参数,指定打开文件的模式,默认是 0,表示没有附加操作。可以使用 FILE_APPEND 标志来追加内容到文件末尾。
  • context:可选参数,用于指定流的上下文。

示例:

$data = "Hello, world!";
file_put_contents('example.txt', $data);

上面的代码将字符串 "Hello, world!" 写入名为 example.txt 的文件中。如果文件不存在,则创建该文件并写入内容;如果文件已存在,则覆盖文件内容。

如果要将内容追加到文件末尾,可以使用 FILE_APPEND 标志:

$data = "Hello, world!";
file_put_contents('example.txt', $data, FILE_APPEND);

这样,内容将被追加到文件末尾,而不会覆盖原有内容。

 分析怎样触发

执行效果

案例二: 文件安全-文件下载-功能点定位-earmusic

文件下载不像别的漏洞一样有具体的关键字函数去搜索,需要根据功能点去判断

下载的时候抓包分析,发现下载的地址

http://192.168.172.181/music/template/default/source/audio.php?id=1

去文件当中分析代码

safeRequest函数定义了请求方式,传入get就是get请求

 往下翻可以明确看到下载文件的代码

其中file变量第一次出现,里面有个geturl函数,查看该函数定义

该函数用来构造url地址,$_SERVER['HTTP_HOST']是当前网站地址,是audio.php传入进来的所以和下载的文件和audio.php在同一目录下

$row变量

因为下载是由in_audio变量控制的现在需要去寻找这个变量的位置

去访问这个地址

这里不太理解为啥访问的不是add.php

先寻找变量的位置

在输入3的位置

在同一级目录下创建一个文件

添加

下载

 读取数据库配置文件

会发现数据被过滤了

数据库中也过滤了

抓包看保存的时候交给了谁进行处理

http://192.168.172.181/music/source/user/music/ajax.php?ac=edit&id=4&name=123&classid=1&audio=Safety+filter&specialid=0&singerid=0&tag=2&cover=2&lyric=2&text=332

然后去查看数据做过哪些处理

unescape

 checkrename

这行代码是使用 PHP 中的 preg_match() 函数来检查 $file 变量中是否包含特定的字符串模式。让我们分解一下:

  1. /(\.\/|\?iframe=|.php\?)/i 是一个正则表达式模式,它用来匹配包含以下内容之一的字符串:

    • \.\/:表示 ./,即文件路径中的当前目录。
    • \?iframe=:表示 ?iframe=,即查询字符串中包含 iframe=
    • \.php\?:表示 .php?,即文件路径中包含 .php 且其后跟着 ? 的情况。
  2. preg_match() 函数是 PHP 中用来执行正则表达式匹配的函数。它接受两个参数:正则表达式模式和待匹配的字符串。在这里,待匹配的字符串是 $file 变量。

  3. ? : 是条件运算符,也称为三元运算符。它的作用是根据条件的真假选择不同的值。在这里,条件是 preg_match() 函数的返回值。如果匹配成功,返回值为真,否则为假。

所以整个行为的作用是:如果 $file 变量中包含指定的字符串模式中的任何一个,则将 $file 变量设为 'Safety filter',否则保持不变。这个代码片段看起来是为了对文件名或文件路径进行安全性过滤,以防止恶意输入。

这个时候读取需要写成绝对路径 ,这里不清楚为什么只能用左斜杠

下载完成

案例三:文件安全-文件删除-关键字搜索-zzzcms

直接搜索对应的函数unlink

查看该函数del_file

查看谁调用了该函数

查看谁调用了delfile()

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值