<commit_before>//
// OpenRASP 官方插件已经覆盖了一定的攻击场景，具体检测能力请根据业务来定制
// 如果想了解具体能检测哪些攻击，覆盖哪些已知漏洞，请参考下面两个链接
//
// Web 攻击检测能力说明、零规则检测算法介绍
// https://rasp.baidu.com/doc/usage/web.html
//
// CVE 漏洞覆盖说明
// https://rasp.baidu.com/doc/usage/cve.html
// 
// OpenRASP 最佳实践
// https://rasp.baidu.com/#section-books

'use strict'
var plugin  = new RASP('offical')

const clean = {
    action:     'ignore',
    message:    '无风险',
    confidence: 0
}

var forcefulBrowsing = {
    dotFiles: /\.(7z|tar|gz|bz2|xz|rar|zip|sql|db|sqlite)$/,
    nonUserDirectory: /^\/(proc|sys|root)/,
    unwantedFilenames: [
        // user files
        '.DS_Store',
        'id_rsa', 'id_rsa.pub', 'known_hosts', 'authorized_keys', 
        '.bash_history', '.csh_history', '.zsh_history', '.mysql_history',

        // project files
        '.htaccess', '.user.ini',

        'web.config', 'web.xml', 'build.property.xml', 'bower.json',
        'Gemfile', 'Gemfile.lock',
        '.gitignore',
        'error_log', 'error.log', 'nohup.out',
    ],
    unwantedDirectory: [
        '/',
        '/home',
        '/var/log',
        '/proc',
        '/sys'
    ],
    absolutePaths: [
        '/etc/shadow',
        '/etc/passwd',
        '/etc/hosts',
        '/etc/apache2/apache2.conf',
        '/root/.bash_history',
        '/root/.bash_profile',
        'C:\\Windows\\system32\\inetsrv\\MetaBase.xml'
    ]
}

var scriptFileRegex = /\.(jspx?|php[345]?|phtml)\.?$/i
var ntfsRegex       = /::\$(DATA|INDEX)$/i // 其他的stream都没啥用

// 常用函数
String.prototype.replaceAll = function(token, tokenValue) {
    var index  = 0;
    var string = this;
    
    do {
        string = string.replace(token, tokenValue);
    } while((index = string.indexOf(token, index + 1)) > -1);

    return string
}

function canonicalPath (path) {
    return path.replaceAll('/./', '/').replaceAll('//', '/').replaceAll('//', '/')
}

function basename (path) {
    var idx = path.lastIndexOf('/')
    return path.substr(idx + 1)
}

function ip2long(ipstr) {
    var items  = ipstr.split('.')
    var result = 0

    for (var i = 0; i < items.length; i ++) {
        result = (result << 8) + parseInt(items[i], 10)
    }
    return result >>> 0

    // 对于 rhino 引擎，function 回调越多，性能越差
    // return ip.split('.').reduce(function(ipInt, octet) { return (ipInt<<8) + parseInt(octet, 10)}, 0) >>> 0;
}

if (RASP.get_jsengine() !== 'v8') {
    // 在java语言下面，为了提高性能，SQLi/SSRF检测逻辑改为原生实现
    // 通过修改这个 algorithmConfig 来控制检测逻辑是否开启

    var algorithmConfig = {
        // SQL注入算法#1 - 匹配用户输入
        'sqli_userinput': {
            action: 'block'
        },
        // SQL注入算法#2 - 语句规范
        'sqli_policy': {
            action:  'block',
            feature: [
                'stacked_query', 
                'no_hex', 
                'constant_compare', 
                'version_comment', 
                'function_blacklist',
                'union_null'
            ],
            function_blacklist: [
                // 文件操作
                'load_file',
                // 时间差注入
                'benchmark', 'pg_sleep', 'sleep',
                // 探测阶段
                'is_srvrolemember',
                // 报错注入
                'updatexml', 'extractvalue',
                // 盲注
                'hex',
                // 可能误报，暂不开启 - 批量验证中
                // 'char', 'chr', 'mid', 'ord', 'ascii', 'bin'
            ]
        },
        // SSRF - 是否允许访问 aws metadata
        'ssrf_aws': {
            action: 'block'
        },
        // SSRF - 是否允许访问 dnslog 地址
        'ssrf_common': {
            action: 'block'
        },
        // SSRF - 是否允许访问混淆后的IP地址
        'ssrf_obfuscate': {
            action: 'block'
        },
        // SSRF - 是否直接禁止访问内网
        'ssrf_intranet': {
            action: 'ignore'
        }
    }

    RASP.config_set('algorithm.config', JSON.stringify(algorithmConfig))

} else {
    // 对于PHP + V8，性能还不错，我们保留JS检测逻辑

    plugin.register('sql', function (params, context) {
        var reason     = false
        var parameters = context.parameter || {}
        var tokens     = RASP.sql_tokenize(params.query, params.server)

        // console.log(tokens)

        // 算法1: 匹配用户输入
        // 1. 简单识别逻辑是否发生改变
        // 2. 识别数据库管理器   
        if (1) {
            Object.keys(parameters).some(function (name) {
                var value = parameters[name][0]

                // 请求参数长度超过10才考虑
                if (value.length <= 15) {<commit_msg>Let us release that way<commit_after>//
// OpenRASP 官方插件已经覆盖了一定的攻击场景，具体检测能力请根据业务来定制
// 如果想了解具体能检测哪些攻击，覆盖哪些已知漏洞，请参考下面两个链接
//
// Web 攻击检测能力说明、零规则检测算法介绍
// https://rasp.baidu.com/doc/usage/web.html
//
// CVE 漏洞覆盖说明
// https://rasp.baidu.com/doc/usage/cve.html
// 
// OpenRASP 最佳实践
// https://rasp.baidu.com/#section-books

'use strict'
var plugin  = new RASP('offical')

const clean = {
    action:     'ignore',
    message:    '无风险',
    confidence: 0
}

var forcefulBrowsing = {
    dotFiles: /\.(7z|tar|gz|bz2|xz|rar|zip|sql|db|sqlite)$/,
    nonUserDirectory: /^\/(proc|sys|root)/,
    unwantedFilenames: [
        // user files
        '.DS_Store',
        'id_rsa', 'id_rsa.pub', 'known_hosts', 'authorized_keys', 
        '.bash_history', '.csh_history', '.zsh_history', '.mysql_history',

        // project files
        '.htaccess', '.user.ini',

        'web.config', 'web.xml', 'build.property.xml', 'bower.json',
        'Gemfile', 'Gemfile.lock',
        '.gitignore',
        'error_log', 'error.log', 'nohup.out',
    ],
    unwantedDirectory: [
        '/',
        '/home',
        '/var/log',
        '/proc',
        '/sys'
    ],
    absolutePaths: [
        '/etc/shadow',
        '/etc/passwd',
        '/etc/hosts',
        '/etc/apache2/apache2.conf',
        '/root/.bash_history',
        '/root/.bash_profile',
        'C:\\Windows\\system32\\inetsrv\\MetaBase.xml'
    ]
}

var scriptFileRegex = /\.(jspx?|php[345]?|phtml)\.?$/i
var ntfsRegex       = /::\$(DATA|INDEX)$/i // 其他的stream都没啥用

// 常用函数
String.prototype.replaceAll = function(token, tokenValue) {
    var index  = 0;
    var string = this;
    
    do {
        string = string.replace(token, tokenValue);
    } while((index = string.indexOf(token, index + 1)) > -1);

    return string
}

function canonicalPath (path) {
    return path.replaceAll('/./', '/').replaceAll('//', '/').replaceAll('//', '/')
}

function basename (path) {
    var idx = path.lastIndexOf('/')
    return path.substr(idx + 1)
}

function ip2long(ipstr) {
    var items  = ipstr.split('.')
    var result = 0

    for (var i = 0; i < items.length; i ++) {
        result = (result << 8) + parseInt(items[i], 10)
    }
    return result >>> 0

    // 对于 rhino 引擎，function 回调越多，性能越差
    // return ip.split('.').reduce(function(ipInt, octet) { return (ipInt<<8) + parseInt(octet, 10)}, 0) >>> 0;
}

if (RASP.get_jsengine() !== 'v8') {
    // 在java语言下面，为了提高性能，SQLi/SSRF检测逻辑改为原生实现
    // 通过修改这个 algorithmConfig 来控制检测逻辑是否开启

    var algorithmConfig = {
        // SQL注入算法#1 - 匹配用户输入
        'sqli_userinput': {
            action: 'block'
        },
        // SQL注入算法#2 - 语句规范
        'sqli_policy': {
            action:  'block',
            feature: [
                'stacked_query', 
                'no_hex', 
                'constant_compare', 
                'version_comment', 
                'function_blacklist',
                'union_null'
            ],
            function_blacklist: [
                // 文件操作
                'load_file',
                // 时间差注入
                'benchmark', 'pg_sleep', 'sleep',
                // 探测阶段
                'is_srvrolemember',
                // 报错注入
                'updatexml', 'extractvalue',
                // 盲注
                'hex',
                // 可能误报，暂不开启 - 批量验证中
                // 'char', 'chr', 'mid', 'ord', 'ascii', 'bin'
            ]
        },
        // SSRF - 是否允许访问 aws metadata
        'ssrf_aws': {
            action: 'block'
        },
        // SSRF - 是否允许访问 dnslog 地址
        'ssrf_common': {
            action: 'block'
        },
        // SSRF - 是否允许访问混淆后的IP地址
        'ssrf_obfuscate': {
            action: 'block'
        },
        // SSRF - 是否直接禁止访问内网
        'ssrf_intranet': {
            action: 'ignore'
        }
    }

    RASP.config_set('algorithm.config', JSON.stringify(algorithmConfig))

} else {
    // 对于PHP + V8，性能还不错，我们保留JS检测逻辑

    plugin.register('sql', function (params, context) {
        var reason     = false
        var parameters = context.parameter || {}
        var tokens     = RASP.sql_tokenize(params.query, params.server)

        // console.log(tokens)

        // 算法1: 匹配用户输入
        // 1. 简单识别逻辑是否发生改变
        // 2. 识别数据库管理器   
        if (1) {
            Object.keys(parameters).some(function (name) {
                var value = parameters[name][0]

                // 请求参数长度超过15才考虑，任何跨表查询都至少需要20个字符，所以可以写的更大点
                // SELECT * FROM admin
                // and updatexml(....)
                if (value.length <= 15) {
{'fraction_non_alphanumeric': 0.16061249580865095, 'fraction_numerical': 0.008941544651838605, 'mean_word_length': 1.643426883308715, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 17, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 9}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4595359', 'n_tokens_mistral': 3523, 'n_tokens_neox': 3597, 'n_words': 531}