本文记录 PHP 代码审计的学习过程,教程为暗月 2015 版的 PHP 代码审计课程
1. 简介
-
审计函数
move_uploaded_file()
定义和用法:
move_uploaded_file() 函数将上传的文件移动到新位置。
若成功,则返回 true,否则返回 false。语法:
move_uploaded_file(file,newloc) -
超全局变量 $_FILES
- 后缀名是图片格式
- 前缀名不能是外部提交的
- 上传的目录不可以是获取外部提交的路径
-
防御
- 使用白名单方式检测文件后缀
- 上传之后按时间能算法生成文件名称
- 上传目录脚本文件不可执行
- 注意 %00 截断
- Content-Type 验证
-
DVWA 中的源代码
<?php $file = $_GET['page']; //The page we wish to display // Only allow include.php if ( $file != "include.php" ) { echo "ERROR: File not found!"; exit; } ?>
DVWA 中防御方式是使用白名单机制
-
move_uploaded_file() 函数示例:
move_uploaded_file() 对安全模式和 open_basedir 都是敏感的。不过,限制只针对 destination 路径,因为允许移动上传的文件名 filename 可能会与这些限制产生冲突。move_uploaded_file() 仅作用于通过 PHP 上传的文件以确保这个操作的安全性。
<html> <body> <!--上传表单,有一个上传文件域--> <form method="post" action="" enctype="multipart/form-data" name="form"> <input type="file" name="up_file"> <!-- 提交按钮--> <input type="submit" name="submit" value="上传"> </form> </body> </html> <?php header("Content-Type:text/html; charset=utf-8"); if(!empty($_FILES['up_file']['name'])){ //判断是否有文件 $fileinfo = $_FILES['up_file']; //将文件信息赋给变量$fileinfo if($fileinfo['size']<1000000 && $fileinfo['size']>0){ //判断文件大小 move_uploaded_file($fileinfo['tmp_name'],$fileinfo['name']); //上传文件 echo "上传成功"; }else{ echo '文件太大或未知'; } } ?>
结果为
使用 move_uploaded_file()函数上传文件,在创建 form表单时,必须设置 form 表单的 enctype="multipart/form-data“。