- 开发一个检测插件
- 开发环境准备
- 插件入门
- 调用插件接口
- 拦截危险操作
- 实现检测逻辑
- 测试插件
- 安装插件
- 注意事项
开发一个检测插件
本节介绍如何开发并发布一个 JavaScript 插件
开发环境准备
下载并安装 NodeJS,Ubuntu 可使用 sudo apt-get install -y nodejs 命令进行安装
安装插件开发工具 openraspjs
npm install -g openrasp
备注: 从 0.20
版本开始,你可以在 Mac 下开发插件了
插件入门
OpenRASP 已经实现了SQL查询和Web请求的关联,并利用这一点实现了零规则的注入检测,具体可参考官方插件。在这个例子里,我们只是介绍插件如何编写。
下面,我们来尝试编写一个SQL注入检测插件
一个最小的插件代码如下,
var plugin = new RASP('demo')
function checkSQL(params, context) {
var result = {
action: 'ignore',
message: '无风险',
confidence: 90
}
return result
}
plugin.register('sql', checkSQL)
plugin.log('初始化成功')
我们首先初始化了一个名为 demo
插件实例 plugin
然后实现了SQL注入检测函数checkSQL(params, context)
, 其中
- params 为对应的参数,e.g SQL查询语句、要执行的命令等
context 为请求的上下文,e.g 请求参数,服务器信息等
最后调用plugin.register(type, callback)
将SQL注入检测函数注册到插件系统中,其中type 为当前的行为,e.g SQL查询、命令执行、文件读取等
- callback 为检测函数
params
的详细介绍请看 参数说明
调用插件接口
在检测函数里,我们可以获取context
中的请求信息,或者调用plugin.log(…args)
打印日志,
e.g 打印当前的 User-Agent 信息到日志里
function checkSQL(params, context) {
var result = {
action: 'ignore',
message: '无风险',
confidence: 90
}
plugin.log('Request parameter is:', context.parameter)
plugin.log('SQL query is: ', params.query)
return result
}
详细API说明请看 接口说明
拦截危险操作
当检测函数完成执行,它需要告知自适应组件是否要拦截这个操作,
这通过返回不同的 action 值来实现,
参数值 | 说明 |
---|---|
ignore | 忽略,不进行任何操作 |
block | 危险操作,需要拦截 |
log | 不确定是否是危险操作,只记录日志,不拦截 |
在拦截攻击的同时,你还可以返回一个 confidence
字段,用于标注这个检测结果的可靠性
这个字段通常用来过滤报警,官方插件的范围是 90~100
,越高报警的可靠性越高
实现检测逻辑
下面我们来实现SQL注入的检测,这里只是抛砖引玉,
function checkSQL(params, context) {
var result = {
action: 'ignore',
message: '无风险',
confidence: 90
}
if(/union.*select.*from.*information_schema/.test(params.query)) {
result.action = 'block',
result.message = 'SQL 注入, 获取数据库结构'
}
return result
}
测试插件
具体请参考 单元测试
安装插件
如何将插件安装到服务上,请参考 安装插件
注意事项
- 插件环境可能不支持某些最新的 JavaScript 语法,请使用openrasjs进行语法检查
- 插件不能使用与平台相关的全局对象,只能使用 JavaScript 标准内建对象,请参考: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects
- 插件可以像编写 Node.js 程序一样引入其他模块,然后通过 webpack 或 browserify 等工具打包成一个文件,但是注意不能引入与平台相关的模块,例如:Node.js 的 http 模块
原文: https://rasp.baidu.com/doc/dev/example.html