• 开发一个检测插件
    • 开发环境准备
    • 插件入门
    • 调用插件接口
    • 拦截危险操作
    • 实现检测逻辑
    • 测试插件
    • 安装插件
    • 注意事项

    开发一个检测插件

    本节介绍如何开发并发布一个 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