window的特性
參考文獻:https://xz.aliyun.com/t/2318
https://www.jianshu.com/p/96cf08d569bc
WinAPI與通配符
在Windows環(huán)境下使用PHP時,PHP中的部分函數(shù)會調用2個底層Windows API函數(shù)FindFirstFileExW(),FindFirstFile()
這兩個函數(shù)對< > "三個字符做了特別的對待和處理:
大于號 > 等價于 通配符 ? 0次或1次小于號 < 等價于 通配符 * 0次或多次雙引號 " 等價于 通配符 . 匹配除換行符(\n, \r)之外的任意單個字符也就是說,在Windows下的PHP的某些函數(shù)中,我們可以使用< > "來匹配一些文件名/目錄名,將文件名不可知部分之后的字符用"<",">"代替,只用一個"<"或">"只能代表一個字符,若文件名很長需要用"<<"才行。
這里的部分函數(shù)包括但不限于:
include() 包含文件 include_once() 包含文件 require() 包含文件 require_once() 包含文件 fopen() 打開文件 copy() 復制文件 file_get_contents() 讀取文件 readfile() 讀取文件 file_put_contents() 寫入文件 mkdir() 創(chuàng)建文件 opendir() 文件夾操作 readdir() 文件夾操作 move_uploaded_file() 移動文件 getimagesize() 獲取圖像尺寸,類型等信息 ......IIS短文件名
遠古時代的DOS下存在這樣的文件命名規(guī)則:
主文件名不能超過8個字符,擴展名不能超過3個字符(也被叫為8.3格式。)
Windows為了兼容MS-DOS,為文件名超過8位,擴展名超過3位的文件都會對應地創(chuàng)建一個8.3格式的文件名,也稱為短文件名。在cmd下使用命令 dir /x可以查看文件對應的短文件名
短文件名有如下2個特征:
- 文件名只顯示前6個字符,后續(xù)字符用~1代替。當存在多個文件名類似的文件時(文件名前6位相同,且后綴名前3位相同),數(shù)字1會進行遞增。
- 后綴只顯示前3個字符。
Windows + IIS 6 + .net 文件/目錄猜測
適用條件與局限:
- 被猜測文件的文件名長度需超過8位,或后綴名超過3位。
- 環(huán)境為Windows + IIS + .net
- 只能猜測出文件名的前6位,后綴名的前3位。
IIS短文件名漏洞
當我們訪問某個存在的短文件名時,會返回404。而當我們訪問某個不存在的短文件名時,會返回400,依據(jù)返回結果的不同,就可以進行逐位猜測了。
比如要猜測出如下文件abc7758521woaini.aspx
- 猜測文件名/目錄名
進行如下猜解,不斷向下猜解完所有的6個字符,
到了這一步,我們要來判斷這是一個目錄還是一個文件。
若如下請求返回404,則代表它是一個目錄,否則就是一個文件
http://xxx.xx.xx.xxx/abc775*~1/xxx.aspx
- 猜測文件后綴
接下來開始猜解文件后綴,不斷向下猜解完所有的3個字符
返回無法找到該頁面,則猜測成功
Windows + IIS 7.x + .net 文件/目錄猜測
不同版本的IIS返回結果如下:
給出了IIS 7.x開啟了詳細錯誤之后,不同頁面的變化情況,然而默認情況下都是顯示一個自定義的404頁面,并不會給出詳細錯誤。
猜測出根目錄下的一個目錄名:abcdefg1234567aaabbb
在默認情況下,無論該文件/目錄是否存在,都會返回一個404,返回結果沒有差異的話,就無法猜測。
使用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,根據(jù)返回結果的差異,就可以探測出目錄名的短文件名。
當主動開啟了詳細錯誤之后,使用GET請求也可以得到有差異的結果了。
若存在 http://xxx.xx.xx.xxx/a*~1****/xxx.aspx 錯誤代碼為 0x00000000 若不存在http://xxx.xx.xx.xxx/b*~1****/xxx.aspx 錯誤代碼為 0x80070002Windows + Apache + PHP 文件/目錄猜測
在該環(huán)境下,無法像在IIS下直接用URL訪問的方式去逐位猜測短文件名了,但有兩個殺傷力更大的特性:
當Web程序中存在某些函數(shù)時(前置知識中提到的),我們借助它們來逐位猜測出完整目錄名,文件名,并且沒有長度大小的限制。
雖然無法直接用URL訪問的方式去逐位猜測出短文件名,但是可以用URL訪問的方式直接訪問/下載 已知短文件名的目錄/文件
特性1
這里以HITB 2018的一道CTF題目為例,示例代碼如下:
<?php $filename = $_GET['filename'];$file = "./abcdefg1234567aaabb/" . $filename;var_dump(getimagesize($file));?>網(wǎng)站存在上傳功能,我們將一個php木馬上傳到了某目錄下(abcdefg1234567aaabb),但是不知道其目錄名。
但是,我們可以向1.php的filename參數(shù)傳入該目錄下的一個圖片名,程序會返回該圖片的尺寸信息。
執(zhí)行如下訪問
接下來的26 + 10 次嘗試中,均返回錯誤,證明我們已經(jīng)將目錄名猜解完畢,得到目錄名:
abcdefg1234567aaabb假設我們連php木馬名也不知道呢?猜解文件名也是同一個道理
http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/w<.phphttp://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/wo<.phphttp://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woa<.phphttp://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woai<.php......http://xxx.xx.xx.xxx/1.php?filename=../abcdefg1234567aaabb/woainihhhh<.php接下來的26 + 10 次嘗試中,均返回錯誤,證明我們已經(jīng)將文件名猜解完畢,得到文件名。將目錄名和文件名拼接:
http://xxx.xx.xx.xxx/abcdefg1234567aaabb/woainihhhh.php- 特性2
事實上,在上一步中,并不需要猜測出完整文件名,目錄名,用短文件名就可以直接訪問,下載了。
想要下載如下文件
http://xxx.xx.xx.xxx/uploads/abcdefgasd1241asd123sgadg123sdgasd123dzg.zip同樣可以使用短文件名去下載
http://xxx.xx.xx.xxx/uploads/abcdef~1.zip這種方法在IIS下無法使用,IIS不接受直接用短文件名訪問的請求方式。
Windows + IIS + PHP 文件/目錄猜測
在該環(huán)境下,可以用到很多前面提到的特性。
- 可以使用URL訪問的方式,來逐位猜測出目錄/文件的短文件名
- 當Web程序中存在某些函數(shù)時(前置知識中提到的),我們借助它們來逐位猜測出完整目錄名,文件名,并且沒有長度大小的限制。
- 可以使用URL訪問的方式,用通配符直接訪問文件(但不能訪問目錄)
特性1
使用前面提到過的OPTIONS請求方式來逐位猜測目錄的短文件名
存在時返回404,不存在時返回200
特性2
這是PHP的特性,與Web服務器種類無關。
首先逐位猜測出目錄名
特性3
事實上猜測出目錄名就足夠了,文件名可以直接使用通配符去訪問:
http://192.168.219.241/abcdefg1234567aaabbb/w<.php
Windows + Nginx + PHP 文件/目錄猜測
在該環(huán)境下,依然可用使用提到的多個特性
- 可以直接用短文件名,訪問目錄和文件
- 可以直接用通配符訪問文件,但是不能訪問目錄
- PHP某些函數(shù)的特性
特性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
逐位猜測目錄名:
Read error代表存在
逐位猜測文件名
進而拼接處完整文件路徑:
http://xxx.xx.xx.xxx/abcdefgwoaini123/xxxaaabbbccc.php總結
- 上一篇: Java环境变量的配置 (Win10环境
- 下一篇: java.lang.NoSuchMeth