Skip to content

Latest commit

 

History

History
62 lines (43 loc) · 2.39 KB

README.md

File metadata and controls

62 lines (43 loc) · 2.39 KB

webxml

介绍

这是一个简单的利用neo4j进行污点分析的练习项目, 主要是为了简单上手neo4j。 这个demo通过读取java web应用中的web.xml文件,解析其中的filter和servlet等信息。并将其以节点的形式保存在neo4j数据库中,通过neo4j的数据可视化后,我们可以直观的查看一个web应用的路由结构(这里只考虑了web.xml中的路由,通过注解指定的路由无法解析)

例如:在非verbose模式下到处对应的web.xml数据存入neo4j中,在neo4j bloom中执行 MATCH p=()-[]->() RETURN p

image-1

通过简单查看可以发现存在一些鉴权filter,例如图中选中的CheckIsLoggedFilter

假设对代码进行代码审计后,我们发现某些servlet存在命令执行风险,例如一个名为evalServlet, 这时开启verbose模式,先在neo4j中执行

MATCH (n) DETACH DELETE n

删除先前插入数据,再导入数据。通过执行

MATCH path=()-[r:evalServlet]->()
RETURN path

或者(需要安装neo4j的apoc拓展)

match (source:App) // 添加where语句限制source函数
match (sink:Servlet {name:"evalServlet"}) // 添加where语句限制sink函数
call apoc.algo.allSimplePaths(source, sink, 'evalServlet>', 20) yield path // 查找具体路径,20代表深度,可以修改
return path

image-2

image-3

可以看到存在一条路径绕开了CheckIsLoggedFilter这个鉴权filter。通过此方式辅助查找未授权等漏洞

我们也可以在情况更加复杂的情况下执行

MATCH (n:Filter WHERE n.name="CheckIsLoggedFilter")<-[rels:evalServlet]-()
with collect(rels) as rels
MATCH path=()-[r:evalServlet where none (r1 in rels where r.url=r1.url)]->()
return path

筛选未经过CheckIsLoggedFilter节点的可达路径

image-4

同理如果我们要查找经过CheckIsLoggedFilter的路径,我们可以执行

MATCH (n:Filter WHERE n.name="CheckIsLoggedFilter")<-[rels:evalServlet]-()
with collect(rels) as rels
MATCH path=()-[r:evalServlet where not none(r1 in rels where r.url=r1.url)]->()
return path

image-5