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。
最后