window的特性

简介: 参考文献:https://xz.aliyun.com/t/2318https://www.jianshu.com/p/96cf08d569bcWinAPI与通配符在Windows环境下使用PHP时,PHP中的部分函数会调用2个底层Windows AP...

参考文献: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
目录
相关文章
|
21天前
|
前端开发 Java Linux
开发指南068-封装为window服务
如果需要把后台jar包封装为window的服务,可以使用如下方法。
|
API
window resize和scroll事件性能优化
window resize和scroll事件性能优化
235 0
|
JavaScript 前端开发
JavaScript窗口(window)对象介绍
JavaScript窗口(window)对象介绍
114 0
|
JavaScript 前端开发
|
JavaScript 前端开发
|
监控 JavaScript
jquery实时监控input值的变化、兼容ie9
jquery实时监控input值的变化、兼容ie9
124 0
为什么会有window.window这种设计
为啥要搞这个这个看起来貌似很奇葩的设计。 要解答这个问题,还得请出this,我们经常说浏览器中的全局对象是window, 这句话对了,也还没完全对。 全局对象的真实身份应该是全局作用域的this。 window只是为了便于访问this,弄出来的一个属性。
310 0
为什么会有window.window这种设计
|
移动开发 JavaScript UED
用 customRef 做一个防抖函数,支持 element 等UI库
这几天学习Vue的官网,看到 customRef 提供了一个例子,研究半天发现这是一个防抖函数,觉得挺好,于是把这个例子扩展了一下,可以用于表单子控件和查询子控件。
201 0
|
前端开发 JavaScript 数据安全/隐私保护
58、window 对象
浏览器里面,window对象(注意,w为小写)指当前的浏览器窗口。它也是当前页面的顶层对象,即最高一层的对象,所有其他对象都是它的下属。一个变量如果未声明,那么默认就是顶层对象的属性。
241 0
|
算法 C#
解决WPF中重载Window.OnRender函数失效问题
原文:解决WPF中重载Window.OnRender函数失效问题 今天实验一个绘图算法的时候,偶然发现重载Window.OnRender的方法是没有效果的。 public partial class MainWindow : Window { public ...
928 0