最近的比赛中接触到一个php在windows中的骚姿势。利用<>"这三个字符来进行目录文件的扫描和上传bypass。
当然这里不仅仅是说<>",还有一个可以搭配使用的技巧是Windows下的文件和目录的简写。比如 /aaaaaa~1/bbbbbb~1.php
通配符<>"
WHAT
PHP语言在Windows环境下有如下特性:
- 大于号
>相当于通配符问号?。可匹配除点号.外的0个或1个字符 - 小于号
<相当于通配符星号*。可匹配0个或多个字符,匹配到文件后缀的.字符结束 - 双引号
"相当于普通的点字符.
WHY
不做分析了。。有人调试总结好了:PHP源码调试之Windows文件通配符分析
- 问题的产生的根本原因PHP调用了Windows API里的FindFirstFileExW()/FindFirstFile()方法
- 该Windows API方法对于这个三个字符做了特别的对待和处理
- 任何调用该Windows API方法的语言都有可能存在以上这个问题,比如:Python
HOW
测试时的目录列表
|
|
|
|
a. 文件名的扫描
|
|

b. 已知文件名对目录名的爆破
|
|

c. 文件覆盖上传
若上传目录存在名为index.php的文件,在后端未判断文件存在和黑名单验证后缀的缺陷下,则上传ind<.<将覆盖 index.php 的内容。配合windows上传的shell.php:.jpg和shell.php::$DATA食用更佳。
如,先上传个shell.php:.jpg,注意此时上传上去的shell.php内容是空的。

再次上传shel<.<。可成功覆盖原来的shell.php空文件。

Windows下的文件名简写
WHAT
在Windows下,支持一种简写的规则。当你输入dir /x命令后,就可以看到文件名的简写为 {前6个字符}~1.{后缀前3个字符} ,即所谓的文件命名的8.3格式。

可参考 https://xz.aliyun.com/t/2318#toc-3
HOW
测试时的目录列表(index.php 内容没变)
|
|
我们可通过一个文件名较短的已知文件如1.txt,并结合上文的通配符特性,来爆出6个字符。
|
|
于是我们可利用文件名或目录简写的特点,将url请求写成:
|
|

或者你要是闲着蛋疼,也可以继续爆出6位文件名和3位后缀,然后再简写
|
|