- 开发一个检测插件
- 开发环境准备
- 插件入门
- 调用插件接口
- 拦截危险操作
- 实现检测逻辑
- 测试插件
- 安装插件
- 注意事项
开发一个检测插件
本节介绍如何开发并发布一个 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
