0x01 前言
介绍php中常用的文件上传函数。
学习完本章以后,代码审计的时候,查找这些函数。
查看后缀+内容是否可控,即可知道是否有漏洞了 : )
0x02 相关函数
move_uploaded_file
# 测试例子# move_uploaded_file 函数一般配合 $_FILES<?php// $_FILES['file']["name"];//上传文件的文件名// $_FILES['file']["type"];//上传文件的类型// $_FILES['file']["size"];//上传文件的大小// $_FILES['file']["tmp_name"];//上传文件的临时存放路径var_dump($_FILES['file']);$file_name = $_FILES['file']['name'];if (move_uploaded_file($_FILES['file']['tmp_name'],$file_name)) {echo '上传成功';} else {echo '上传失败' . $_FILES['upfile']['error'];}

在实战中,查看 move_uploaded_file 函数 的第二个参数,是否可控制后缀即可。
也就是,查看例子中的 $file_name 变量是否我们可以控制最后生成的后缀,可以的话就很容易造成危害了。
copy
# 测试例子<?phpcopy($_GET['url'], $_GET['name']);
值得一提的是, copy 函数 第一个参数可以是远程的url,也可以是本地文件。
所以当第一个参数可控制时,我们可以得到一个任意文件读取漏洞
当第二个参数可控制时,我们可以通过其他一些方法的整合来进行getshell
例如说:
我们现在可以控制 copy 函数,第二个参数,控制它生成的后缀是啥,但是第一个参数规定死了,只能是本地文件。
那么此时,你就可以考虑使用系统正常的文件上传功能,上传一张图片,图片里面写木马。
然后 copy 函数 第一个参数设置为那张带有木马的图片copy 函数 第二个参数则设置为 后缀为 .php 的文件


这里我看了一下,我之前挖的源码里面,只有使用 copy 函数 导致任意文件读取的例子,也就是说,一般情况下,我们能控制的点都是 copy 函数 的第一个参数
实战例子-新版74cms v4.2.126-任意文件读取漏洞 https://www.yuque.com/pmiaowu/bfgkkh/dr895b
file_put_contents
<?php$file_name = $_POST['file_name'];$file_content = $_POST['file_content'];file_put_contents($file_name, $file_content);?>
这个函数就很经常见了,一般审核的时候会出现在 文件上传点,写配置文件,写缓存文件 中出现
当 file_put_contents 函数 的第一个参数控制时,你可以生成任意后缀的文件
当 file_put_contents 函数 的第二个参数可控制时,你可以控制当前打开文件的写入内容

实战例子-eyoucms1.0前台getshell分析: https://www.yuque.com/pmiaowu/bfgkkh/kbh8mh
实战例子-新版74cms v4.2.1-v4.2.129-后台getshell漏洞:https://www.yuque.com/pmiaowu/bfgkkh/wecilm
可以看看这个
fopen+fwrite
<?php$file_name = $_POST['file_name'];$file_content = $_POST['file_content'];$file = fopen($file_name,"w");echo fwrite($file, $file_content);fclose($file);?>
当 fopen 函数 可控制时,你可以生成任意后缀的文件
当 fwrite 函数 的第二个参数可控制时,你可以控制当前打开文件的写入内容
所以说,在审计的时候看到这两个函数,你可以看看 这两个函数是否 可控内容与后缀
可控制的话,就会有漏洞了 : )

0x03 总结
想要挖这种文件上传的漏洞,一般就是跟着 危险函数 走一遍
- 查看后缀与内容是否可外部控制
- 如果可以外部控制是否有过滤
- 有过滤是否可以绕过
- 脚本层面绕不过是否可以利用一些软件的漏洞来绕过 例如: PHP低版本00截断,nginx解析漏洞,apache解析漏洞,iis6.0解析漏洞 来进行绕过
