一探短檔名
短檔名
最近看見一些漏洞利用到了短檔名回想到之前發現的漏洞,發現自己對短檔名的原理一無所知,現在來一探究竟。
什麼是短檔名
windows下的檔案短名是dos+fat12/fat16時代的產物,又稱為8dot3命名法,類似於PROGRA~1(目錄)或者元素周~1.exe(檔案)這樣的名稱。 8是指檔名或目錄名的主體部分小於等於8個字元 ; 3是指檔名或目錄名的擴充套件部分小於等於3個字元 ;中間以 .
作為分割在FAT16檔案系統中,由於FDT中的檔案目錄登記項只為檔名保留了8個位元組,為副檔名保留了3個位元組,所以DOS和Windows的使用者為檔案起名字時要受到8.3格式的限制。
檢視Windows下的短檔名:
可以看見圖中的 123123~1.TXT
,就是 1231231231231231232.txt
的短檔案名錶示。
為什麼現在Windows系統還存在短檔名這種表示?
從win95開始,採用fat32已經支援長檔名,但是為了保持相容性,保證低版本的程式能正確讀取長檔名檔案,每當建立新檔案或新目錄時,系統自動為所有長檔名檔案建立了一個對應的短檔名。使這個檔案既可以用長檔名定址,也可以用短檔名定址。
短檔名命名方式
知道了什麼是短檔名,再看如上文所貼圖,圖中檔案 1231231231231231232.txt
的短檔名就是 123123~1.TXT
Windows短檔名8dot3命名規則:
- 符合DOS短檔名規則的Windows下的長檔名不變
- 長檔名中的空格,在短檔名中被刪除
- 刪除空格後的長檔名,若長度大於8個字元,則取前6個字元,後兩個字元以
~#
代替,其中 # 為數字,數字根據前六個字元相同的檔名的個數順延。若個數超過10個則取前5個字元,後三個字元以~##
代替,其中 ## 為兩位數字,若個數大於100也依此規則替換。 - 對使用多個
.
隔開的長檔名,取最左端一段轉換為短檔名,取最右一段前三個字元為副檔名 - 如果存在老 OS 或程式無法讀取的字元,用
_
替換
關閉短檔名
將Windows登錄檔( HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
)中的 NtfsDisable8dot3NameCreation
這一項的值設為 1
CMD實現關閉短檔名:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v NtfsDisable8dot3NameCreation /d 1 /t REG_DWORD /f
如果想開啟(將值設為0):
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v NtfsDisable8dot3NameCreation /d 0 /t REG_DWORD /f
需要注意:即使關閉了短檔名功能,也不會刪除原有建立過的短檔名