由于前段时间,学校网站渗透测试扫描目标站关键目录的时候,发现个严重问题就是我手上的软件扫描目标站的时候全部返回的都是200的页面,当然实际情况是不可能那么多的关键页面,肯定是页面做了重定向,高端的软件向神马WVS一扫网站要挂掉。所以就有了现在这个软件。软件在开发初期我连扫描用的Http接口都不知道,各种查资料,各种问,才知道了InternetOpen 这些http的接口函数,写着有遇到各种问题,发现这个接口有个天然BUG,无法解决,又是各种问才知道,必须进行异常处理,另外多线程的扫描我以前也接触少所有编写难度也非常大只能一点一点慢慢摸索,最让人郁闷的就是在线程函数里面,不能调用MFC的窗口类对象,后来改成消息出来才解决问题的。。。。。。。。。。。。。。。。。。。。。历时近一个月,反复重写,才有了现在模样,
过滤页面重定向扫描方式我主要主要是通过多次获取网页页面大小,然后对获取的大小进行排序,然后选出其中 重复页面大小最多的页面,这个页面就是网站重定向的页面。然后在每次扫描里面对这个页面大小进行判断。
还有些功能没有添加,准备慢慢写,信奉开源的原则现在把源码放出来给那些感兴趣的一起研究研究,如果有什么意见的,可以直接给我提,毕竟小弟第一次写软件没啥子经验,各位前辈高人见谅。
由于是VS写的,里面生成了一些杂七杂八的东西,太大了没法都传上来,只能把源代码放出来。
如果需要整个工程文件的可以Me我。 另外附带加2写字典给大家。
带过滤的扫描代码:
UINT FunctionWx(LPVOID pParam)
{
CMySynDlg *pDialog=(CMySynDlg *)pParam; //获得主窗口指针
HWND hWnd;
int ErrorNumber=0;
int AutoNumber=0;
long AutoLength[20];
long Maxvalue; //定位出的重定向页面
WCHAR Maxvalues[7];
hWnd=AfxGetApp()->GetMainWnd()->GetSafeHwnd(); //获得主窗口句柄
//---------------------------------设置超时
CInternetSession httpSession; //创建一个会话链接
httpSession.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,5000);
httpSession.SetOption(INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT,5000);
httpSession.SetOption(INTERNET_OPTION_SEND_TIMEOUT,5000);
//----------------------------------end
CHttpFile *httpFile=NULL; //用于文件和返回操作
INTERNET_PORT httpPort=pDialog->Ports;
CHttpConnection *pHttpConnection=httpSession.GetHttpConnection(pDialog->wangzhi,httpPort,NULL,NULL,NULL); //获得一个指向httpconnection的指针
if(pHttpConnection!=NULL)
{
CString RequestWay("HTTP_VERB_HEAD");
CString dxs("");
CString sxs("HTTP/1.1");
Couts one;
char outs[4];
outs[3]='\0';
if(filex!=FALSE) //判断新打开的字典是否为空
{
CString strHeads=_T("Content-Type: application/x-www-form-urlencoded");//http协议
CString circle("");
CString strFormData;
CString Views("");
strFormData.Format( _T("UserName= %s"),circle);
while(filex.ReadString(dxs)) //读文件字典
{
httpFile=pHttpConnection->OpenRequest(2,dxs,NULL,1,NULL,HTTP_VERSION,INTERNET_FLAG_DONT_CACHE);
CurrentFileNumber++; //当前读取字典的位置
int Gnumber=0;
errorWx: if(httpFile!=NULL)
{
//
BOOL bSendRequest;
try //捕获发生延时错误
{
bSendRequest=httpFile->SendRequest(NULL,0,(LPVOID)(LPCTSTR)strFormData,0);
}
catch(...)
{
Gnumber++;
if(Gnumber<=3)
{
goto errorWx;
}
}
if(bSendRequest==TRUE)
{
char bufQuery[32];
WCHAR ErrorsTab[32];
memset(bufQuery,0,32);
memset(ErrorsTab,0,32);
DWORD dwLengthBufQuery=sizeof(bufQuery);
DWORD Errorsh=sizeof(ErrorsTab);
if(AutoNumber<20)
{
//定位重定位页面的大小
BOOL bQueryInfo=httpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,ErrorsTab,&Errorsh,NULL);
AutoLength[AutoNumber]=_wtol(ErrorsTab);
AutoNumber++;
int k;
if(AutoNumber==19)
{
//-----------------------------------------长度信息整理
for(int i=0;i<18;i++) //对收集的网页长度进行排序
{
for(int j=0;j<18;j++)
{
if(AutoLength[j]>AutoLength[j+1])
{
k=AutoLength[j];
AutoLength[j]=AutoLength[j+1];
AutoLength[j+1]=k;
}
}
}
int n=1;
int max=1;
for(int i=0;i<19;i++)
{
if(AutoLength[i]==AutoLength[i+1])
{
n++;
}
else
{
if(n>=max)
{
max=n;
Maxvalue=AutoLength[i]; //选出重定位页面最大的那个大小
n=1;
}
}
}
//-----------------------------------------end
_ltow(Maxvalue,Maxvalues,10); //将长整形在转换会WC
filex.SeekToBegin(); // 长度收集完毕
}
}
else
{
BOOL bQueryInfo=httpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,ErrorsTab,&Errorsh,NULL);
BOOL bQueryInfoh=httpFile->QueryInfo(HTTP_QUERY_RAW_HEADERS,bufQuery,&dwLengthBufQuery,NULL);
CString ms(bufQuery); //网站访问返回结果
// CString me(ErrorsTab); //错误页面大小
Views=pDialog->wangzhi+dxs;
outs[0]=bufQuery[9]; //可以用WCHAR解决问题
outs[1]=bufQuery[10];
outs[2]=bufQuery[11];
if(strcmp(outs,"404")!=0)
{
if(strcmp(outs,"200")==0)
{
if(StrCmpCW(Maxvalues,ErrorsTab)!=0)
{
pDialog->dialog->yxd=true;
pDialog->dialog->t=&Views;
::SendMessage(hWnd,tabaddstring,0,0); //调用消息出来函数
}
}
else
{
Views=Views + " "+ms;
pDialog->dialog->yxd=false;
pDialog->dialog->t=&Views;
::SendMessage(hWnd,tabaddstring,0,0); //调用消息出来函数
}
}
}
}
}
}
//----------------------------------------------这里表示扫描结束关闭字典
AfxEndThread(0); //结束线程
//filex.Close(); //扫描结束关闭字典文件
}
}
return 0;
}
不带过滤的:
UINT FunctionTnn(LPVOID pParam)
{
CMySynDlg *pDialog=(CMySynDlg *)pParam; //获得主窗口指针
HWND hWnd;
hWnd=AfxGetApp()->GetMainWnd()->GetSafeHwnd(); //获得主窗口句柄
//---------------------------------设置超时
CInternetSession httpSession; //创建一个会话链接
httpSession.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT,5000);
httpSession.SetOption(INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT,5000);
httpSession.SetOption(INTERNET_OPTION_SEND_TIMEOUT,5000);
//----------------------------------end
CHttpFile *httpFile=NULL; //用于文件和返回操作
INTERNET_PORT httpPort=pDialog->Ports;
CHttpConnection *pHttpConnection=httpSession.GetHttpConnection(pDialog->wangzhi,httpPort,NULL,NULL,NULL); //获得一个指向httpconnection的指针
if(pHttpConnection!=NULL)
{
CString RequestWay("HTTP_VERB_HEAD");
CString dxs("");
CString sxs("HTTP/1.1");
Couts one;
char outs[4];
outs[3]='\0';
if(filex!=FALSE) //判断新打开的字典是否为空
{
CString strHeads=_T("Content-Type: application/x-www-form-urlencoded");//http协议
CString circle("");
CString strFormData;
CString Views("");
strFormData.Format( _T("UserName= %s"),circle);
EnterCriticalSection(&Wayone_cx); //进入临界区对象。
while(filex.ReadString(dxs)) //读文件字典
{
httpFile=pHttpConnection->OpenRequest(2,dxs,NULL,1,NULL,HTTP_VERSION,INTERNET_FLAG_DONT_CACHE);
LeaveCriticalSection(&Wayone_cx); //释放临界区对象。
CurrentFileNumber++; //当前读取字典的位置
int Gnumber=0;
errornn: if(httpFile!=NULL)
{
//
BOOL bSendRequest;
try
{
bSendRequest=httpFile->SendRequest(NULL,0,(LPVOID)(LPCTSTR)strFormData,0);
}
catch(...)
{
Gnumber++;
if(Gnumber<=3)
{
goto errornn;
}
}
if(bSendRequest==TRUE)
{
char bufQuery[32];
memset(bufQuery,0,32);
DWORD dwLengthBufQuery=sizeof(bufQuery);
BOOL bQueryInfo=httpFile->QueryInfo(HTTP_QUERY_RAW_HEADERS,bufQuery,&dwLengthBufQuery,NULL);
{
CString ms(bufQuery); //网站访问返回结果
Views=pDialog->wangzhi+dxs;
outs[0]=bufQuery[9];
outs[1]=bufQuery[10];
outs[2]=bufQuery[11];
if(strcmp(outs,"404")!=0)
{
if(strcmp(outs,"200")==0)
{
pDialog->dialog->yxd=true;
pDialog->dialog->t=&Views;
::SendMessage(hWnd,tabaddstring,0,0); //调用消息出来函数
}
else
{
Views=Views + " "+ms;
pDialog->dialog->yxd=false;
pDialog->dialog->t=&Views;
::SendMessage(hWnd,tabaddstring,0,0); //调用消息出来函数
}
}
}
}
}
}
//----------------------------------------------这里表示扫描结束关闭字典
AfxEndThread(0); //结束线程
//filex.Close(); //扫描结束关闭字典文件
}
}
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)