PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)

今天断断续续做了下 github 上面的一个文件上传实验,有些关卡是通杀的,感觉我的思路没顺着作者的本意走

 

项目源地址:https://github.com/c0ny1/upload-labs

 

贴下过关记录

 

Pass-01:

 

00截断

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第1张图片

 

 

Pass-02:

 

MIME 类型替换

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第2张图片

 

Pass-03:

 

其他后缀

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第3张图片

 

Pass-04:

 

上传 .htaccess 后上传图片格式 shell

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第4张图片

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第5张图片

 

 

Pass-05:

 

大写绕过黑名单

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第6张图片

Pass-06:

 

空格绕过黑名单

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第7张图片

 

Pass-07:

 

.后缀绕过黑名单

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第8张图片

 

Pass-08:

 

::$DATA 配合 Windows下绕过

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第9张图片

 

Pass-09:

 

Windows NTFS 数据流 trick 。

 

这里是知识盲区,发现网上也有不少人混淆了这里的概念,末尾单独讲吧

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第10张图片

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第11张图片

 

Pass-10:

 

双写绕过str_ireplace过滤

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第12张图片

 

Pass-11:

 

get请求控制目录名,%00截断

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第13张图片

 

Pass-12:

 

POST 参数控制目录名 00 截断

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第14张图片

 

13-16,18 没有来得及做,还要研究一下。

 

Pass-17:

 

竞争上传,开两个不断请求就可以。

 

一个负责访问上传的文件,另一个负责执行写 shell

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第15张图片

 

 

Pass-19:

 

这个做完才看到作者在 Readme 里说必须在Linux下才能绕过,为啥我在windows 下也成功了

 

可能这种做法是抖机灵吧

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第16张图片

 

Pass-20:

 

审计代码,最终 POST 数组进行 Bypass,利用了数组可更改下标,PHP 果然是世界上最好的语言!

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第17张图片

 

还有几个图片马的题目没有写,这里有一份上一个版本的 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文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第18张图片

 

便可以知道其原理。

 

另外利用 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

 

本文首发公众号: 不一定Rock , 转载请保留二维码或原文链接!

 

PHP文件上传 getshell 练习,upload_labs 过关笔记(持续更新)_第19张图片

 

你可能感兴趣的:(技术文章)