經(jīng)典:ASP.net服務(wù)器的入侵方法_Web服務(wù)器教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      有個朋友在QQ上問了我關(guān)于ASP.net服務(wù)器的入侵方法我將ASP.net上的一些入侵常用手段告訴大家

      1.ASP中常用的標準組件: FileSystemObject,這個組件為 ASP 提供了強大的文件系統(tǒng)訪問能力,可以對服務(wù)器硬盤上的任何有權(quán)限的目錄和文件進行讀寫、刪除、改名等操作。FSO對象來自微軟提供的腳本運行庫 scrrun.dll中。使用下面的代碼就可以在ASP中創(chuàng)建一個FSO對象:Set fso = CreateObject("Scripting.FileSystemObject")我們使用fso對象包含的屬性和方法,如Drive、 Drives、Folder、Floders、File、Files等對服務(wù)器的磁盤、目錄和文件進行讀、寫、刪除等操作。這一強大的文件系統(tǒng)訪問能力給 ASP共享空間提供者帶來了嚴重的安全問題,很多ASP空間的管理員都刪除此組件或?qū)⑦@個組件改名以避免用戶使用這一標準組件。刪除組件或組件改名確實是一個簡單的方法并且也很有效,但是卻使廣大用戶無法使用它的強大的功能。網(wǎng)絡(luò)上還有一種看起來很美的方案,它允許用戶使用 FileSystemObject 組件又不影響服務(wù)器的安全,即對每一個用戶都設(shè)置一個獨立的服務(wù)器用戶和單個目錄的操作權(quán)限。但是這種方法是有問題的。因為ASP和ASP.NET中在這方面的問題十分類似,所以我們將在ASP.NET的相應(yīng)解決辦法部分詳加說明。在ASP.NET中我們發(fā)現(xiàn)這一問題仍然存在,并且變得更加難以解決。這是因為.NET中關(guān)于系統(tǒng)IO操作的功能變得更加強大,而使這一問題更嚴重的是ASP.NET所具有的一項新功能,這就組件不需要象ASP那樣必須要使用 regsvr32來注冊了,只需將Dll類庫文件上傳到bin目錄下就可以直接使用了。這一功能確實給開發(fā)ASP.NET帶來了很大的方便,但是卻使我們在ASP中將此dll刪除或者改名的解決方法失去效用了,防范此問題就變得更加復(fù)雜。在討論解決方案之前,我們先來看一下怎么來實現(xiàn)上述的危險的功能

      2.文件系統(tǒng)

      我們還要使用System.IO名稱空間的其他幾個類是:

      System.IO.Directory:提供用于創(chuàng)建、移動和枚舉通過目錄和子目錄的靜態(tài)方法的類

      System.IO.File:提供用于創(chuàng)建、復(fù)制、刪除、移動和打開文件的靜態(tài)方法的類

      System.IO.FileInfo:提供創(chuàng)建、復(fù)制、刪除、移動和打開文件的實例方法的類

      System.IO.StreamReader:實現(xiàn)一個 TextReader,使其以一種特定的編碼從字節(jié)流中讀取字符。

      每個我們所使用的類的屬性和方法的具體用法我們將以代碼注釋的方式在程序中加以說明。

      System.IO名稱空間在 .NET FRAMEWORK提供的mscorlib.dll中,在使用VS.Net編程之前需要將此Dll引用到此項目中。

      我們所編寫的程序都使用了 Codebehind方式,即每一個aspx程序都有一個對應(yīng)的aspx.cs程序,aspx程序中只是寫與頁面顯示相關(guān)的代碼,所有邏輯實現(xiàn)的代碼都放在相應(yīng)的aspx.cs文件中,這樣就可以更好得做到顯示與邏輯的分離。由于我們的目的不是討論Codebehind技術(shù),所以就不在對此多加討論了。

      在這篇文章里,我們只介紹幾個主要的類及其關(guān)鍵方法的用法,詳細程序請查看附帶的源代碼。

      程序一:顯示服務(wù)器的當前信息和全部邏輯驅(qū)動器的名稱的程序listdrivers.aspx

      主要方法1:我們使用 GetSysInf() 方法來得到服務(wù)器的當前環(huán)境和平臺的信息

      //獲取系統(tǒng)信息的方法,此方法在listdrivers.aspx.cs文件中

      public void GetSysInf () {

      //獲取操作系統(tǒng)類型

      qDrives = Environment.OSVersion.ToString();

      //獲取系統(tǒng)文件夾

      qSystemDir = Environment.SystemDirectory.ToString();

      /*獲取映射到進程上下文的物理內(nèi)存量,通過這一內(nèi)存映射量可以了解ASP.NET程序在運行時需要多少系統(tǒng)物理內(nèi)存,有助于更好的規(guī)劃我們的整個應(yīng)用,因為物理內(nèi)存量是以Byte為單位的,所以我們將此數(shù)值除以1024,可以得到單位為KB的物理內(nèi)存量*/

      qMo = (Environment.WorkingSet/1024).ToString();

      //獲取當前目錄(即該進程從中啟動的目錄)的完全限定路徑

      qCurDir = Environment.CurrentDirectory.ToString();

      //獲取主機的網(wǎng)

      tail"

      HeaderText="詳細信息"

      Target="_new"

      />

      在兩個DataGrid(DirGrid,F(xiàn)ileGrid)中我們分別設(shè)置了兩個HyperLinkColumn列來導(dǎo)航到不同的處理頁面。

      在兩個DataGrid中我們都使用了一個刪除的按鈕列:

      <asp:ButtonColumn HeaderText="刪除"

      Text="刪除"

      CommandName="Delete"

      />

      由于添加、更新、刪除功能列都是DataGrid的默認模板列,所以可以在Vs.net中通過DataGrid的屬性生成器自動添加此列。

      獲取上一頁面所傳遞來的參數(shù)的代碼:

      因為在下面產(chǎn)生數(shù)據(jù)源的方法中需要使用由上一個頁面?zhèn)鬟f過來的參數(shù)來確定目錄和文件的名稱,所以在頁面的Page_Load方法里使用了下列代碼:

      strDir2List = Request.QueryString["dir"];

      字符串strDir2List即傳過來的目錄名或文件名。

      因為我們使用了兩個DateGrid,就需要進行兩次數(shù)據(jù)綁定,就有兩個不同的生成數(shù)據(jù)源的方法。

      生成目錄數(shù)據(jù)網(wǎng)格(DirGrid)數(shù)據(jù)源的方法:

      //通過此方法返回一個集合形式的數(shù)據(jù)視圖DataView,用來初始化子目錄的DataGrid

      ICollection CreateDataSourceDir() {

      dtDir = new DataTable();

      DataRow dr;

      //向DataTable中添加新的數(shù)據(jù)列,共四列

      dtDir.Columns.Add(new DataColumn("DirID", typeof(Int32)));

      dtDir.Columns.Add(new DataColumn("DirName", typeof(string)));

      dtDir.Columns.Add(new DataColumn("DelDir", typeof(string)));

      dtDir.Columns.Add(new DataColumn("DirDetail", typeof(string)));

      //根據(jù)傳入的參數(shù)(目錄名)得到此目錄下所有子目錄名的字符串數(shù)組

      string [] DirEntries = Directory.GetDirectories(strDir2List);

      //使用foreach循環(huán)可以對未知長度的數(shù)組進行遍歷循環(huán)

      foreach(string DirName in DirEntries){

      dr = dtDir.NewRow();

      dr[0] = i;//序號

      dr[1] = DirName;//文件夾名稱

      dr[3] = "刪除";

      dr[3] = "查看詳情";

      dtDir.Rows.Add(dr);

      i++;

      }

      DataView DVDir = new DataView(dtDir);

      //返回得到的數(shù)據(jù)視圖

      return DVDir;

      }

      生成文件數(shù)據(jù)網(wǎng)格(FileGrid)數(shù)據(jù)源的方法:

      //通過此方法返回一個集合形式的數(shù)據(jù)視圖DataView,用來初始化文件的DataGrid

      ICollection CreateDataSourceFile() {

      dtFile = new DataTable();

      DataRow dr;

      dtFile.Columns.Add(new DataColumn("FileID", typeof(Int32)));

      dtFile.Columns.Add(new DataColumn("FileName", typeof(string)));

      dtFile.Columns.Add(new DataColumn("DelFile", typeof(string)));

      dtFile.Columns.Add(new DataColumn("FileDetail", typeof(string)));

      //根據(jù)傳入的參數(shù)(目錄名)得到此目錄下所有文件名的字符串數(shù)組

      string [] FileEntries = Directory.GetFiles(strDir2List);

      foreach(string FileName in FileEntries){

      dr = dtFile.NewRow();

      dr[0] = i;

      dr[1] = FileName;

      dr[2] = "刪除";

      dr[3] = "查看詳情";

      dtFile.Rows.Add(dr);

      i++;

      }

      dvFile = new DataView(dtFile);

      return dvFile;

      }

      我們編程實現(xiàn)了兩個DataSource只需在頁面的Page_Load方法里對兩個DataGrid進行數(shù)據(jù)綁定即可將得到的DataTable中的數(shù)據(jù)顯示在aspx頁面的DataGrid上。

      數(shù)據(jù)綁定代碼://對子目錄數(shù)據(jù)列表DirGrid進行數(shù)據(jù)源定義和數(shù)據(jù)綁定

      DirGrid.DataSource = CreateDataSourceDir();

      DirGrid.DataBind();

      //對文件數(shù)據(jù)列表FileGrid進行數(shù)據(jù)源定義和數(shù)據(jù)綁定

      FileGrid.DataSource = CreateDataSourceFile();

      FileGrid.DataBind();

      通過我們上邊介紹的主要方法,我們實現(xiàn)了對某個邏輯驅(qū)動器或目錄中的所有子目錄和文件進行了列表顯示,并且可以根據(jù)顯示結(jié)果更進一步的瀏覽子目錄或者查看文件的屬性和內(nèi)容提要。瀏覽子目錄仍然是通過listdir.aspx這個程序,沒有任何子目錄級別要求,沒有目錄深度限制。

      刪除子目錄和文件的主要方法和代碼:

      在刪除子目錄時,我們需要用到Directory.Delete (string,bool)方法,此方法有兩種:

      1.public static void Delete(string);

      從指定路徑刪除空目錄。

      2.public static void Delete(string, boolean);

      刪除指定的目錄并(如果指示)刪除該目錄中的任何子目錄,將boolean設(shè)置為true的話,則刪除此目錄下的所有子目錄和文件,否則將boolean設(shè)置為false。

      在這里我們使用了第二種方法,如果選擇刪除的話,將刪除此目錄下的所有子目錄和文件。

      注意:Directory 類的所有方法都是靜態(tài)的,因而無需具有目錄Directory的實例就可被調(diào)用。

      /*實現(xiàn)刪除子目錄的方法,此方法為 VS.NET自動添加,注意DataGridCommandEventArgs e為DirGrid中 CommandName="Delete" 的ButtonColumn的事件,通過此事件,我們可以得到是那一行的ButtonColumn按鈕列被點擊,進而確定我們需要刪除的子目錄的名稱*/

      private void DirGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e){

      /*定義一個單元格,e.Item為此事件所發(fā)生行的所有項目,e.Item.Cells[1]為整個行的第二個單元格的內(nèi)容,在此DataGrid中為子目錄的名稱

      */

      TableCell ItemCell = e.Item.Cells[1];

      //得到此子目錄的名稱的字符串

      string item = ItemCell.Text;

      //刪除此子目錄

      Directory.Delete(item,true);

      //刪除后進行數(shù)據(jù)綁定以更新數(shù)據(jù)列表

      DirGrid.DataBind();

      }

      在刪除文件時,我們需要用到File.Delete(string path);

      注意:File 類的所有方法都是靜態(tài)的,因而無需具有目錄的實例就可被調(diào)用。

      private void FileGrid_DeleteCommand(object source,

      System.Web.UI.WebControls.DataGridCommandEventArgs e) {

      TableCell ItemCell = e.Item.Cells[1];

      //得到此文件名稱的字符串

      string item = ItemCell.Text;

      //刪除此文件

      File.Delete(item);

      //刪除后進行數(shù)據(jù)綁定以更新數(shù)據(jù)列表

      DirGrid.DataBind();

      }

      通過上邊的主要方法我們在頁面上實現(xiàn)了一個刪除某一個子目錄或者文件的功能,此功能在測試時需要慎重使用,一旦刪除無法通過常規(guī)方法恢復(fù)。其他如目錄或文件改名、修改內(nèi)容等方法都可以在此程序基礎(chǔ)上添加相應(yīng)的功能,實現(xiàn)方法也很簡單。各位愛好者可以通過添加相應(yīng)功能,使之擴充為一個基于Web的服務(wù)器文件管理系統(tǒng)。我們也可以由此看到這個程序的危害性,一個沒有對此安全隱患采取防范措施的服務(wù)器的文件系統(tǒng)就都暴露在了使用此程序的用戶面前。

      來源:網(wǎng)絡(luò)搜集//所屬分類:Web服務(wù)器教程/更新時間:2012-11-20
      相關(guān)Web服務(wù)器教程