快捷搜索:  

ASP.NET虚拟主机安全漏洞解决方案(3)


  然后,建立相应的应用程序池。

  依次打开Internet 信息服务→本地计算机→应用程序池→新建→应用程序池

  新建一个名字为test的应用程序池


  编辑test应用程序池的属性→标示→配置→用户名→浏览→把用户名改为我们刚才建立的app_test_user并输入相应的密码


  其次建立相应的网站。

  依次打开Internet 信息服务→本地计算机→网站→新建→test的网站,目录为d:\test →编辑test网站的属性→主目录→应用程序池→app_test_user →目录安全性→身份验证和访问控制→编辑,选择我们刚才建立的iis_test_user,并输入相应的密码iisuser→保存并退出。


  最后设定服务器的安全。

  C:只给administrators和system完全控制的权利,删除掉其他所有的权限,不替换子目录


  C:\Documents and Settings继承父项,并替换子目录。

  C:\Program Files继承父项,并替换子目录,并把C:\Program Files\Common Files\Microsoft Shared继承属性删除并复制现有属性,增加users的读取权限并替换子目录(这样做是为了能够让asp,asp.net使用access等数据库)。

  C:\windows删除继承,并复制现有属性,只给予administrators,system完全控制和users读取的权限并替换子目录。


  其余所有的盘都只给于administrators和system用户的完全控制权限,删除其他所有用户并替换子目录。

  D:\test(用户网站目录)继承现有属性并增加app_test_user和iis_test_user完全控制的权限并替换子目录。

  以后每增加一个网站都以此类推。

  但是,至此,system.io还是对c:\windows又读取权限的,(怀疑network servers用户属于users组,但是好多服务都要使用users组来执行的,所以不能把c:\windwos去掉users组的读取权限)但必须知道系统路径,有两种方案解决。

  1、 再安装系统的时候使用无人值守安装,更换c:\windows默认安装路径,如更改为c:\testtest(要符合dos的命名规则,不能超过8个字符)。这个是必需的

  2、 以下位置具有指派给 IIS_WPG 的权限:

  %windir%\help\iishelp\common – 读取
  %windir%\IIS Temporary Compressed Files – 列出、读取、写入
  %windir%\system32\inetsrv\ASP Compiled Template – 读取
  Inetpub\wwwroot(或内容目录)- 读取、执行

  此外,IIS_WPG 还具有以下用户权限:

  忽略遍历检查(SeChangeNotifyPrivilege)

  作为批处理作业登录(SeBatchLogonRight)

  从网络访问此计算机(SeNetworkLogonRight)

  当然两种方法结合起来算是最安全的方案,一般使用第一种方案已经算是很安全的,毕竟是用一个webshell来猜测8位字符的目录还是需要花费时间的。使用防火墙很容易就能察觉出来,并加以控制。

  第二种可能根据所安装软件不同还要相应增加目录的读取权限,详细情况要根据软件来确定。

  如果主机用户比较多,这将是一个相当大的劳动量,推荐使用程序来解决问题,下面给出网上不常见的针对iis应用程序池操作的代码和针对iis虚拟目录的操作代码。


操作iis应用程序池

using System;
using System.DirectoryServices;
using System.Reflection;

namespace ADSI1
{
 ///
 /// Small class containing methods to configure IIS.
 ///
 class ConfigIIS
 {
  ///
  /// The main entry point for the application.
  ///
  [STAThread]
  //主程序入口,可以选择用哪些,我为了方便,全部功能都写上去了。
  static void Main(string[] args)
  {
   string AppPoolName = "MyAppPool";
   string newvdir1 = "MyVDir";
   DirectoryEntry newvdir = CreateVDir(newvdir1);

   CreateAppPool(AppPoolName);
   AssignAppPool(newvdir, AppPoolName);
   ConfigAppPool("Stop",AppPoolName);
  }

  //创建虚拟目录
  static DirectoryEntry CreateVDir (string vdirname)
  {
   DirectoryEntry newvdir;
   DirectoryEntry root=new DirectoryEntry("IIS://localhost/W3SVC/1/Root");
   newvdir=root.Children.Add(vdirname, "IIsWebVirtualDir");
   newvdir.Properties["Path"][0]= "c:\\inetpub\\wwwroot";
   newvdir.Properties["AccessScript"][0] = true;
   newvdir.CommitChanges();
   return newvdir;
  }

  //创建新的应用程序池。
  static void CreateAppPool(string AppPoolName)
  {
   DirectoryEntry newpool;
   DirectoryEntry apppools=new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
   newpool=apppools.Children.Add(AppPoolName, "IIsApplicationPool");
   newpool.CommitChanges();
  }

  static void AssignAppPool(DirectoryEntry newvdir, string AppPoolName)
  {
   object[] param={0, AppPoolName, true};
   newvdir.Invoke("AppCreate3", param);
  }

  //method是管理应用程序池的方法,有三种Start、Stop、Recycle,而AppPoolName是应用程序池名称
  static void ConfigAppPool(string method,string AppPoolName)
  {
   DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
   DirectoryEntry findPool = appPool.Children.Find(AppPoolName,IIsApplicationPool");
   findPool.Invoke(method,null);
   appPool.CommitChanges();
   appPool.Close();
  }

  //应用程序池的列表
  static void AppPoolList()
  {
   DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
   foreach(DirectoryEntry a in appPool.Children)
   {
    Console.WriteLine(a.Name);
   }
  }

  private void VDirToAppPool()
  {
   DirectroryEntry VD = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT/ccc");
   Console.WriteLine(VD.Properties["AppPoolId"].Value.ToString());
  }
 }
}

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论