OrientDB远程代码执行漏洞利用与分析
OrientDB数据库是一个支持分布式的NoSQL数据库,主要针对文档以及图形等进行检索,通过研究发现其默认配置admin、reader和writer三个角色,在处理where”或“fetchplan”或“order by”函数时,由于在OrientDB中有一个执行groovy函数,groovy包装类没有沙箱,暴露了系统函数,因此我们可以运行我们想要的任何命令。该漏洞在国外被命名为CVE-2017-11467,本文主要对该漏洞的分析方法和实战进行探讨。
0×01.OrientDB简介
OrientDB是分布式兼具文档数据库的灵活性和图形数据库管理链接能力的可深层次扩展的文档-图形数据库管理系统,也是可升级,高性能的操作NoSQL数据库。可选无模式、全模式或混合模式下。支持许多高级特性,诸如ACID事务、快速索引,原生和SQL查询功能。可以JSON格式导入、导出文档。若不执行昂贵的JOIN操作的话,如同关系数据库可在几毫秒内可检索数以百G的链接文档图,其最新版本为OrientDB v2.2.26。官方网站:http://orientdb.com和https://github.com/Orientechnologies。
0×02. OrientDB基础
2.1OrientDB的一些基本概念
Classes : 类比关系型数据库系统中的Table与传统文档数据库的collections。这个概念来自于OOP(Object-oriented programming)的理念。class用于定义数据结构的模型。
Record:record是OrientDB中最小的加载和存储的单位。record有四种类型:Document、RecordBytes(BLOB)、Vertex、Edge。
Document:是OrientDB中最灵活的record。Document支持schema-less,schemal-full,schema-mixed,即可以在定义数据结构的时候指定属性及约定条件,也可以不指定。它通过create class语法来定义一个数据结构。
Vertex:在OrientDB的graph模型下,每个结点叫作Vertex,每个Vertex也是一个Document。
Edge:在OrientDB的graph模型下,连接两个Vertex的边叫作Edge。Edge是有向性的而且仅能连接两个Vertex。
Clusters : 用于存储record。每个数据库最多有32767个cluster。每个class都必须至少有一个对应的cluster。默认情况下OrientDB会自动为每个class创建与当前cpu核数相同的cluster,其中有一个默认的cluster。
Cluster Selection:当新增加一条reocrd时OrientDB会根据cluster section为这条记录选择一个cluster。cluster section有四条类型:detault、round-robin、balanced、local。
Record ID :每个record都有一个record id。 record id的格式如下:
#:。
Relationships: OrientDB中不使用join,它通过在每个reocrd中定义一个关系类型的属性来维护关系。这个关系属性存储的实际是record id,就像定义一个指针在内存中将两个record联系起来。
Inheritance & Polymorphic: OrientDB支持面向对象的继承和多态特性。
2.2OrientDB的特性
OrientDB是用Java语言实现的,运行在JVM之上。
Multi-Model:OrientDB支持多种模型:Key/Value, Object, Document, and Graph。
Multi-Master Replication: OrientDB集群部署时每个点都是Master,每个Master上都有完整的数据。一旦一个Master上的数据发生变更,会将发生变更的数据同步通知其它Master。
Extended SQL : OrientDB支持大部分标准的SQL,同时在标准的SQL之上扩展了部分功能以方便图的操作。
Easy Integration :使用teleporter可以很容易地将数据从RDBMS迁移到OrientDB上。
OOP:OrientDB定义数据结构的Class符合OOP(Object-oriented programming)的理念,支持继承和多态的特性。
2.3OrientDB的SQL
在写图数据库的SQL时,第一步是要确认起始点(这个也是图数据库比较耗时的地方),一旦起始点确认后,我们便可以近乎物理连接的方式查询这个起始点相关联的数据。
基本的SQL:OrientDB支持大部分标准的SQL查询。
例如:SELECT FROM Person WHERE name LIKE ‘Luk%’
Traverse:traverse语法可以遍历获取一个record联结的reocrd。它比select使用起来更简单和快速。
例如:RAVERSE out(“Friend”) FROM #10:1234 WHILE $depth
Match:match是一种表述力很强的查询语法结构,类比Neo4j的Cypher语法结构。它以一种说明式的方式来查询。
例如:
MATCH {class: Person, as: person, where: (name = 'John' AND surname = 'Doe')}.both('Friend').both('Friend')
{as: friendOfFriend} RETURN person, friendOfFriend
0×03. OrientDB漏洞 CVE-2017-11467分析
3.1搭建测试环境
(1)docker安装,这个安装的是最新版本,有可能修补了漏洞
docker run -d --name orientdb -p 2424:2424 -p 2480:2480 -e ORIENTDB_ROOT_PASSWORD=root orientdb:latest
(2)linux下安装orientdb
wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux
tar -zxf orientdb-community-2.2.22.tar.gz
mv orientdb-community-2.2.22 /opt/orientdb
/opt/orientdb/bin/server.sh
useradd -r orientdb -s /sbin/nologin
chown -R orientdb:orientdb /opt/orientdb
chmod 640 /opt/orientdb/config/orientdb-server-config.xml
cp /opt/orientdb/bin/orientdb.service /etc/systemd/system
vi /etc/systemd/system/orientdb.service
修改User=ORIENTDB_USER Group=ORIENTDB_GROUP ExecStart=$ORIENTDB_HOME/bin/server.sh为:
User=orientdb Group=orientdb ExecStart=/opt/orientdb/bin/server.sh
systemctl daemon-reload
systemctl enable orientdb
systemctl status orientdb
OrientDB数据库是一个支持分布式的NoSQL数据库,主要针对文档以及图形等进行检索,通过研究发现其默认配置admin、reader和writer三个角色,在处理where”或“fetchplan”或“order by”函数时,由于在OrientDB中有一个执行groovy函数,groovy包装类没有沙箱,暴露了系统函数,因此我们可以运行我们想要的任何命令。该漏洞在国外被命名为CVE-2017-11467,本文主要对该漏洞的分析方法和实战进行探讨。
0×01.OrientDB简介
OrientDB是分布式兼具文档数据库的灵活性和图形数据库管理链接能力的可深层次扩展的文档-图形数据库管理系统,也是可升级,高性能的操作NoSQL数据库。可选无模式、全模式或混合模式下。支持许多高级特性,诸如ACID事务、快速索引,原生和SQL查询功能。可以JSON格式导入、导出文档。若不执行昂贵的JOIN操作的话,如同关系数据库可在几毫秒内可检索数以百G的链接文档图,其最新版本为OrientDB v2.2.26。官方网站:http://orientdb.com和https://github.com/Orientechnologies。
本文来自无奈人生安全网
0×02. OrientDB基础
2.1OrientDB的一些基本概念
Classes : 类比关系型数据库系统中的Table与传统文档数据库的collections。这个概念来自于OOP(Object-oriented programming)的理念。class用于定义数据结构的模型。
Record:record是OrientDB中最小的加载和存储的单位。record有四种类型:Document、RecordBytes(BLOB)、Vertex、Edge。
Document:是OrientDB中最灵活的record。Document支持schema-less,schemal-full,schema-mixed,即可以在定义数据结构的时候指定属性及约定条件,也可以不指定。它通过create class语法来定义一个数据结构。
Vertex:在OrientDB的graph模型下,每个结点叫作Vertex,每个Vertex也是一个Document。
Edge:在OrientDB的graph模型下,连接两个Vertex的边叫作Edge。Edge是有向性的而且仅能连接两个Vertex。
Clusters : 用于存储record。每个数据库最多有32767个cluster。每个class都必须至少有一个对应的cluster。默认情况下OrientDB会自动为每个class创建与当前cpu核数相同的cluster,其中有一个默认的cluster。
www.wnhack.com
Cluster Selection:当新增加一条reocrd时OrientDB会根据cluster section为这条记录选择一个cluster。cluster section有四条类型:detault、round-robin、balanced、local。
Record ID :每个record都有一个record id。 record id的格式如下:
#:。
Relationships: OrientDB中不使用join,它通过在每个reocrd中定义一个关系类型的属性来维护关系。这个关系属性存储的实际是record id,就像定义一个指针在内存中将两个record联系起来。
Inheritance & Polymorphic: OrientDB支持面向对象的继承和多态特性。
2.2OrientDB的特性
OrientDB是用Java语言实现的,运行在JVM之上。
Multi-Model:OrientDB支持多种模型:Key/Value, Object, Document, and Graph。
Multi-Master Replication: OrientDB集群部署时每个点都是Master,每个Master上都有完整的数据。一旦一个Master上的数据发生变更,会将发生变更的数据同步通知其它Master。
Extended SQL : OrientDB支持大部分标准的SQL,同时在标准的SQL之上扩展了部分功能以方便图的操作。
Easy Integration :使用teleporter可以很容易地将数据从RDBMS迁移到OrientDB上。
OOP:OrientDB定义数据结构的Class符合OOP(Object-oriented programming)的理念,支持继承和多态的特性。
2.3OrientDB的SQL
在写图数据库的SQL时,第一步是要确认起始点(这个也是图数据库比较耗时的地方),一旦起始点确认后,我们便可以近乎物理连接的方式查询这个起始点相关联的数据。
基本的SQL:OrientDB支持大部分标准的SQL查询。
例如:SELECT FROM Person WHERE name LIKE ‘Luk%’
Traverse:traverse语法可以遍历获取一个record联结的reocrd。它比select使用起来更简单和快速。
例如:RAVERSE out(“Friend”) FROM #10:1234 WHILE $depth
Match:match是一种表述力很强的查询语法结构,类比Neo4j的Cypher语法结构。它以一种说明式的方式来查询。
例如:
MATCH {class: Person, as: person, where: (name = 'John' AND surname = 'Doe')}.both('Friend').both('Friend')
{as: friendOfFriend} RETURN person, friendOfFriend
0×03. OrientDB漏洞 CVE-2017-11467分析
3.1搭建测试环境
(1)docker安装,这个安装的是最新版本,有可能修补了漏洞
docker run -d --name orientdb -p 2424:2424 -p 2480:2480 -e ORIENTDB_ROOT_PASSWORD=root orientdb:latest
(2)linux下安装orientdb
wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux
www.wnhack.com
tar -zxf orientdb-community-2.2.22.tar.gz
mv orientdb-community-2.2.22 /opt/orientdb
/opt/orientdb/bin/server.sh
useradd -r orientdb -s /sbin/nologin
chown -R orientdb:orientdb /opt/orientdb
chmod 640 /opt/orientdb/config/orientdb-server-config.xml
cp /opt/orientdb/bin/orientdb.service /etc/systemd/system
vi /etc/systemd/system/orientdb.service
修改User=ORIENTDB_USER Group=ORIENTDB_GROUP ExecStart=$ORIENTDB_HOME/bin/server.sh为:
User=orientdb Group=orientdb ExecStart=/opt/orientdb/bin/server.sh
systemctl daemon-reload
systemctl enable orientdb
systemctl status orientdb
无奈人生安全网