最近的比赛中接触到一个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位后缀,然后再简写
|
|