您现在的位置: ASP技术网 >> ASP学习 >> ASP安全加密 >> 文章正文

  没有公告

推荐文章
固顶文章在ASP中使用SQL语句之12:连接
推荐文章二级域名原理以及程序,申请即可
固顶文章十天学会ASP之第四天
固顶文章十天学会ASP之第三天
固顶文章十天学会ASP之第二天
热门文章
在ASP中使用SQL
十天学会ASP之第
十天学会ASP之第
十天学会ASP之第
专题栏目
ASP漏洞及安全建议(四)
作者:admin 文章来源:本站原创 点击数: 更新时间:2004-9-11

14 ASP的加密
   由于ASP脚本是采用明文(plain text)方式来编写的,所以应用开发商辛苦开发出来的ASP应用程序,一旦发布到运行环境中去后,就很难确保这些“源代码”不会被流传出去。这样就产生了如何有效地保护开发出来的ASP脚本源代码的需求。
   官方加密程序:从微软免费下载到sce10chs.exe 直接运行即可完成安装过程。安装完毕后,将生成screnc.exe文件,这是一个运行在DOS PROMAPT的命令工具。
运行screnc - l vbscript source.asp destination.asp生成包含密文ASP脚本的新文件destination.asp用记事本打开看凡是“<%和%>"之内的,不管是否注解,都变成不可阅读的密文了,但无法加密中文。
几种ASP源代码保护方法:
1,“脚本最小化”即ASP文件中只编写尽可能少的源代码,实现
商业逻辑的脚本部分被封装到一个COM/DCOM组件,并在ASP脚
本中创建该组件,进而调用相应的方法(methed)即可。应用开发者
动手开发ASP脚本应用之前就可按此思路来开发,或者直接用ASP
脚本快速开发出原型系统后,针对需要保护、加密的重要脚本用
COM/DCOM组件来重新开发、实现并替换。
2,“脚本加密”即ASP脚本仍直接按源代码方式进行开发,但在发布到运行环境之前将脚本进行加密处理,只要把加密后的密文脚本发布出去。即在ASP.DLL读取脚本这个环节加入密文还原的处理。实现这种思路的方法有两种:一是自行开发一个ISAPI的IIS过滤(filter)块,在ASP.DLL之前勾连(hook)对ASP脚本文件的读取,以便把文件系统读出的密文还原成ASP.DLL可以解释的明文;
方法二是直接由ASP.DLL提供对ASP脚本加密处理的支持。微软在新版本的Vbscript.dll jscript.dll中提供这种成为MS script encode技术的支持。这样,无论是客户端的Vbscript jscript(包括WSH脚本等),还是服务器端的Vbscript jscript (即ASP脚本)都可以支持加密处理。
MS script encode 技术具体的实现思路包括以下两个方面:一是
加密过程,通过提供一个实用程序对包含ASP脚本源代码的文本文件
进行扫描,找出其标记为<script language = "vbscript.encode">或<script
language = "Jscript.encode">;二是还原过程,IE或ASP.DLL等执行
脚本时是统一通过Vbscript.dll jscript.dll来解释执行的,所以它们都
能同时地、透明地支持明文和密文的脚本。
  总之,如果采用第一种思路,要么就自行在开发过程中遵照进行,
要么可以考虑选择自动转换成visual basic 编译代码的通用的、实用工具;采取第二种思路的化,要么就自行开发IIS ISAPI过滤模块,要么可以考虑直接采用MS script encode软件。


 下面来看看一种ASP可以使用的简单字符加密算法,而不是那些受限制的加密算法。其实,这里介绍的加密算法对于一般的运用来说已经足够解密人麻烦一阵子的了。它的加密基础是最简单的Vernum密码方法,  它的基本原理是,需要有一个需要加密的明文和一个随机生成的解密钥匙文件。然后使用这两个文件组合起来生成密文。   (明文) 组合 (密钥) = 加密后的密文  所以这里介绍的是生成密钥的代码。我们假设我们生成的密钥为512位长的密钥,它已经足够来加密一个文本字符了。代码如下:
KeyGeN.asp文件<% '******************************'  KeyGeN.asp'******************************Const g_KeyLocation = "C:\key.txt"Const g_KeyLen = 512On Error Resume NextCall WriteKeyToFile(KeyGeN(g_KeyLen),g_KeyLocation)if Err <> 0 Then  Response.Write "ERROR GENERATING KEY." & "<P>"  Response.Write Err.Number & "<BR>"  Response.Write Err.Description & "<BR>" Else  Response.Write "KEY SUCCESSFULLY GENERATED."End IfSub WriteKeyToFile(MyKeyString,strFileName)  Dim keyFile, fso  set fso = Server.CreateObject("scripting.FileSystemObject")  set keyFile = fso.CreateTextFile(strFileName, true)  keyFile.WriteLine(MyKeyString)  keyFile.CloseEnd SubFunction KeyGeN(iKeyLength)Dim k, iCount, strMyKey  lowerbound = 35  upperbound = 96  Randomize   ' Initialize random-number generator.  for i = 1 to iKeyLength   s = 255   k = Int(((upperbound - lowerbound) + 1) * Rnd + lowerbound)   strMyKey = strMyKey & Chr(k) & ""  next  KeyGeN = strMyKeyEnd Function%> 
  在IIS下运行上面的KeyGeN.asp页面。你只需要如此做一次,他将把密钥写入文件c:\key.txt中 (如果你愿意的话,你也可以把这个文件放到另外一个更加安全的地方).然后你可以打开这个key.txt文件,它将包含512个ASCII码在35到96之间的字符.并且由于是随机生成的,所以每个人的私人密钥文件key.txt将是不一样的,下面是一个例子密钥文件:
IY/;$>=3)?^-+7M32#Q]VOII.Q=OFMC`:P7_B;<R/8U)XFHC<SR_E$.DLG'=I+@5%*+OP:F_=';'NSY`-^S.`AA=BJ3M0.WF#T5LGK(=/<:+C2K/^7AI$;PU'OME2+T8ND?W$C(J\,;631'M-LD5F%%1TF_&K2A-D-54[2P,#'*JU%6`0RF3CMF0(#T07U'FZ=>#,+.AW_/+')DIB;2DTIA57TT&-]O'/*F'M>H.XH5W^0Y*=71+5*^`^PKJ(=E/X#7A:?,S>R&T;+B#<:-*\@)X9F`_`%QA3Z95.?_T#1,$2#FWW5PBH^*<))A(S0@AVD8C^Q0R^T1D?(1+,YE71X+.*+U$:3XO^Q).KG&0N0);[LJ<OZ6IN?7N4<GTL?(M'4S8+3JMK5)HC%^1^+K;\$WBXPA?F&5^E\D$7%*O/U[1/?8(5:1OVWV*1Z-%`:K&V?X1,1KURD@3W0^D)<OG40?(VJ4EWL5A5M<$A);CQ36R9I]*U#Q%1<Y\&SA%#1<V
  下面再仔细分析一下上面的程序,我们发现其中的lowerbound和upperbound的数值其实就是你想使用来加密的ASCII字符范围。


下面的代码将介绍如何使用这个密钥来加密和解密一个字符串


Crypt.asp文件
<%
Dim g_Key


Const g_CryptThis = "Now is the time for all good men to come to the aid of their country."
Const g_KeyLocation = "c:\key.txt"


g_Key = mid(ReadKeyFromFile(g_KeyLocation),1,Len(g_CryptThis))


Response.Write "<p>ORIGINAL STRING: " & g_CryptThis & "<p>"
Response.Write "<p>KEY value: " & g_Key & "<p>"
Response.Write "<p>ENCRYPTED CYPHERTEXT: " & EnCrypt(g_CryptThis) & "<p>"
Response.Write "<p>DECRYPTED CYPHERTEXT: " & DeCrypt(EnCrypt(g_CryptThis)) & "<p>"


Function EnCrypt(strCryptThis)
  Dim strChar, iKeyChar, iStringChar, i
  for i = 1 to Len(strCryptThis)
   iKeyChar = Asc(mid(g_Key,i,1))
   iStringChar = Asc(mid(strCryptThis,i,1))
   ' *** uncomment below to encrypt with addition,
   ' iCryptChar = iStringChar + iKeyChar
   iCryptChar = iKeyChar Xor iStringChar
   strEncrypted = strEncrypted & Chr(iCryptChar)
  next
  EnCrypt = strEncrypted
End Function


Function DeCrypt(strEncrypted)
Dim strChar, iKeyChar, iStringChar, i
  for i = 1 to Len(strEncrypted)
   iKeyChar = (Asc(mid(g_Key,i,1)))
   iStringChar = Asc(mid(strEncrypted,i,1))
   ' *** uncomment below to decrypt with subtraction  
   ' iDeCryptChar = iStringChar - iKeyChar
   iDeCryptChar = iKeyChar Xor iStringChar
   strDecrypted = strDecrypted & Chr(iDeCryptChar)
  next
  DeCrypt = strDecrypted
End Function


Function ReadKeyFromFile(strFileName)
  Dim keyFile, fso, f
  set fso = Server.CreateObject("Scripting.FileSystemObject")
  set f = fso.GetFile(strFileName)
  set ts = f.OpenAsTextStream(1, -2)


  Do While not ts.AtEndOfStream
   keyFile = keyFile & ts.ReadLine
  Loop


  ReadKeyFromFile = keyFile
End Function


%> 
  在Crypt.asp中我们首先从密钥文件中得到密钥值,然后从这段密钥中
截取和我们需要加密的明文同样长度的密钥。然后使用一个简单的异或操作
将明文和密钥进行运算,那么得到的结果就是加密后的密文了。过程很简单的。
  由于是使用了异或操作,所以解密将非常简单,只要使用同样的密钥对密文
再次进行异或操作就能够解密了。
  在上面介绍的基础上,你可以少加改动,就可以使用同样的方法加密一个文件。
唯一需要注意的是,对于一个二进制文件,你需要做一些完整性检查以保证转换回来
的字符不要越界。
  现在你需要做的就是把密钥保存在服务器上的一个安全的地方(不能够被外部访问)


15 SQL SERVER的安全性
目前用ASP编写的WEB应用中,后台数据库大部分SQL SERVER。SQL SERVER相对来说比较安全。但是也要小心地配置SQL Server.
1安装远程数据库管理有风险
 SQL Server支持从远程进行数据库的维护。在安装时你可以选择不安装,安装完成以后,你还可以通过“SQL Server Network Utility”来删除远程管理。如果你要使用远程管理,请使用TCP/IP,并将缺省的端口1433改变为其他的数值。使用远程对你可能比较方便,便是请注意一个hacker只要知道你的SQL server密码,就可以进入你的数据库。
2 改变sa的密码。
 缺省安装时,SQL SERVER的sa账号的密码为空,建议你在Enterprise SERVER中,改变sa的密码。
3 数据库登录账号不要写入ASP页面中。
16 使用最新的扫描器扫描ASP漏洞
目前可以扫描IIS漏洞的扫描器有很多,比较有名的有ISS,CIS和gnit等。下面我们以GNIT为例子。
GNIT是个功能很强的漏洞扫描器,能扫描NT的用户名和相关信息列表,扫描IIS的漏洞。
在WINNT的DOS模式下打下:
gnit <对方IP>
比如:gnit 172.1.1.1

 

GNIT开始扫描端口,从上图可知目标主机提供了HTTP,FTP,SMTP等服务,扫描完后。会在GNIT目录下生成一个HTML文件,其文件名是目标主机的IP。打开这个HTML文件,会看到对方主机的一些信息和漏洞。这些信息和漏洞包括:用户名和组的相关详细信息,开放的服务和WEB扫描的漏洞等。我们比较关心的是WEB扫描的漏洞信息:
下图是GNIT的WEB扫描一些信息,其中加粗部分是漏洞,当然有些漏洞并不准确,但不妨试试。(有必要说明下,以下我是在一台NT4。01,IIS4。0,Option PACK6.0,并且缺省安装)


 要测试这些漏洞很简单。比如:可在URL输入:
 http://someurl/iisadmpwd/aexp3.htr
───可远程管理IIS。


http://someurl/scripts/iisadmin/bdir.htr
  ────目标主机的硬盘全部目录都一览无余,并且有创建新目录的功能(不过我在测试中,并不能创建远程目录,但是能使目标主机的WEB当机)
http://someurl/scripts/tools/getdrvrs.exe
 ----可在远程主机上创建ODBC数据库,不管数据库路径和数据库是否存在。

 

 
 此外还有其它的漏洞,请网友自己测试。其解决方法请看上面的漏洞分析。
 如果用CIS扫描器,还有比较详细的漏洞分析和解决方法。请读者自己分析。
七、总结
  目前WEB数据库访问的多种技术中,比如CGI(通用网关接口)、JDBC、PHP、ASP,ASP以其开发周期短,存取方式数据库简单,运行速度快而成为众多网站程序员的首选开发技术。
但是其网络安全性也是不容忽视的。做为一个ASP开发者,你必须关注NT和IIS的安全漏洞,从上面的讨论我们可以看到ASP的很多漏洞都是由IIS所引起的。同时ASP程序员在开发自己的网站时,要注意来自ASP程序设计不当所引发的安全问题。
八、声明
本文中某些例子是从其它网站上整理的,因时间紧迫,未来得及通知作者,请见谅!

发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) 去论坛聊聊
    站内文章搜索
    点击申请点击申请点击申请点击申请点击申请点击申请点击申请点击申请