OpenRASP 将新兴的RASP(Runtime Application Self-Protection)安全防护技术普及化,使其迅速成为企业Web安全防护中的一个重要武器,有效增强防御体系纵深和对漏洞防护的适应能力。本文主要针对OpenRASP进行原理介绍和应用。
OpenRASP介绍
百度云分析团队开源的自适应安全产品
https://rasp.baidu.com/ 文档 https://rasp.baidu.com/doc/;
目前只支持JAVA; 以-javaagent 方式启动Tomcat。
安装
java –jar raspInstall.jar <app_homedir>可源码安装;
攻击检测告警日志(XSS):
安全基线检查告警日志:
OpenRASP – 初始化流程
OpenRASP – 类字节码修改流程(instrument方式)
OpenRASP – 攻击检测流程
在进入到被修改类的函数时,调用事先注入的检测函数,最终调用pluginCheck函数。
1.pluginCheck(CheckParameter.Type type, Object params);
(type为检查的挂载点类型,params为函数原始调用参数)
2.遍历执行该挂载点类型的所有JavaScript检测函数;
3.如果检测函数没有返回block,继续执行;
4.否则记录攻击日志到alarm.log中,并执行Block操作(重定向到一个提示异常的页面)
(重定向的异常页面可通过配置修改)
OpenRASP防护原理
Tomcat安全基线检查
启动Tomcat时检查允许环境和配置是否符合安全规范
检测类:org/apache/catalina/startup/Catalina
检测函数:start (Tomacat的启动函数)
检测挂载点:startup
检测方法:没有使用js插件函数,直接通过代码检测。
是否以admin启动
是否开启http only
tomacat管理员是否有弱密码
是否删除默认webapps
SQL权限控制
检测类:java/sql/DriverManage
检测函数:getConnection
检测挂载点:sql(但没有使用)
检测方法:没有使用js插件函数,直接通过代码检测。
解析数据库类型、登录用户,限制通过管理员用户登录。
SQL慢查询检测
- SELECT 语句执行时间超过 3s(尚未实现)
- SELECT 语句一次读取数据行数超过配置的阈值
检测类:select查询结果返回的类,每种数据库的类不同,如PostgreSql的ResultSet类
检测函数:next(取下一条记录的函数)
检测挂载点:sql_result_set (但没有使用)
检测方法:没有使用js插件函数,直接通过代码检测。
如果返回结果大于配置值,认为是慢查询,提示告警:
SQL注入检测
检测类:sql语句执行类,每种数据库的类不同,如PostgreSql的PgStatement类
检测函数:execute/executeUpdate
/executeQuery/addBatch
检测挂载点:sql
检测方法:使用js插件函数检测
如下params.query为sql语句
params.server为sql数据库类型
context.parameter为http请求实体
SQL注入检测
方法一:结合Hook截获的http请求参数做检测
如果请求参数中包含了sql语句,认为是webshell-数据库管理器,block掉
从SQL语句中去掉用户输入,再和原语句进行比较,关键字个数相差太多则认为查询逻辑变化,block掉
方法二:数据库语句异常检测
禁止多条sql语句;
禁止16禁止字符串;
禁止MySQL版本号注释/*!
禁止常量比较操作
禁止执行敏感函数
方法三:简单正则匹配检测 /\bupdatexml\s*\(|\bextractvalue\s*\(|\bunion.*select.*(from|into|benchmark).*\b/i
任意文件上传检测
原理:
攻击者通过上传木马文件,直接得到WEBSHELL
形成原因:
代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。
危害:
可以得到WEBSHELL;
上传木马文件,可以导致系统瘫痪
检测类:org/apache/commons/fileupload/disk/DiskFileItem
检测函数:setHeaders
检测挂载点:fileUpload
检测方法:使用js插件函数检测,判断文件名后缀是否合法
var scriptFileRegex = /\.(jspx?|php[345]?|phtml)\.?$/i
var ntfsRegex = /::\$(DATA|INDEX)$/i // 其他的stream都没啥用
远程命令执行检测
检测类:java/lang/ProcessBuilder
检测函数:start
检测挂载点:command
检测方法:使用js插件函数检测
(不允许远程执行命令)
XSS跨站攻击检测
检测类:apache/catalina/core/ApplicationFilterChain
检测函数:doFilter
检测挂载点:request
检测方法:使用js插件函数检测
(检查http参数中是否含有特殊字段)
反序列化用户输入检测
检测类:java/io/ObjectInputStream
检测函数:resolveClass
检测挂载点:deserialization
检测方法:使用js插件函数检测
(检查反序列化的类名是否合法,使用黑名单检验)
ObjectOutputStream类的writeObject()方法实现序列化;ObjectInputStream类的readObject()方法用于反序列化。
Struts 2的Ognl表达式执行漏洞检测
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
检测类:ognl/Ognl
检测函数:parseExpression(在此函数中执行表达式)
检测挂载点:ognl
检测方法:使用js插件函数检测
(检查struct payload中是否含有非法信息)
SIEM
security information and event management(安全信息和事件管理)
OpenRASP 支持两种类型的SIEM插件,分别是 Splunk 和 Kibana,它们采集OpenRASP的日志并展示。
支持邮件告警
OneASP
总结
ØOpenRASP框架已完成,并支持大部分攻击类型的检查
Ø可新增JS插件和HooK类进行二次开发
Ø深入了解每种攻击类型,常见攻击方法,再丰富插件和代码
Ø对应用程序的性能影响需要测试
Ø管理平台: 探针的管理、插件的管理、WEB展现
Ø结合自身与WAF的优点,联合WAF进行防护