SPI Dynamics' WebInspect应用程序安全评估工具帮你识别已知和未知的网页层漏洞。它还能检测到Web服务器的配置属性,以及进行常见的网页攻击,例如参数注入、跨网站脚本、目录游走等等。
有趣的WebInspect的加密方法
从去年开始,我开始关注这款优秀的WEB application漏洞扫描软件,这东西除了速度比较慢以外,其它的功能真是不错。我当时研究了一下,被它的用来验证license的那几个dll给吓住了,里面霍然写着一串RSA的key,我就认为这东西除了暴力破解,应该没有其它方法。最近研究了一下RSA算法,正打算用它练练手。结果我仔细研究一下这东西,发现居然出奇的简单,令我真是感到非常不可思议。
WebInspect在你注册后,会给你发一个key文件,这个就是所谓的注册文件,里面有你的注册信息,然后webinspect在启动的时候会把它解密,读出里面的信息,所用的加密函数是hostinfo.crypt,这个函数即用来加密也用来解密,所谓的加密无非就是简单的xor了一下,我也写了一个程序,来调用这个crypt:
- #include "stdafx.h"
- #include
- #include
- int Crypt (
- int encrypt,
- int key,
- int keysize,
- int msg,
- int msgsize);
- typedef int(WINAPI* pCrypt) (
- int encrypt,
- int key,
- int keysize,
- int msg,
- int msgsize);
- void main(int argc, char* argv[])
- {
- HINSTANCE m_hDll;
- pCrypt m_crypt;
- FILE *stream;
- FILE *fout;
- int numread;
- char key[50];
- char msg[2048];
- memset((void *)msg,0,2048);
- m_hDll=LoadLibrary("hostinfo.dll");
- if (m_hDll < (HINSTANCE) HINSTANCE_ERROR)
- {
- m_hDll = NULL;
- return;
- }
- m_crypt = (pCrypt)GetProcAddress(m_hDll, "crypt");
- if( (stream = fopen( "mmm1.key", "r+b" )) != NULL ) //这里是我的原始注册文件
- {
- numread = fread( key, sizeof( char ), 50, stream );//头上50字节是key
- if (numread != -1)
- printf("key is : %s",key);
- numread = fread( msg, sizeof( char ), 2048, stream );//剩下的是加密后的内容
- if (numread != -1){
- m_crypt(1,(int )key,50,(int )msg,numread); //参数1的值等于1的,是解密
- if( (fout = fopen( "mmm1.txt", "w+t" )) != NULL )
- {
- fwrite(key,sizeof(char),50,fout);
- fwrite(msg,sizeof(char),numread,fout);
- fclose(fout);
- }
- printf("msg is : %s",msg);
- }
- fclose(stream);
- }
- return ;
- }
#p#
运行一下,我们得到了mmm1.txt,它的内容如下:
- //下面是文件内容
- 33383131352E31313131363839383135 SPI License File
- Company=xxx ltd.
- Contact=xxx xxx-
- Address1=xxx#
- Address2=
- City=xxx
- State=
- PostalCode=xxx
- Country=CHN
- Phone=xxxx
- Fax=
- EMail=
- [Start IP Range]
- 216.183.127.201 216.183.127.201
- [End IP Range]
- MaxPageCount=0
- MaxIssueCount=0
- ValidFrom=5/8/2004
- ValidTo=5/23/2007
- RequireHTTPSFeedback=True
- VerificationURL=https://download.spidynamics.com/spiXMLVulDB/spiXMLVulDB.asp
- MaxABS=20
- MaxGlobal=10
- IPCount=1
- IPScanCount=0
- Product=
- ProductionKey=True
- MacIDs=
- IPScanned=216.183.127.201:19
- End SPI License File
- //结束
#p#
需要注意的是”Start IP Range”,这里修改一下,比如把216.183.127.201 216.183.127.201改成 0.0.0.0 255.255.255.255,还有个地方要改一下IPCount,把1改成一个较大的数,这个是用来控制你扫描的IP总数的。做了这两下修改(需要注意的是这个是unix格式的文本文件,windows下存的时候要小心),我们就要把它加密回去,呵呵,同样用hostinfo.crypt(这是crypt吗?应该叫encode才对):
- #include "stdafx.h"
- #include
- #include
- int Crypt (
- int encrypt,
- int key,
- int keysize,
- int msg,
- int msgsize);
- typedef int(WINAPI* pCrypt) (
- int encrypt,
- int key,
- int keysize,
- int msg,
- int msgsize);
- void main(int argc, char* argv[])
- {
- HINSTANCE m_hDll;
- pCrypt m_crypt;
- FILE *stream;
- FILE *fout;
- int numread;
- char key[50];
- char msg[2048];
- memset((void *)msg,0,2048);
- m_hDll=LoadLibrary("hostinfo.dll");
- if (m_hDll < (HINSTANCE) HINSTANCE_ERROR)
- {
- m_hDll = NULL;
- return;
- }
- m_crypt = (pCrypt)GetProcAddress(m_hDll, "crypt");
- if( (stream = fopen( "mmm1.txt", "r+b" )) != NULL )
- {
- numread = fread( key, sizeof( char ), 50, stream );
- if (numread != -1)
- printf("key is : %s",key);
- numread = fread( msg, sizeof( char ), 2048, stream );
- if (numread != -1){
- m_crypt(0,(int )key,50,(int )msg,numread);// //参数1的值等于0的,是加密
- if( (fout = fopen( "mmm2.key", "w+b" )) != NULL )
- {
- fwrite(key,sizeof(char),50,fout);
- fwrite(msg,sizeof(char),numread,fout);
- fclose(fout);
- }
- }
- fclose(stream);
- }
- return ;
- }
这样我们得到了mmm2.key,放到webinspect里验证一下,果然没问题,但是改过的key在线升级的时候会无效,所以正确的办法是申请一个试用的key,在线把程序升级好,再用这个修改后的key.