文件操作
最后更新于
文件操作相关关键参数用户可控 导致文件/目录 删除/移动/写入(上传)/读取等
攻击者常见用法
删除lock文件(解除重复程序安装保护等安全限制)
删除网站关键文件(导致网站拒绝服务 数据丢失)
收到POST表单->随机文件名写入临时目录->(执行PHP文件处理逻辑->移动临时文件到保存位置)->删除临时文件(如果临时文件没有被移动)
临时文件路径必须是php上传表单自动处理产生的 例如 $_FILES["pictures"]["tmp_name"]
"pictures"为表单中的name "tmp_name"为固定变量名(临时文件名)
Gynvael Coldwind 《PHP_LFI_rfc1867_temporary_files》 2011.3
**注:**只要PHP收到POST上传文件表单 哪怕php页面一行代码没有 都会将上传文件保存到临时目录 在请求结束后如果临时文件没有被移走就会被自动删除 从写入文件到删除文件有个短暂的窗口时间 可用于文件包含
注:ZipArchive扩展在windows平台 php版本>5.6时默认安装. linux及windows其他版本需要手动编译安装.
审计时重点查找 extractTo方法
判断解压目录是否在web目录下 是否检查压缩包内文件类型 如果不在web目录下也可以使用.. 进行目录穿越控制上传目录 到web目录下 或者在权限足够的情况下写入文件到系统关键目录 (自启动 定时任务 ssh公钥 覆盖shadow 等)
文件写入/上传
file_put_contents
将一个字符串写入文件
file_put_contents("1.txt","6666");
move_uploaded_file
将上传的临时文件移动到新的位置
move_uploaded_file($_FILES["pictures"]["tmp_name"],"1.php")
rename
重命名文件/目录
rename($oldname, $newname);
rmdir
删除目录
mkdir
创建目录
unlink
删除文件
copy
复制文件
copy($file, $newfile);
fopen/fputs/fwrite
打开文件或者 URL
link
创建文件硬链接
link($target, $link);
symlink
创建符号链接(软链接)
symlink($target, $link);
tmpfile
创建一个临时文件 (在临时目录存放 随机文件名 返回句柄)
$temp = tmpfile(); fwrite($temp, "123456"); fclose($temp);
request()->file()->move()
request()->file()->file()
$file = request()->file($name);
$file->move($filepath);
extractTo
解压zip 到目录
file_get_contents
读入文件返回字符串
echo file_get_contents("flag.txt"); echo file_get_contents("https://www.bilibili.com/");
readfile
读取一个文件,并写入到输出缓冲
同file_get_contents
fopen/fread/fgets/fgetss /fgetc/fgetcsv/fpassthru/fscanf
打开文件或者 URL 读取文件流
$file = fopen("test.txt","r"); echo fread($file,"1234"); fclose($file);
file
把整个文件读入一个数组中
echo implode('', file('https://www.bilibili.com/'));
highlight_file/show_source
语法高亮一个文件
highlight_file("1.php");
parse_ini_file
读取并解析一个ini配置文件
print_r(parse_ini_file('1.ini'));
simplexml_load_file
读取文件作为XML文档解析