参数说明

若要实现检测逻辑,插件需要先注册检测方法,e.g SQL注入检测插件可注册 sql 类型的回调

  1. plugin.register('sql', function(params, context) {
  2. // 实现你的检测逻辑
  3. })

具体插件可注册的回调类型 type,以及回调参数 params 的样例如下

数据库查询

  1. type = sql
  2. params = {
  3. "server": "mysql / oracle / pgsql / mssql / sqlite",
  4. "query": "select * from users",
  5. }

读取目录

  1. type = directory
  2. params = {
  3. "path": "/home/servers/tomcat/webapps/mywar/../../../../../../../../../etc/",
  4. "realpath": "/etc/",
  5. "stack": [
  6. "java.lang.ProcessBuilder.start",
  7. "sun.reflect.NativeMethodAccessorImpl.invoke0",
  8. "sun.reflect.NativeMethodAccessorImpl.invoke",
  9. "sun.reflect.DelegatingMethodAccessorImpl.invoke",
  10. ...
  11. ]
  12. }

请求参数

当应用接受到请求时,插件可以对请求进行拦截

  1. type = request
  2. params = {}

这里不会传递任何参数,如果需要获取请求相关信息,请使用 API接口

读取文件

  1. type = readFile
  2. params = {
  3. "path": "/home/servers/tomcat/webapps/mywar/../../../../../../../../../etc/hosts",
  4. "realpath": "/etc/hosts"
  5. }

写入文件

出于性能考虑,OpenRASP 目前只会提供文件名和绝对路径两个参数

注意:

  • tomcat 等应用服务器,在部署war包时,暂时不会触发这个回调
  • 对于NTFS数据流,e.g abc.php::$DATA,插件看到的 name 可能是 abc.php::$DATA,realpath 可能是 c:\inetpub\wwwroot\abc.php
    1. type = writeFile
    2. params = {
    3. "name": "abc.jsp",
    4. "realpath": "/home/tomcat/webapps/ROOT/abc.jsp"
    5. }

文件包含操作

url 可能是协议(filehttp等等),也能是相对路径(/abc/abc.txt

支持的文件包含方式如下,

  • Java - JSTL import 方式
    • 只有 url 里出现了 :// 且不为 / 开头时,我们才会调用插件
  • PHP - include/require/include_once/require_once 四种方式
    • 如果 url 里包含 :// 时,调用插件
    • 如果文件以 .php 或者 .inc 结尾,或者真实路径在 webroot 下面,不会进入插件
    • 其他情况进入插件
      具体参数
  1. # Java 示例
  2. type = include,
  3. params = {
  4. url: "file:///etc/passwd",
  5. function: "jstl_import",
  6. realpath: "/etc/passwd"
  7. }
  8. # PHP 示例
  9. type = include,
  10. params = {
  11. url: "/home/webroot/footer/../../../../../../../../../etc/passwd",
  12. function: "require_once",
  13. realpath: "/etc/passwd"
  14. }

WebDAV 操作

目前仅支持 MOVECOPY 两种方法

  1. type = webdav,
  2. params = {
  3. "source": "/home/rsync/apache-tomcat-7.0.78/webapps/webdav/1.txt",
  4. "dest": "/home/rsync/apache-tomcat-7.0.78/webapps/webdav/1.jsp"
  5. }

文件上传

目前,OpenRASP 支持 org.apache.commons.fileupload 上传组件(SpringMVC、Struts 底层使用)

出于性能考虑,OpenRASP 只会提取文件前 4 KB 的内容,若要获取更多字节,请参考配置文档

  1. type = fileUpload
  2. params = {
  3. "filename": "a.jsp",
  4. "content": "<% ... %>"
  5. }

命令执行

从 v0.40 开始,命令参数统一改为字符串

  1. type = command,
  2. params = {
  3. "stack": [
  4. "java.lang.ProcessBuilder.start",
  5. "sun.reflect.NativeMethodAccessorImpl.invoke0",
  6. "sun.reflect.NativeMethodAccessorImpl.invoke",
  7. "sun.reflect.DelegatingMethodAccessorImpl.invoke",
  8. ...
  9. ]
  10. "command": "/bin/sh -c 'whoami; ls; '"
  11. }

XML 外部实体引用

目前,PHP不支持XXE检测

  1. type = xxe
  2. params = {
  3. "entity": "file:///etc/passwd"
  4. }

Struts OGNL 表达式解析

注意: 为了减少性能影响,仅当表达式长度超过 30 时才会调用插件。可手动 ognl.expression.minlength 选项来进行调整

  1. type = ognl
  2. params = {
  3. "expression": "_memberAccess" //ognl表达式
  4. }

RMI 反序列化

  1. type = deserialization
  2. params = {
  3. "clazz": "InvokerTransformer" //被反序列化对象的类型
  4. }

服务器端 HTTP 请求

支持的请求方式包含如下 (对应 function 字段),

  • JDK 中的 URL.openConnection 的方式 (url_open_connection)
  • commons-httpclient 框架请求方式 (commons_http_client)
  • httpclient 框架请求方式 (http_client)
    1. type = ssrf
    2. params = {
    3. "url": "http://0x7f.0x0.0x0.0x1:8080/v1/api/get", // http 请求的 url
    4. "hostname": "0x7f.0x0.0x0.0x1" // http 请求的 hostname
    5. "ip": ["1.1.1.1", "2.2.2.2"] // 无法解析则为空;只解析 IPv4 地址
    6. "function": "commons_http_client"
    7. }

原文: https://rasp.baidu.com/doc/dev/data.html