目录
案例二: 文件安全-文件下载-功能点定位-earmusic
案例一: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中,你可以使用多种函数来读取文件。以下是其中一些常用的:
file_get_contents():这是一个简单的函数,可以一次性将整个文件读取为一个字符串。
$content = file_get_contents('filename.txt');
fopen() 和 fread():使用这对函数,你可以手动打开文件句柄,然后逐块读取文件内容。
$file = fopen('filename.txt', 'r'); $content = fread($file, filesize('filename.txt')); fclose($file);
fgets():这个函数逐行读取文件内容。
$file = fopen('filename.txt', 'r'); while (!feof($file)) { echo fgets($file) . "<br>"; } fclose($file);
file():这个函数将文件的每一行读取为一个数组元素。
$lines = file('filename.txt'); foreach ($lines as $line) { echo $line . "<br>"; }
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
变量中是否包含特定的字符串模式。让我们分解一下:
/(\.\/|\?iframe=|.php\?)/i
是一个正则表达式模式,它用来匹配包含以下内容之一的字符串:
\.\/
:表示./
,即文件路径中的当前目录。\?iframe=
:表示?iframe=
,即查询字符串中包含iframe=
。\.php\?
:表示.php?
,即文件路径中包含.php
且其后跟着?
的情况。
preg_match()
函数是 PHP 中用来执行正则表达式匹配的函数。它接受两个参数:正则表达式模式和待匹配的字符串。在这里,待匹配的字符串是$file
变量。
? :
是条件运算符,也称为三元运算符。它的作用是根据条件的真假选择不同的值。在这里,条件是preg_match()
函数的返回值。如果匹配成功,返回值为真,否则为假。所以整个行为的作用是:如果
$file
变量中包含指定的字符串模式中的任何一个,则将$file
变量设为'Safety filter'
,否则保持不变。这个代码片段看起来是为了对文件名或文件路径进行安全性过滤,以防止恶意输入。
这个时候读取需要写成绝对路径 ,这里不清楚为什么只能用左斜杠
下载完成
案例三:文件安全-文件删除-关键字搜索-zzzcms
直接搜索对应的函数unlink
查看该函数del_file
查看谁调用了该函数
查看谁调用了delfile()