neo4j使用说明

1、简介

neo4j是一种nosql的图数据库,由节点、属性、关系、标签构成,存储图结构。使用Cypher作为查询语言(类似于关系数据库中的sql)。

官方文档:什么是 Neo4j?- 入门 - Neo4j 文档

2、使用

2.1、安装

可参考:Neo4j详细介绍及使用教程-CSDN博客

安装包:【免费】neo4j-desktop-2.1.1-x64资源-CSDN下载

2.2、使用

安装好以后,直接打开neo4j desktop。创建实例,创建数据库。

2.2、代码属性图

使用neo4j,绘制以下代码属性图。

Step1、创建节点

sql 复制代码
// 类节点
CREATE (HashMap:Class {name: 'java.util.HashMap',access:'public'});
CREATE (Object:Class {name: 'java.lang.Object',access:'public'});
CREATE (EnumMap:Class {name: 'java.util.EnumMap',access:'public'}); 
CREATE (URL:Class {name: 'java.net.URL',access:'public'});
CREATE (URLStreamHandler:Class {name: 'java.net.URLStreamHandler',access:'public'});
CREATE (InetAddress:Class {name: 'java.net.InetAddress',access:'public'});

// 接口节点
CREATE (Serializable:Interface {name: 'java.io.Serializable',access:'public'});

// 方法节点
CREATE (readObject:Method {name: 'java.util.HashMap.readObject()',access:'private',returnType:'void'});
CREATE (hash:Method {name: 'java.util.HashMap.hash()',access:'default',returnType:'int',modifier:'static final'});
CREATE (hashCode:Method {name: 'java.util.EnumMap.hashCode()',access:'public',returnType:'int'});
CREATE (entryHashCode:Method {name: 'java.util.EnumMap.entryHashCode()',access:'private',returnType:'int'});
CREATE (hashcode:Method {name: 'java.lang.Object.hashcode()',access:'public',returnType:'int',modifier:'native'});
CREATE (hashcode:Method {name: 'java.net.URL.hashcode()',access:'public',returnType:'int',modifier:'synchronized'});
CREATE (hashcode:Method {name: 'java.net.URLStreamHandler.hashcode()',access:'protected',returnType:'int'});
CREATE (hashcode:Method {name: 'java.net.URLStreamHandler.getHostAddress()',access:'protected',returnType:'java.net.InetAddress'});
CREATE (hashcode:Method {name: 'java.net.InetAddress.getByName()',access:'public',returnType:'java.net.InetAddress',modifier:'static'});

Step2、创建节点之间的关系

sql 复制代码
// 类与方法、类与接口、类与类之间的关系
MATCH (c:Class {name:'java.util.HashMap'}),(m:Method {name:'java.util.HashMap.readObject()'}) CREATE (c)-[:has]->(m);
MATCH (c:Class {name:'java.util.HashMap'}),(m:Method {name:'java.util.HashMap.hash()'}) CREATE (c)-[:has]->(m);
MATCH (c:Class {name:'java.util.EnumMap'}),(m:Method {name:'java.util.EnumMap.hashCode()'}) CREATE (c)-[:has]->(m);
MATCH (c:Class {name:'java.util.EnumMap'}),(m:Method {name:'java.util.EnumMap.entryHashCode()'}) CREATE (c)-[:has]->(m);
MATCH (c1:Class {name:'java.util.EnumMap'}),(c2:Class {name:'java.lang.Object'}) CREATE (c1)-[:extend]->(c2);
MATCH (c:Class {name:'java.lang.Object'}),(m:Method {name:'java.lang.Object.hashcode()'}) CREATE (c)-[:has]->(m);
MATCH (c1:Class {name:'java.net.URL'}),(c2:Class {name:'java.lang.Object'}) CREATE (c1)-[:extend]->(c2);
MATCH (c:Class {name:'java.net.URL'}),(m:Method {name:'java.net.URL.hashcode()'}) CREATE (c)-[:has]->(m);
MATCH (c:Class {name:'java.net.URLStreamHandler'}),(m:Method {name:'java.net.URLStreamHandler.hashcode()'}) CREATE (c)-[:has]->(m);
MATCH (c:Class {name:'java.net.URLStreamHandler'}),(m:Method {name:'java.net.URLStreamHandler.getHostAddress()'}) CREATE (c)-[:has]->(m);
MATCH (c:Class {name:'java.net.InetAddress'}),(i:Interface {name:'java.io.Serializable'}) CREATE (c)-[:interface]->(i);
MATCH (c:Class {name:'java.net.InetAddress'}),(m:Method {name:'java.net.InetAddress.getByName()'}) CREATE (c)-[:has]->(m);

// 类中方法与方法之间的关系
MATCH (m1:Method {name:'java.util.HashMap.readObject()'}),(m2:Method {name:'java.util.HashMap.hash()'}) CREATE (m1)-[:call]->(m2);
MATCH (m1:Method {name:'java.util.HashMap.hash()'}),(m2:Method {name:'java.lang.Object.hashcode()'}) CREATE (m1)-[:call]->(m2);
MATCH (m1:Method {name:'java.util.EnumMap.hashCode()'}),(m2:Method {name:'java.util.EnumMap.entryHashCode()'}) CREATE (m1)-[:call]->(m2);
MATCH (m1:Method {name:'java.net.URL.hashcode()'}),(m2:Method {name:'java.net.URLStreamHandler.hashcode()'}) CREATE (m1)-[:call]->(m2);
MATCH (m1:Method {name:'java.net.URLStreamHandler.hashcode()'}),(m2:Method {name:'java.net.URLStreamHandler.getHostAddress()'}) CREATE (m1)-[:call]->(m2);
MATCH (m1:Method {name:'java.net.URLStreamHandler.getHostAddress()'}),(m2:Method {name:'java.net.InetAddress.getByName()'}) CREATE (m1)-[:call]->(m2);

// 别名(多态)之间的关系
MATCH (m1:Method {name:'java.lang.Object.hashcode()'}),(m2:Method {name:'java.util.EnumMap.hashCode()'}) CREATE (m1)-[:alias]->(m2);
MATCH (m1:Method {name:'java.lang.Object.hashcode()'}),(m2:Method {name:'java.net.URL.hashcode()'}) CREATE (m1)-[:alias]->(m2);

Step3、查看创建好的关系图

sql 复制代码
MATCH (n)-[r]->(m) RETURN n, r, m;

3、总结

在做反序列化漏洞检测研究时,需要查找gadget chain。因为方法调用链,调用关系之间是图结构,所以考虑使用图数据库neo4j存储方法调用链会更方便。

4、参考资料

什么是 Neo4j?- 入门 - Neo4j 文档

相关推荐
星川皆无恙1 天前
基于知识图谱的百科问答系统:Django + Neo4j 与实现
人工智能·python·机器学习·自然语言处理·django·知识图谱·neo4j
Sayai3 天前
Neo4j 社区版高可用实战:DRBD 块级复制 + Keepalived 虚拟 IP 冷备切换(附启停 SOP 与脑裂防范)
运维·neo4j·keepalived·高可用·drbd
喵本喵叁肆7 天前
diffprivlib 中文实战教程 · 第8讲:实战——从零改造一个 DP 模型
python·neo4j·差分隐私
智码看视界9 天前
大数据架构解析—数据血缘:从 SQL 解析到字段级溯源,搭建大数据平台数据治理底座
数据治理·neo4j·元数据·sql解析·数据血缘·datalineage·sqlglot
quweiie19 天前
Neo4j Community 安全访问配置总结
数据库·centos·neo4j
Sayai23 天前
Neo4j 内嵌模式(Embedded)实战:Java 嵌入式 vs 服务端部署的写入性能对比与 GC 调优
java·开发语言·性能优化·neo4j·图数据库
AugustRed1 个月前
Neo4j 图数据库原理 + 应用场景简单介绍
数据库·neo4j
Thomas.Sir1 个月前
第34课:TensorFlow|TF迁移学习实战【调用官方预训练模型微调训练】
tensorflow·neo4j·迁移学习
xing-xing2 个月前
Neo4j学习总结
neo4j
JOker_Chu_2 个月前
知识图谱详解:从图结构、关系建模到查询与应用
数据库·知识图谱·database·neo4j