这个是在wooyun中发现的一篇奇葩的上传…算是长知识了…

环境配置:Winserver08+IIS7.5+php(IIs7以上就可以直接安装个phpmanager来配置php环境了.)
两个文件upload.html和upload_deal.php
upload.html:

1
2
3
4
5
6
7
8
9
<html>
<body>
<form method="post" action="upload_deal.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>

upload_deal.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
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)); // null
if(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/'.$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));
}
?>

首先上传一个普通的php文件.
发现失败.说明这个php处理上传机制没有问题.
接下来就是黑科技了,利用系统特性…

这段文字的含义是php+windows下可以进行一下替代:
双引号(“>”) <==> 点号(“.”)’;

大于符号(“>”) <==> 问号(“?”)’;

小于符号(“<”) <==> 星号(““)’;
然而我们却无法知道上传文件的路径,也无法进行直接覆盖.
所以我们的思路是上传一个文件上去.(废话,能上传还要特性干嘛..)
0x01
又是涨了一发知识,可以用到截断原理,以前只知道有一个”%00”截断,现在知道了还有冒号截断,例如”xxx.php:jpg”


但是这样创建的文件是空文件,没事这时候就要利用系统特性了.

根据上面的特性所说:
“<”可以替代”
“,而”*”可以替代任何文件.所以我上传的文件直接是”xxx.<<<”

成功上传.

0x02
这个是另外一个黑科技…这是摘自MSDN上的一段话.

上传一个类似”xxx.php::$DATA”的文件.

上传成功.

总而言之收获两个黑科技…