前言
翻推特时看到Orange的一篇文章:“WorstFit: Unveiling Hidden Transformers in Windows ANSI!”,被标题吸引点进去看看,仔细研读后发现,文章展现了一个新的攻击面,漏洞很精彩。
由于时间有限这里只做一个简单的学习笔记。文中甚至揭露了ElFinder在Windows下的一个后台RCE 0day(ElFinder是一款开源的基于PHP的Web文件管理系统)
原文链接:https://blog.orange.tw/posts/2025-01-worstfit-unveiling-hidden-transformers-in-windows-ansi/
漏洞背景
知识点1
Windows最初用的字符集是ANSI,后来扩展到Unicode字符集,但Windows承诺永远向后兼容,所以现在仍然兼容ANSI字符集。兼容ANSI字符集的方式是,内部有一个API RtlUnicodeStringToAnsiString(或者WideCharToMultiByte)将Unicode字符转换为ANSI字符。我们都知道,Windows下的GetCurrentDirectoryA()使用ANSI字符集,GetCurrentDirectoryW()使用Unicode字符集,也就是说,当传入Unicode字符,并且调用ANSI API时,会在内部调用RtlUnicodeStringToAnsiString(或者WideCharToMultiByte)
知识点2
我们常用的C语言写法
int main(int argc, char* argv[], char* envp[]) {
for (int i = 0; i < argc; ++i)
printf("argv[%d] = %sn", i, argv[i]);
}
在编译时会秘密生成函数mainCRTStartup,而mainCRTStartup内部会调用GetCommandLineA,也就是说,当输入是Unicode字符集时,凡是这样写的程序,都有上述漏洞,现今的输入基本都是Unicode字符,这样的话,影响面就很大了,其中包括著名的curl、openssl等
漏洞原理
目前为止都没有问题,可是当代一些新奇的字符如 emojis ✅, áccènted letters, 𝒻𝒶𝓃𝒸𝓎 𝕤𝕪𝕞𝕓𝕠𝕝𝕤 and CJK 匚卄八尺八匚ㄒヨ尺丂 等在转换为ANSI时会产生意想不到的结果,具体而言是,看起来像双引号的U+ff02会被转换为双引号0x0022,也就是说php中的escapeshellarg并不是完全可靠,有了WorstFit,在Windows下是可以绕过的,也就造成了上面说的ElFinder在Windows下的一个后台RCE 0day。这个漏洞看完就感觉很奇妙,具体细节可以去看原文,确实产生了一个新的攻击面。
原文始发于微信公众号(卡卡罗特取西经):“WorstFit”学习
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论