0x01 前言
介绍php中常用的文件上传函数。
学习完本章以后,代码审计的时候,查找这些函数。
查看后缀+内容是否可控,即可知道是否有漏洞了 : )
借鉴某个师傅的文章,写的很好
0x02 相关函数
(1)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
变量是否我们可以控制最后生成的后缀,可以的话就很容易造成危害了。
(2)copy
# 测试例子
<?php
copy($_GET['url'], $_GET['name']);
值得一提的是, copy 函数
第一个参数可以是远程的url,也可以是本地文件。
所以当第一个参数可控制时,我们可以得到一个任意文件读取漏洞
当第二个参数可控制时,我们可以通过其他一些方法的整合来进行getshell
例如说:
我们现在可以控制 copy 函数
,第二个参数,控制它生成的后缀是啥,但是第一个参数规定死了,只能是本地文件。
那么此时,你就可以考虑使用系统正常的文件上传功能,上传一张图片,图片里面写木马。
然后 copy 函数
第一个参数设置为那张带有木马的图片copy 函数
第二个参数则设置为 后缀为 .php
的文件
这里我看了一下,我之前挖的源码里面,只有使用 copy 函数
导致任意文件读取的例子,也就是说,一般情况下,我们能控制的点都是 copy 函数
的第一个参数
(3)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 函数
的第二个参数可控制时,你可以控制当前打开文件的写入内容
(4)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解析漏洞 来进行绕过