php上传突破,php遇上iis之上传突破

环境: php+window+iis

局限: 文件上传黑名单机制,略显鸡肋

//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)); // 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/'.$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));

}

?>

对于上述代码,虽然是通过黑名单进行文件名检测,但通过目前已知的上传方法,是没有办法成功上传php文件的(不考虑程序的Bug),因此可以说这段文件上传的代码是”安全”的,

这几行英文的意思大致是,在php+window+iis环境下:

双引号(“>”) <==> 点号(“.”)’;

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

小于符号(“ 星号(“*”)’;

有这么好玩的东西,那不就可以做太多的事了?但事实并不是这样,通过一系列的测试发现,该特性只能用于文件上传时覆盖已知的文件,于是这个特性便略显鸡肋..

原因有二:

1)上传文件的目录一般我们都不可控;

2)同时,一般文件上传的目录不可能存在我们想要的任何php文件,因此没办法覆盖;

后来,经过反反复复的思考,终于找到了可以完美利用的办法..

思路如下:

首先我们先利用特殊办法生成一个php文件,然后再利用这个特性将文件覆盖..

可问题又来了,怎样生成php文件呢?如果可以直接生成php文件的话,干嘛还要利用那什么特性?

别急,办法总是有的..

我们都知道在文件上传时,我们往往会考虑到文件名截断,如%00 等..

对!有的人可能还会用冒号(“:”)去截断,如:bypass.php:jpg

但是你知道吗?冒号截断产生的文件是空白的,里面并不会有任何的内容,呵呵 说到这里 明白了没有? 虽然生成的php文件里面没有内容,但是php文件总生成了吧,所以 我们可以结合上面所说的特性完美成功利用..

冒号+特性成功利用

按照上面提供的思路,实现..

本地测试地址:http://**.**.**.**/upfile.php 环境:Windows+IIS7.5

1)首先利用冒号生成我们将要覆盖的php文件,这里为:bypass.php,如图

L3Byb3h5L2h0dHAvN3hybWwzLmNvbTEuejAuZ2xiLmNsb3VkZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzAxLzA4MTA1MjM1MjU2YjE4MDBhYTg3MThjZTM4NTM4OGI1MzYxY2I3YjMuanBn.jpg

点击forward后,可以看见成功生成空白的bypass.php文件

L3Byb3h5L2h0dHAvN3hybWwzLmNvbTEuejAuZ2xiLmNsb3VkZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzAxLzA4MTA1NDE5ZjAxYjQyYWU3OTJjODhiYjE2NjRlYjQ0NjY1OWZjYmEuanBn.jpg

2)利用上面的系统特性覆盖该文件

从上面已经知道“

我们可以这样修改上传的文件名,如下:

------WebKitFormBoundaryaaRARrn2LBvpvcwK

Content-Disposition: form-data; name="file"; filename="bypass.<<

Content-Type: image/jpeg

//注意!文件名为:bypass.<<<

点击go..,即可成功覆盖bypass.php文件,如图

L3Byb3h5L2h0dHAvN3hybWwzLmNvbTEuejAuZ2xiLmNsb3VkZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzAxLzA4MTA1OTM5NzJmMGUxZmE4MGUwYWY3MTYxYjE0YTczYzE5Y2YwMjYuanBn.jpg

对比上面的两个图,bypass.php被我们成功的写入了内容..

L3Byb3h5L2h0dHAvN3hybWwzLmNvbTEuejAuZ2xiLmNsb3VkZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzAxLzA4MTEwMTQxNzhmMDdkOTRiNjgyMDAzZGIwNzhmYjA4NjFmMWJkMzMuanBn.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值