渗透技巧-Windows FindFirstFile 特性
前言
首先这个思路来自于书籍《代码审计-企业级 Web 代码安全架构》,看完之后感觉挺新奇的值得分享(也可能是因为我太菜了,之前不了解这种姿势),推荐大家去阅读原书。
利用原理
我们都知道,在我们进行文件包含的时候,上传的文件名很大几率都是经过处理的(MD5、时间戳等)。那么这样,我们很可能会碰到马子上传成功了,但是由于服务器未返回文件名,不知道完整路径而无法利用。这时我们就可以使用这个技巧,在知道文件所在目录,但不知道文件名的情况下来包含我们的马子。(也可根据常见的文件名处理逻辑去猜测爆破文件名)
利用条件
利用的条件为:Windows,这是因为 Windows 在搜索文件时使用到了 FindFirstFile 这一个 winapi 函数,该函数到一个文件夹(包括子文件夹)去搜索指定文件。
利用方法
我们可以将文件名不可知部分之后的字符串使用 "<" 或 ">" 代替,但是需要注意:一个 "<" 或 ">" 只能代表一个字符。
如果我们上传的马子为 shell.php,那么请求 "s<" 或者 ”s>“ 都是访问不到文件的。需要使用 "s<<" 才能访问到,含义为继续往下搜索。
演示
这里只是作为姿势的演示,真实环境下需要结合场景进行变通。
如下图,我们可以看到一个存在文件包含漏洞的 test.php 以及我们所上传 shell.txt 后名称被处理的马子 shell_2021123166666.txt

在正常情况下,我们需要包含我们的马子需要这样操作:test.php?file=shell_2021123166666.txt

那么我们在不知道马子的完整文件名时,就可以这样去访问。
test.php?file=shell<<

注意1:
shell<<、shel<<、she<<、sh<<、s<< 都是可以访问到的
注意2:
此特性只可在 Windows 中使用
注意3:
经过测试发现,在使用 "<<" 去匹配时,模糊时会优先匹配值最小的文件名称,如下图:

2020 < 2021 < 2022
在访问 test.php?file=shell_202<< 时,由于我们存在 2020、2021、2022 文件,0 < 1 < 2,所以会匹配到 2020 文件。

如果想要匹配到我们的马子,也就是 2021,则需要增加文件名的准确度,也就是匹配 test.php?file=shell_2021<<

补充:不要忘记 "<" 或 ">" 只能代表一个字符,因此在文件名长度不确定时,我们提供的半截文件名加"<" 或 ">" 的字符数之和不等于完整文件名字符数,会匹配失败。


小结
此特性并不是只有文件包含函数才可用,事实上还有很多函数也一样可利用这个特性,我们在进行代码审计的时候也可以注意一下,说不定就能挖出意想不到的漏洞(关于 PHP 的代码审计可了解我之前发的 https://zone.huoxian.cn/d/752-cms 文章:)。函数可见下图,最后祝各位师傅们新年挖洞多多,¥多多
