应用实时防护(RASP)是一种现代的应用安全技术,它的原理是在应用程序运行时动态分析和监视应用程序的行为,以侦测和防止潜在的应用安全漏洞和攻击。RASP 技术通常被集成到应用程序代码中或应用程序服务器中,以实现实时的安全保护。以下是 RASP 技术的一般原理:
总的来说,RASP 技术通过深入了解应用程序的内部运行时行为,实时监视和分析应用程序活动,以检测和防止潜在的应用安全漏洞和攻击。这有助于应用程序更好地自我保护并提供实时的安全防护。但需要注意,RASP 技术通常不是独立的安全解决方案,而应与其他安全控制(如WAF、IDS/IPS等)一起使用,以建立更全面的安全防御体系。
实验环境
Ubuntu 16.04 tomcat 7
以java为例的,WAVSEP的漏洞靶场
https://github.com/sectooladdict/wavsep/releases/tag/wavsep-v1.5-war
首先安装Tomcat环境、mysql
apt install tomcat7 tomcat7-admin mysql-server
mysql可能需要修改root密码
mysql -u root
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
编辑tomcat配置文件
root@ubuntu2004:/etc/tomcat7# vim tomcat-users.xml
root@ubuntu2004:/etc/tomcat7# service tomcat9 restart
添加内容:
<role rolename="manager-gui"/>
<user username="tomcat" password="XXXX" roles="manager-gui"/>
创建数据库目录y
mkdir /var/lib/tomcat7/db
chown -R tomcat7:tomcat7 /var/lib/tomcat7/db
登录后台,上传war包部署
http://192.168.X.X:8080/manager/html
初始化
http://localhost:8080/wavsep/wavsep-install/install.jsp
先看看最新版的能不能行
下载 rasp-java.tar.gz 或者 rasp-java.zip 并解压缩。之后进入到解压后的目录中执行RaspInstall.jar
wget https://github.com/baidu/openrasp/releases/download/v1.3.7/rasp-java.zip
unzip rasp-java.zip
cd rasp-2022-01-28/
# /usr/share/tomcat7是tomcat根目录,可以通过whereis tomcat7查看,一般是含有bin目录的
java -jar RaspInstall.jar -install /usr/share/tomcat7
下面就是安装成功了
root@ubuntu:~/rasp-2022-01-28# java -jar RaspInstall.jar -install /usr/share/tomcat7
OpenRASP Installer for Java app servers - Copyright 2017-2021 Baidu Inc.
For more details visit: https://rasp.baidu.com/doc/install/software.html
Detected JDK version: 1.8.0_292
Detected application server type: Tomcat
Duplicating "rasp" directory
- /usr/share/tomcat7/rasp
Make "rasp" directory writable
Generating "openrasp.yml"
- /usr/share/tomcat7/rasp/conf/openrasp.yml
- Create /usr/share/tomcat7/rasp/conf/openrasp.yml
Updating startup script
- /usr/share/tomcat7/bin/catalina.sh
Installation completed without errors.
Please restart application server to take effect.
之后重启tomcat
下面目录是官方的插件,用的nodejs写的
root@ubuntu:/usr/share/tomcat7/rasp/plugins# ls
official.js
下面链接是官方规则可以检测的漏洞类型,但有些是仅IAST商业版支持
https://rasp.baidu.com/doc/usage/web.html
不过默认没有开启阻断,需要编辑official.js开启,之后重启tomcat7
// 若 all_log 开启,表示为观察模式,会将所有的 block 都改为 log
all_log: true,
访问以下sql注入
http://192.168.XXX.XXX:8080/wavsep/active/SQL-Injection/SInjection-Detection-Evaluation-GET-500Error/Case01-InjectionInLogin-String-LoginBypass-WithErrors.jsp?username=textvalue%27%20or%207=7--%20&password=textvalue2
就会跳转到百度的页面
官方有文档
https://rasp.baidu.com/doc/dev/example.html
就是下nodejs
apt-get install -y nodejs npm
npm install -g openrasp
一个最小的SQL检测插件如下所示
const plugin_version = '2018-1000-1000'
const plugin_name = 'test-plugin'
'use strict'
var plugin = new RASP(plugin_name)
const clean = {
action: 'ignore',
message: 'Looks fine to me',
confidence: 0
}
// BEGIN ALGORITHM CONFIG //
var algorithmConfig = {}
// END ALGORITHM CONFIG //
plugin.register('sql', function (params, context) {
plugin.log('SQL query: ' + params.query)
return clean
})
plugin.log('plugin-demo: plugin loaded')
主要就是调用 plugin.register 注册了SQL查询的检测函数,并将SQL语句打印到插件日志。
params 为检查点提供的参数,如SQL语句、要读取的文件等等
context 为请求信息,如请求参数,服务器信息等等
检测函数return clean,其实就是放行,clean的action是ignore
而除了注册sql之外,还可以注册检测什么,可以看下面的链接
https://rasp.baidu.com/doc/dev/data.html
下面我随便列出一点
读取目录: directory 请求参数:request 删除文件:deleteFile 文件包含操作:include 文件上传:fileUpload 命令执行:command 代码执行(目前支持 eval/function 两种函数):eval 响应检查:response
写好之后可以用上面装好的rasp库进行测试,可以参考这里:https://rasp.baidu.com/doc/dev/test/main.html
测试用例以 JSON 格式保存
[{
"id": "ssrf_userinput_intranet",
"name": "ssrf",
"action": "block",
"params": {
"hostname": "172.16.177.120",
"ip": ["172.16.177.120"],
"url": "http://172.16.177.120/hello.action?redirect=123"
},
"context": {
"parameter": {
"url": ["http://172.16.177.120/hello.action?redirect=123"]
}
},
"description": "SSRF userinput match test"
}]
其中,action 表示期望的结果,是拦截、日志还是放行;id 是测试用例编号。其他字段主要是对请求上下文的模拟。
运行单元测试,需要两个关键参数
rasp check -d ./unitCases -p myplugin.js
实例:
tests文件夹放的是sql.json,来源:https://raw.githubusercontent.com/baidu/openrasp/191aa2e5ed8b80f9a3580d3c64dccb0e425ef373/agent/java/engine/src/test/resources/pluginUnitTest/unitCases/sql.json
#
root@ubuntu:~# cat sql.js
const plugin_version = '2018-1000-1000'
const plugin_name = 'test-plugin'
'use strict'
var plugin = new RASP(plugin_name)
const clean = {
action: 'log',
message: 'Looks fine to me',
confidence: 0
}
const attack = {
action: 'block',
message: 'sql注入攻击,阻断',
confidence: 0
}
// BEGIN ALGORITHM CONFIG //
var algorithmConfig = {}
// END ALGORITHM CONFIG //
plugin.register('sql', function (params, context) {
if(/(union.*select|sleep)/i.test(params.query))
return attack
})
plugin.log('plugin-demo: plugin loaded')
root@ubuntu:~# rasp check -d ./tests/ -p ./sql.js
OpenRASP plugin devtool - https://rasp.baidu.com
[test-plugin] plugin-demo: plugin loaded
✓ sql.json Simple userinput match test: 3ms
✓ sql.json SQL injection with hex values: 1ms
✓ sql.json SQL injection with datetime methods: 0ms
3 passing (11ms)
默认的规则好像检测不到Get参数的反射型xss,我写两个简单的,不过就检测一个script,大家可以完善,不过调试的时候,好像querystring是有url编码的,这个需要注意,不然<script
是检测不到的
const plugin_version = '2023-1015-1520'
const plugin_name = 'xss-plugin'
'use strict'
var plugin = new RASP(plugin_name)
var xssRegex = /script/i
const clean = {
action: 'log',
message: '无风险',
confidence: 0
}
const attack = {
action: 'block',
message: '有攻击,阻断',
confidence: 95
}
// BEGIN ALGORITHM CONFIG //
var algorithmConfig = {}
// END ALGORITHM CONFIG //
plugin.register('request', function (params, context) {
var querystring = context.querystring
var message = "";
plugin.log(querystring)
if (xssRegex.test(querystring)){
message = "XSS攻击:" + querystring
return attack
}
if (! message.length) {
return clean;
}
})
plugin.log('xss-plugin plugin loaded')
《基于开源软件打造企业安全》