文件上传-NTFS文件流

[题目信息]:

题目名称题目难度
文件上传-NTFS文件流1

[题目考点]:

NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系
统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在
Windows中,此默认数据流称为:$ DATA。上传.php::$DATA绕过。(仅限windows)

[Flag格式]:

SangFor{2_LHZmrVlIN6uJHH0RTGh1JvQjFP2uyO}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

1、实验主页

2、对于上传点的测试思路

3、首先判断是服务端检测还是服务端检测

创建一个.xxx的任意文件;

上传.jpg后缀文件,并使用burp抓包;

通过回显,可以看出文件储存位置和文件名;

1、通过burp修改文件后缀为php,查看是否有上传检测;

通过回显结果可以看出存在后端验证,那接下来的绕过思路可以分为两步;

  1. 确认是白名单验证还是黑名单验证;
  2. 如果是黑名单验证确认服务器是windows系统还是linux系统;
  3. 如果是白名单,在后面题目再进一步分析;

2、上传任意文件后缀,判断是黑名单还是白名单检测;

黑名单验证;简单的理解,黑名单验证即不允许用户上传什么样的文件;白名单验证;即为只允许用户上传什么样的文件;

如果文件名为xxx.xxx的文件上传成功,则证明后端验证为黑名单检测,一般情况下,黑名单验证仅不允许如.php等文件后缀;

通过回显,可以判断,后端代码在检测文件后缀的同时,同时检测了文件头需符合图片内容标准;

修改文件头为GIF89a,动态GIF图片是一个以GIF89a开头格式存储的文件

xxx文件能够上传成功,则证明服务器后端验证属于黑名单格式;

3、验证服务器操作系统

当验证后端代码属于黑名单验证时,由于Windows和Linux文件系统有较大的差异,下一步需要测试服务器的操作系统是Windows还是Linux;

验证Windows操作系统还是Linux操作系统可以通过改变url地址的大小写加以区分,Windows操作系统大小写不敏感,Linxu操作系统大小写敏感;

我们将upload.php修改为Upload.php,可以成功访问,因此可以证明服务器操作系统为Windows;

现在已经验证:

  1. 服务器后端为黑名单验证;
  2. 服务器操作系统为Windows;

因此可以利用Windows操作系统NTFS文件系统特性:

NTFS(英语:New Technology File System),是Microsoft公司开发的专用文件系统,从Windows NT 3.1开始成为Windows NT家族的默认文件系统。

在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名

例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"

访问/upload.php,成功上传一句话木马;

查看文件源代码

摘要:NTFS是Microsoft公司开发的一种有着良好安全性和稳定性的高性能文件系统,NTFS的文件或文件夹中附加多个额外的数据流,但是其访问一直没有很好的解决办法,本文使用VB2003实现NTFS文件附加数据流的读写类,提供.Net框架下NTFS文件附加数据流的完整解决方案。 关键词:VB.Net NTFS 数据流 类 在项目中选择添加引用->浏览->选择“JWBStreamOP.dll”文件->确定,即可成功引用。 4.1 类的声明: Dim myStreamOP As New ClassJWBStreamOP(“NTFS文件完整路径”) 4.2 属性: 该类共有3个只读属性 属性名 返回值类型 备注 FileName String 只读,在成功声明后使用 Ready Boolean 只读,该类可操作时为True Ver String 只读,类版本、版权信息 4.3 方法 该类共有6个方法: 4.3.1 OpenNTFSStream(ByVal sStreamName As String) As System.IO.FileStream 打开指定文件(声明时指定)的指定数据流,返回值为指定数据流的FileStream接口。 参数列表 类型 传递方式 参数说明 sStreamName String Byval 流文件名 4.3.2 GetNTFSStreamSize(ByVal sStreamName As String) As Long 获取指定数据流的大小,返回实际大小,执行失败返回-1 参数列表 类型 传递方式 参数说明 sStreamName String Byval 流文件名 4.3.3 AddNTFSStream(ByVal toHidName As String, ByRef percentDone As Double) As Boolean 添加附加数据流,返回执行结果。 参数列表 类型 传递方式 参数说明 toHidName String ByVal 待添加的文件路径 percentDone Double ByRef 传递一个完成百分比的参数 4.3.4 SaveNTFSStream(ByVal sStreamName As String, ByVal outFileName As String, ByRef percentDone As Double) As Boolean将指定的数据流保存为文件,返回执行结果。 参数列表 类型 传递方式 参数说明 sStreamName String ByVal 流文件名 outFileName String ByVal 保存文件路径 percentDone Double ByRef 传递一个完成百分比的参数 4.3.5 ReadNTFSStreamsName() As String() 获取文件的所有附加数据流名称,返回名称数组。 4.3.6 DeleteNTFSStream(ByVal sStreamName As String) As Boolean 删除指定数据流,返回执行结果。 参数列表 类型 传递方式 参数说明 sStreamName String Byval 流文件名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值