开发一个检测插件

本节介绍如何开发并发布一个 JavaScript 插件

开发环境准备

  • 下载并安装 NodeJS,Ubuntu 可使用 sudo apt-get install -y nodejs 命令进行安装

  • 安装插件开发工具 openraspjs

  1. npm install -g openrasp

备注: 从 0.20 版本开始,你可以在 Mac 下开发插件了

插件入门

OpenRASP 已经实现了SQL查询和Web请求的关联,并利用这一点实现了零规则的注入检测,具体可参考官方插件。在这个例子里,我们只是介绍插件如何编写。

下面,我们来尝试编写一个SQL注入检测插件

一个最小的插件代码如下,

  1. var plugin = new RASP('demo')
  2. function checkSQL(params, context) {
  3. var result = {
  4. action: 'ignore',
  5. message: '无风险',
  6. confidence: 90
  7. }
  8. return result
  9. }
  10. plugin.register('sql', checkSQL)
  11. 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 信息到日志里

  1. function checkSQL(params, context) {
  2. var result = {
  3. action: 'ignore',
  4. message: '无风险',
  5. confidence: 90
  6. }
  7. plugin.log('Request parameter is:', context.parameter)
  8. plugin.log('SQL query is: ', params.query)
  9. return result
  10. }

详细API说明请看 接口说明

拦截危险操作

当检测函数完成执行,它需要告知自适应组件是否要拦截这个操作,

这通过返回不同的 action 值来实现,

参数值 说明
ignore 忽略,不进行任何操作
block 危险操作,需要拦截
log 不确定是否是危险操作,只记录日志,不拦截

在拦截攻击的同时,你还可以返回一个 confidence 字段,用于标注这个检测结果的可靠性

这个字段通常用来过滤报警,官方插件的范围是 90~100,越高报警的可靠性越高

实现检测逻辑

下面我们来实现SQL注入的检测,这里只是抛砖引玉,

  1. function checkSQL(params, context) {
  2. var result = {
  3. action: 'ignore',
  4. message: '无风险',
  5. confidence: 90
  6. }
  7. if(/union.*select.*from.*information_schema/.test(params.query)) {
  8. result.action = 'block',
  9. result.message = 'SQL 注入, 获取数据库结构'
  10. }
  11. return result
  12. }

测试插件

具体请参考 单元测试

安装插件

如何将插件安装到服务上,请参考 安装插件

注意事项

  • 插件环境可能不支持某些最新的 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