环境:
Windows+nginx+php
一、php源码
<?php
//U-Mail demo ...
if(isset($_POST['submit'])){$filename = $_POST['filename'];$filename = preg_replace("/[^\w]/i", "", $filename);$upfile = $_FILES['file']['name'];$upfile = str_replace(';',"",$upfile);$upfile = preg_replace("/[^(\w|\:|\$|\.|\<|\>)]/i", "", $upfile);$tempfile = $_FILES['file']['tmp_name'];$ext = trim(get_extension($upfile)); // nullif(in_array($ext,array('php','php3','php5'))){die('Warning ! File type error..');}if($ext == 'asp' or $ext == 'asa' or $ext == 'cer' or $ext == 'cdx' or $ext == 'aspx' or $ext == 'htaccess') $ext = 'file';//$savefile = 'upload/'.$upfile;$savefile = 'upload/'.$filename.".".$ext;if(move_uploaded_file($tempfile,$savefile)){die('Success upload..path :'.$savefile);}else{die('Upload failed..');}
}
function get_extension($file){return strtolower(substr($file, strrpos($file, '.')+1));
}
?>
前端源码:
<html><body><form method="post" action="upfile.php" enctype="multipart/form-data"><input type="file" name="file" value=""/><input type="hidden" name="filename" value="file"/><input type="submit" name="submit" value="upload"/></form></body>
</html>
二、分析源码
三、那我先随便上传一个
无法上传:
在Windows+php+nginx下有特性:
双引号等于点
大于符号等于问号
小于符号等于星号
因为我们经常了解的%00截断,在Windows里面还有一个111.php:jpg上传的话从jpg处会截断但是我们的php文件为空,而我们可以利用上面所说的特性对其进行覆盖
理论形成实践开始
很明显上传上来了但是没有值
那我们就可以利用小于号代表星号,星号又代表所有,上传一个空白的php文件
顺利覆盖掉了