代码逻辑
文件上传的检测代码常规的有:黑名单、白名单、文件内容等检测方法,也有一种设计模式就是业务层会首先将文件上传到服务器,之后才会去判断文件的格式,如果通过检测则使用rename修改名称,如果不通过则使用UNlink删除文件,这种设计看似没有问题,但是可以通过条件竞争的方式在unlink之前访问webshell
条件竞争1
实例代码
以下代码来自upload-labs的Pass-18:
<?php
include '../config.php';
include '../head.php';
include '../menu.php';
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);