[XDCTF 2015]filemanager

在这里插入图片描述www.tar.gz下载到源码。
结构
在这里插入图片描述
数据库结构
在这里插入图片描述

审计后发现有很多对数据库的操作,猜测存在注入。
文件名采取白名单对后缀名过滤,不能直接上传php文件,upload.php里面对文件名进行了addslashes转义,不存在直接注入。
在这里插入图片描述
commom.inc.php中对所有请求参数也进行了转义
在这里插入图片描述
看到rename.php

<?php
/**
 * Created by PhpStorm.
 * User: phithon
 * Date: 15/10/14
 * Time: 下午9:39
 */

require_once "common.inc.php";

if (isset($req['oldname']) && isset($req['newname'])) {
	$result = $db->query("select * from `file` where `filename`='{$req['oldname']}'");
	if ($result->num_rows > 0) {
		$result = $result->fetch_assoc();
	} else {
		exit("old file doesn't exists!");
	}

	if ($result) {

		$req['newname'] = basename($req['newname']);
		$re = $db->query("update `file` set `filename`='{$req['newname']}', `oldname`='{$result['filename']}' where `fid`={$result['fid']}");
		if (!$re) {
			print_r($db->error);
			exit;
		}
		$oldname = UPLOAD_DIR . $result["filename"] . $result["extension"];
		$newname = UPLOAD_DIR . $req["newname"] . $result["extension"];
		if (file_exists($oldname)) {
			rename($oldname, $newname);
		}
		$url = "/" . $newname;
		echo "Your file is rename, url:
                <a href=\"{$url}\" target='_blank'>{$url}</a><br/>
                <a href=\"/\">go back</a>";
	}
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>file manage</title>
    <base href="/">
    <meta charset="utf-8" />
</head>
<h3>Rename</h3>
<body>
<form method="post">
    <p>
        <span>old filename(exclude extension)</span>
        <input type="text" name="oldname">
    </p>
    <p>
        <span>new filename(exclude extension)</span>
        <input type="text" name="newname">
    </p>
    <p>
        <input type="submit" value="rename">
    </p>
</form>
</body>
</html>

修改文件名界面时无法包含后缀的,也就是说我们只能修改文件名,不能修改后缀名。
所以我们要把extension置空。
直接从结果来分析
我们传入文件名',extension='.jpg
这时候,存入数据库的filename是',extension=',extension是jpg
我们在rename界面修改文件名
在这里插入图片描述
看到这里
在这里插入图片描述
前面说到在commom.inc.php会对文件名进行转义,会变成\',extension=\',
数据库存入数据是不存在转义符号的
在这里插入图片描述
在这里插入图片描述
能够查询到。
但数据库在取出数据时是不会自动添加转义符号的
其实这就是二次注入的原理,就当是复习一下。
之后看到这句
在这里插入图片描述

会变成

update `file` set `filename`='{$req['newname']}', `oldname`= '',extension='' where `fid`={$result['fid']}

这时候,extension变为空。
在这里插入图片描述
这样在这里修改时,$result['extension']值为空。$req['filename']=shell.jpg,更改后的文件在文件系统里是shell.jpg.jpg。
也就是说此时数据库里的数据和实际文件系统里的数据是不匹配的,数据库里面少了后缀名。
在这里插入图片描述
之后我们在上传一个写入木马的shell.jpg
在这里插入图片描述
这时,文件系统里面会有两个文件,我们刚上传的shell.jpg和我们之前传的被改过名字的shell.jpg.jpg。
但我们经过前面的二次注入已经在数据库插入了filename=shell.jpg extension=’'的数据,所以在rename界面修改文件名时可以通过前面的检测从而直接带后缀名修改文件名
在这里插入图片描述
在这里插入图片描述
可以看到,成功传入shell.php。
在这里插入图片描述
成功rce
在这里插入图片描述
可以看到目录里存在shell.jpg.jpg。
最后
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值