-续篇-一个Windows下的文件上传的小trick

本文接上一篇文章:一个Windows下的文件上传的小trick

蛋总看了我上一篇文章之后给我推了一个乌云漏洞:pkav之当php懈垢windows通用上传缺陷。

这个姿势其实早就被发现了,果然还是我太菜了。。这里别人还是利用这个姿势成功实现了上传php,同样是利用系统的特性,向大佬们低头把。

这里我就当一名搬运工了,搬运下大佬们的思路。

随手写了个示例,代码如下:

<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" name="submit" value="submit">
</form>

<?php
error_reporting(0);
if(isset($_POST['submit'])){
    $savefile = $_FILES['file']['name'];
    $savefile = preg_replace("/\.\.|\%/", "", $savefile);
    $tempfile = $_FILES['file']['tmp_name'];
    $savefile = preg_replace("/(php|phtml|php3|php4|php5|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2", $savefile);
    $savefile = 'upload/'.$savefile;
    if(move_uploaded_file($tempfile,$savefile)){
        die('Success upload path : '.$savefile);
    }else{
        die('Upload failed..');
    }
}
?>

看起来上没有那么容易绕过,我们来简单看看正则,简单说就是把你的文件名内的php字符串等前面加了一个下划线,当然这个php字符串的位置要么是结尾要么后面跟了一个.

根据上一篇文章的东西,我们用冒号上传:

得到了一个0字节的php文件。

但是根据pkav的文章,我们可以利用系统特性通过两种方式绕过上传php

特性一

我们知道,一般上传的时候遇到同名文件就会覆盖,而在在php+win的环境下的覆盖的时候,有如下的trick

双引号('"') == 点号('.');
小于符号('<') == 星号('*')';

而我们知道.*对于文件名都有着特殊的意义。.作为文件分隔符,而*作为通配符都很关键,所以有了这个点,我们可以这样

成功上传一句话。

这里用一个<和多个<效果是一样的,但是这里不能直接用*

特性二

PS:图片来自wooyun

所以可以这样绕过: