首页 > 编程学习 > web木马检测系统的设计与实现

web木马检测系统的设计与实现

发布时间:2022/10/1 9:04:52

目 录
1.绪论 1
1.1 研究背景及意义 1
1.1.1研究背景 1
1.1.2 研究意义 1
1.2 国内外研究现状 2
1.2.1 国外研究现状 2
1.2.2 国内研究现状 2
1.3 论文组织结构 3
2.关键技术 4
2.1缓冲区溢出 4
2.2 SQL注入攻击 5
2.3基于脚本的DDos攻击 6
2.4其他的不安全因素 6
3.Web的木马检测系统的设计 8
3.1体系结构 8
3.2处理流程 9
3.3对客户端访问的响应 11
3.4策略引擎的设计 13
3.4.1策略的属性 14
3.4.2策略的加载 15
3.4.3策略的调度 16
3.4.4策略的接口 16
4.Web的木马检测系统的实现 17
4.1基于ISAPI 的解析及响应模块的实现 17
4.1.1使用ISAPI Filter获取Http报文信息 18
4.1.2使用ISAPI进行Http响应 19
4.1.3在服务器上的安装配置ISAPI Filter 22
4.2基于VC++的策略实现 22
4.2.1对策略的封装 22
4.2.2 VC++策略脚本示例 23
4.3基于xml的策略管理 24
5.系统运行过程及测试 25
6.结论 27
参考文献 28
致 谢 29
3.Web的木马检测系统的设计
由于系统要对客户端发送的Http报文进行分析,这需要对Http报文进行解析,Http报文解析的方式主要有两种:
(1)自解析:系统对原始数据报文自行解析;
(2)由Web服务器进行解析,需要时系统通过Web服务器提供的接口查询。
方式(1)可以提供比方式(2)更好的移植性,但这种报文解析的方式需要一种截获下层原始报文的能力,这可以通过截获传输层或网际层报文的实现,由于我们将这套系统定位于仅针对Web访问的木马检测,我们对Http协议外的报文并不关心,所以我们选择方式(2)作为我们的Http报文解析方案,即通过Web服务器提供的接口仅仅截获应用层的Http报文。
要对客户端发起的请求进行完全的监控光靠检测客户端的行为是不够的,因为这样我们只知道客户端发起什么样的请求但无法知道服务器端是如何对客户端进行响应的。一次完整的Http会话既然包括客户端发送请求和服务器端对请求的响应,那么只有监控服务器端响应的内容后,才能知道这次Http会话何时结束。如果Web服务器提供Http报文封装的接口,则在对客户端进行响应时我们也尽量调用Web服务器的这些接口而不是自己组装Http报文。
这样,这套木马检测系统的核心便是其策略引擎, 通过强大而灵活的策略引擎来实现特征检测或者异常检测。下面将介绍这个Web的木马检测系统的具体体系结构和处理流程。
本文分析了当前流行的针对Web服务器的安全威胁,设计并实现了一套保护Web服务器安全的轻量级的木马检测系统。提供方便的编写策略脚本的机制,方便Web服务器管理员配置安全的Web服务器环境。同时应该注意到这套系统仅仅是针对Web服务器安全的,一套整体的安全网络环境是需要靠网络中每一个独立单元都具有较好的安全配置才能实现的。这套木马检测系统也存在一些需要完善的地方,本文转载自http://www.biyezuopin.vip/onews.asp?id=14730比如目前直接使用编辑配置文件和策略脚本的方式来更新配置,如果能使用UI管理策略和系统,能使这套系统的使用更加方便。在本系统的策略中,由于对客户端的识别的粒度是基于IP的,这样会导致一些策略对使用NAT的用户造成影响。由于采用灵活的策略插入机制,所以可以通过策略增加系统的功能。


#include "..\include\globals.hpp"
#include "IClient.hpp"
#include "IClientToLua.hpp"
#include "Logger.hpp"


/**
 * Get HTTP Header from a client
 * @param lua_State *L
 * @return 
 * 
 */
static int l_GetHeader(lua_State *L)
{
	const char *header = lua_tostring(L, -1);
	lua_rawgeti(L, -2, 0);
	IClient *client = (IClient *)lua_touserdata(L, -1);
	lua_settop(L, 0);
	lua_pushstring(L, (client->GetHeader(header)).c_str());
	return 1;
}

/**
 * Set HTTP Header to client
 * @param lua_State *L
 * @return
 */
static int l_SetHeader(lua_State *L)
{
	const char *value = lua_tostring(L, -1);
	const char *header = lua_tostring(L, -2);
	lua_rawgeti(L, -3, 0);
	IClient *client = (IClient *)lua_touserdata(L, -1);
	lua_settop(L, 0);
	client->SetHeader(header, value);
	return 0;
}

static int l_AddHeader(lua_State *L)
{
	const char *value = lua_tostring(L, -1);
	const char *header = lua_tostring(L, -2);
	lua_rawgeti(L, -3, 0);
	IClient *client = (IClient *)lua_touserdata(L, -1);
	lua_settop(L, 0);
	client->AddHeader(header, value);
	return 0;
}

static int l_SendMsg(lua_State *L)
{
	const char *msg = lua_tostring(L, -1);
	const char *status = lua_tostring(L, -2);
	lua_rawgeti(L, -3, 0);
	IClient *client = (IClient *)lua_touserdata(L, -1);
	lua_settop(L, 0);
	client->SendMsg(status, msg);

	return client->ConnectClose();
}

static int l_SendFile(lua_State *L)
{
	const char *filename = lua_tostring(L, -1);
	const char *status = lua_tostring(L, -2);
	lua_rawgeti(L, -3, 0);
	IClient *client = (IClient *)lua_touserdata(L, -1);
	lua_settop(L, 0);
	client->SendFile(status, filename);
	return client->ConnectClose();
}

static int l_Redirct(lua_State *L)
{
	const char * url = lua_tostring(L,-1);		
	lua_rawgeti(L, -2, 0);
	IClient *client = (IClient *)lua_touserdata(L, -1);
	lua_settop(L, 0);
	client->Redirct(url);	
	return client->ConnectClose();
}

static int l_UrlRewrite(lua_State *L)
{
	const char *newUrl = lua_tostring(L,-1);		
	lua_rawgeti(L, -2, 0);
	IClient *client = (IClient *)lua_touserdata(L, -1);
	lua_settop(L, 0);
	client->UrlRewrite(newUrl);	
	return 0;
}

static int l_GetServerVariable(lua_State *L)
{
	const char *svName = lua_tostring(L,-1);
	lua_rawgeti(L, -2, 0);
	IClient *client = (IClient *)lua_touserdata(L, -1);
	lua_settop(L, 0);
	string sv = client->GetServerVariable(svName);
	lua_pushstring(L,sv.c_str());
	return 1;
}

static int l_Logger(lua_State *L)
{
	const char *msg = lua_tostring(L, -1);
	//WebFirewall::logger.Append(msg);
	Logger logger;
	logger.Append(msg);
	return 0;
}

static const struct luaL_reg webfilewall_lib []= {
		{"GetHeader", l_GetHeader},
		{"SetHeader", l_SetHeader},
		{"AddHeader", l_AddHeader},
		{"SendMsg", l_SendMsg},
		{"SendFile", l_SendFile},
		{"Redirct", l_Redirct},
		{"UrlRewrite", l_UrlRewrite},
		{"GetServerVariable",l_GetServerVariable},
		{"Logger", l_Logger},
		{NULL, NULL} /* sentinel */
};

static int ref;

int client_openlib(lua_State *L)
{	
	const luaL_reg *l = webfilewall_lib;
	lua_newtable(L);
	for (; l->name; l++)
	{	
		lua_pushcfunction(L, l->func);
		lua_setfield(L, -2, l->name);		   
	}	
	ref = luaL_ref(L, LUA_REGISTRYINDEX);
	return 0;
}

void client_call(lua_State *L, IClient *client, const char *func)
{
	lua_getglobal(L, func);
	lua_newtable(L);
	lua_pushlightuserdata(L, client);
	lua_rawseti(L, -2, 0);
	lua_pushvalue(L, -1);
	lua_setmetatable(L, -2);
	lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
	lua_setfield(L, -2, "__index");
	
	if (lua_pcall(L, 1, 0, 0) != 0) 
	{
		const char *err = lua_tostring(L,-1);
	}
}



在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号