今天断断续续做了下 github 上面的一个文件上传实验,有些关卡是通杀的,感觉我的思路没顺着作者的本意走
项目源地址:https://github.com/c0ny1/upload-labs
贴下过关记录
Pass-01:
00截断
Pass-02:
MIME 类型替换
Pass-03:
其他后缀
Pass-04:
上传 .htaccess 后上传图片格式 shell
Pass-05:
大写绕过黑名单
Pass-06:
空格绕过黑名单
Pass-07:
.后缀绕过黑名单
Pass-08:
::$DATA 配合 Windows下绕过
Pass-09:
Windows NTFS 数据流 trick 。
这里是知识盲区,发现网上也有不少人混淆了这里的概念,末尾单独讲吧
Pass-10:
双写绕过str_ireplace过滤
Pass-11:
get请求控制目录名,%00截断
Pass-12:
POST 参数控制目录名 00 截断
13-16,18 没有来得及做,还要研究一下。
Pass-17:
竞争上传,开两个不断请求就可以。
一个负责访问上传的文件,另一个负责执行写 shell
Pass-19:
这个做完才看到作者在 Readme 里说必须在Linux下才能绕过,为啥我在windows 下也成功了
可能这种做法是抖机灵吧
Pass-20:
审计代码,最终 POST 数组进行 Bypass,利用了数组可更改下标,PHP 果然是世界上最好的语言!
还有几个图片马的题目没有写,这里有一份上一个版本的 writeup,明天图片马关卡照着这个学习一下!
老版本的Writeup地址: https://github.com/LandGrey/upload-labs-writeup
接下来我们谈一下关卡9的很有意思的一个冷门知识点(反正我以前是没听过)
1 . 什么是 NTFS ?
NTFS 是微软Windows NT内核的系列操作系统支持的,是为了解决网络和磁盘配额,文件加密等安全特性所设计的磁盘格式,比FAT文件系统更加稳定,也更加安全。
NTFS-ADS,又称为 NTFS 交换数据流,是NTFS磁盘格式的一个特性。
在NTFS文件系统下,每个文件都可以存在多个数据流,也就是说,除了主文件流之外,还可以有很多非主文件流寄宿在主文件流中。虽然我们无法看到数据流文件,但是它是真实存在于我们系统之中的。
2 . ADS 与 文件上传
本题 payload :
shell.php:jpg
流类型以$开头,默认流类型为data,如上payload的完整形式其实是:
shell.php:jpg:$data
这个格式是创建一个与宿主文件关联的数据流文件。上传后会在目录下生成 shell.php 的空文件。
Why?
文件内容在数据流文件中,我们当初上传的就是一个[文件流]文件,它找不到自己的宿主文件,所以就创建了一个空文件。
我们再看看 MSDN 上的介绍:
便可以知道其原理。
另外利用 PHP 和 WINDOWS系统特性,以下符号在正则匹配时是相等的:
双引号" = 点号.
大于符号> = 问号?
小于符号< = 星号*
这道题就是这样,我们先传数据流文件关联一个空的宿主文件,这样系统就会生成一个空文件。
然后再次上传 shell.<<< ,即可覆盖空文件的内容。
下面是整理的一些文件流姿势:
文件名 | 服务器反应 | 生成的文件内容 |
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\aaa.jpg | 生成aaa.jpg |
另外利用 NTFS 的特性,还可以做到很多事情:
1.绕过黑名单验证上传
2.绕过IIS目录权限认证
3.系统隐藏文件(木马,webshell)
4.MySql UDF提权利用
5.更多值得探索
这里推荐2个参考地址自己去理解吧,看了下文章日期,原来是很老的知识点了:
http://www.myhack58.com/Article/60/61/2013/38285.htm
https://www.waitalone.cn/php-windows-upload.html