0x01 前言

介绍php中常用的文件上传函数。

学习完本章以后,代码审计的时候,查找这些函数。

查看后缀+内容是否可控,即可知道是否有漏洞了 : )
借鉴某个师傅的文章,写的很好

0x02 相关函数

(1)move_uploaded_file

  1. # 测试例子
  2. # move_uploaded_file 函数一般配合 $_FILES
  3. <?php
  4. // $_FILES['file']["name"];//上传文件的文件名
  5. // $_FILES['file']["type"];//上传文件的类型
  6. // $_FILES['file']["size"];//上传文件的大小
  7. // $_FILES['file']["tmp_name"];//上传文件的临时存放路径
  8. var_dump($_FILES['file']);
  9. $file_name = $_FILES['file']['name'];
  10. if (move_uploaded_file($_FILES['file']['tmp_name'],$file_name)) {
  11. echo '上传成功';
  12. } else {
  13. echo '上传失败' . $_FILES['upfile']['error'];
  14. }

image.png

在实战中,查看 move_uploaded_file 函数 的第二个参数,是否可控制后缀即可。

也就是,查看例子中的 $file_name 变量是否我们可以控制最后生成的后缀,可以的话就很容易造成危害了。

(2)copy

  1. # 测试例子
  2. <?php
  3. copy($_GET['url'], $_GET['name']);

值得一提的是, copy 函数 第一个参数可以是远程的url,也可以是本地文件。
所以当第一个参数可控制时,我们可以得到一个任意文件读取漏洞

当第二个参数可控制时,我们可以通过其他一些方法的整合来进行getshell
例如说:
我们现在可以控制 copy 函数,第二个参数,控制它生成的后缀是啥,但是第一个参数规定死了,只能是本地文件。
那么此时,你就可以考虑使用系统正常的文件上传功能,上传一张图片,图片里面写木马。
然后 copy 函数 第一个参数设置为那张带有木马的图片
copy 函数 第二个参数则设置为 后缀为 .php 的文件

image.png

image.png

这里我看了一下,我之前挖的源码里面,只有使用 copy 函数 导致任意文件读取的例子,也就是说,一般情况下,我们能控制的点都是 copy 函数 的第一个参数

(3)file_put_contents

  1. <?php
  2. $file_name = $_POST['file_name'];
  3. $file_content = $_POST['file_content'];
  4. file_put_contents($file_name, $file_content);
  5. ?>

这个函数就很经常见了,一般审核的时候会出现在 文件上传点,写配置文件,写缓存文件 中出现

file_put_contents 函数 的第一个参数控制时,你可以生成任意后缀的文件

file_put_contents 函数 的第二个参数可控制时,你可以控制当前打开文件的写入内容

image.png

(4)fopen+fwrite

  1. <?php
  2. $file_name = $_POST['file_name'];
  3. $file_content = $_POST['file_content'];
  4. $file = fopen($file_name,"w");
  5. echo fwrite($file, $file_content);
  6. fclose($file);
  7. ?>

fopen 函数 可控制时,你可以生成任意后缀的文件
fwrite 函数 的第二个参数可控制时,你可以控制当前打开文件的写入内容
所以说,在审计的时候看到这两个函数,你可以看看 这两个函数是否 可控内容与后缀
可控制的话,就会有漏洞了 : )

image.png

0x03 总结

想要挖这种文件上传的漏洞,一般就是跟着 危险函数 走一遍

  1. 查看后缀与内容是否可外部控制
  2. 如果可以外部控制是否有过滤
  3. 有过滤是否可以绕过
  4. 脚本层面绕不过是否可以利用一些软件的漏洞来绕过 例如: PHP低版本00截断,nginx解析漏洞,apache解析漏洞,iis6.0解析漏洞 来进行绕过