BUUCTF:[XDCTF 2015]filemanager

题目地址:https://buuoj.cn/challenges#[XDCTF%202015]filemanager
BUUCTF:[XDCTF 2015]filemanager_第1张图片
首先网站目录下/www.tar.gz是隐藏源码文件

xdctf.sql:数据库表结构
BUUCTF:[XDCTF 2015]filemanager_第2张图片
common.inc.php对所有传入的参数进行了addslashes()转义
BUUCTF:[XDCTF 2015]filemanager_第3张图片
upload.php上传的文件名经过:

$file[‘name’] -> pathinfo()> $path_parts["filename"] -> addslashes() -> insert

经过了addslashes()过滤,这里也不太可能存在注入,且允许上传类型是白名单,导致无法上传恶意文件
BUUCTF:[XDCTF 2015]filemanager_第4张图片
rename.php中首先filename=$req['oldname']是从数据库查询输入的oldname是否在于filename字段,然后进行update修改。
oldname={$result['filename']}将之前从数据库中查询出的filename更新到oldname当中,再次入库造成二次注入
BUUCTF:[XDCTF 2015]filemanager_第5张图片
upload.php当中可以看到oldnamefilename拼接的后缀查出的结果都是相同的,oldname是上传的文件名存入数据库,newname是用户输入的,都是可控的。那么关键点在于可以控制上传文件名导致后缀为空,然后通过update修改文件名为恶意文件类型Getshell。

另外当修改文件名的时候检查了文件是否存在,但是我们通过注入修改filename的值,实际上upload目录下的文件名是没有修改的。因为我利用注入将extension改为空了,那么实际上数据库中的filename总比文件系统中真是的文件名少一个后缀。

绕过file_exists()只需要再次上传一个与数据库当中filename的值相同的文件名即可

  1. 首先上传一个文件名为:',extension='',filename='shell.jpg.jpg的文件
    BUUCTF:[XDCTF 2015]filemanager_第6张图片
  2. 修改其文件名为:shell.jpg
    BUUCTF:[XDCTF 2015]filemanager_第7张图片
  3. 上传一个webshell文件名为:shell.jpg
    BUUCTF:[XDCTF 2015]filemanager_第8张图片
  4. 重命命名shell.jpg为:shell.php
    BUUCTF:[XDCTF 2015]filemanager_第9张图片
  5. 使用shell获取flag
    BUUCTF:[XDCTF 2015]filemanager_第10张图片

你可能感兴趣的:(CTF_WEB_Writeup,XDCTF,2015,filemanager,BuuCTF)