90
社区成员




数据流漏洞规则
- 下面是一条内置数据流规则,用于识别ssrf漏洞
- MATCH (sourceNode:DubboServiceArg|ThriftHandlerArg|SpringControllerArg|JspServiceArg|WebServletArg|WebXmlServletArg|WebXmlFilterArg|JaxrsArg|HttpHandlerArg)
- MATCH
- (sinkNode)
- WHERE 'url' IN sinkNode.selectors OR
- 'URL' IN sinkNode.selectors OR
- sinkNode.AllocationClassName = 'URL' OR
- sinkNode.AllocationClassName = 'GetMethod' OR
- 'HttpGet' IN sinkNode.selectors OR
- ('execute' IN sinkNode.selectors AND 'CloseableHttpClient' IN sinkNode.receiverTypes) OR
- ('execute' IN sinkNode.selectors AND 'CloseableHttpAsyncClient' IN sinkNode.receiverTypes) OR
- ('connect' IN sinkNode.selectors AND 'Jsoup' IN sinkNode.receiverTypes) OR
- ('create' IN sinkNode.selectors AND 'URI' IN sinkNode.receiverTypes) OR
- ('read' IN sinkNode.selectors AND 'ImageIO' IN sinkNode.receiverTypes) OR
- ('executeMethod' IN sinkNode.selectors AND 'HttpClient' IN sinkNode.receiverTypes) OR
- ('Get' IN sinkNode.selectors AND 'Request' IN sinkNode.receiverTypes) OR
- ('Post' IN sinkNode.selectors AND 'Request' IN sinkNode.receiverTypes) OR
- ('exchange' IN sinkNode.selectors AND 'RestTemplate' IN sinkNode.receiverTypes) OR
- ('get' IN sinkNode.selectors AND 'HttpUtil' IN sinkNode.receiverTypes) OR
- ('post' IN sinkNode.selectors AND 'HttpUtil' IN sinkNode.receiverTypes) OR
- 'openConnection' IN sinkNode.receivers
- MATCH
- p = (sourceNode)-[ *..30]->(sinkNode)
- RETURN
- p AS path
如何查询source点
- 铲子自动识别了一些常见框架的请求入口,并打上标签,用户可以利用这些标签快速找到source点,比如下列标签:DubboServiceArg|ThriftHandlerArg|SpringControllerArg|JspServiceArg|WebServletArg|WebXmlServletArg|WebXmlFilterArg|JaxrsArg|HttpHandlerArg
- 用户如果觉得这些标签不满足需求,也可以根据各种条件找到自己关心的source点,比如springmvc可以利用RequestMapping GetMapping等注解查找,比如下边这条规则就是用注解进行识别的source点
- MATCH
- (sourceNode:Argument)
- WHERE
- 'RequestMapping' IN sourceNode.methodAnnotations OR
- 'GetMapping' IN sourceNode.methodAnnotations OR
- 'PostMapping' IN sourceNode.methodAnnotations OR
- 'DeleteMapping' IN sourceNode.methodAnnotations OR
- 'PutMapping' IN sourceNode.methodAnnotations
- MATCH
- (sinkNode)
- WHERE
- 'queryForMap' IN sinkNode.selectors OR
- 'queryForObject' IN sinkNode.selectors OR
- 'queryForList' IN sinkNode.selectors OR
- 'queryForRowSet' IN sinkNode.selectors OR
- 'batchUpdate' IN sinkNode.selectors OR
- ('query' IN sinkNode.selectors AND 'JdbcTemplate' IN sinkNode.receiverTypes)
- MATCH
- p = (sourceNode)-[*..30]->(sinkNode)
- RETURN
- p AS path
如何查询sink点
- 识别sink点通常可以使用方法调用时的方法名,方法所属对象的对象名,方法所属对象的类型名,构造方法的方法名等,也可以多个条件组合使用
- 比如runtime.exec(cmd),这样一个调用,runtime是receiver exec是selector Runtime是receivertype ,我们就可以根据receiver receivertype selector等信息找到cmd作为sink点
- 当然也有可能sink点处的数据流节点是receiver,比如 ssrf中的,url.openConnection(), 这里的url作为污点,并不是方法调用的参数,而是receiver,规则会有所不同,写法可以参考铲子的内置规则
一条参考规则如下:
- MATCH
- (sourceNode:DubboServiceArg|ThriftHandlerArg|SpringControllerArg|JspServiceArg|WebServletArg|WebXmlServletArg|WebXmlFilterArg|JaxrsArg|HttpHandlerArg)
-
- MATCH
- (sinkNode)
- WHERE
- ('exec' IN sinkNode.selectors AND 'Runtime' IN sinkNode.receiverTypes) OR
- sinkNode.AllocationClassName = 'ProcessBuilder' OR
- ('command' IN sinkNode.selectors AND 'ProcessBuilder' IN sinkNode.receiverTypes) OR
- ('eval' IN sinkNode.selectors AND 'ScriptEngine' IN sinkNode.receiverTypes) OR
- ('evaluate' IN sinkNode.selectors AND 'GroovyShell' IN sinkNode.receiverTypes)
- MATCH
- p = (sourceNode)-[*..30]->(sinkNode)
- RETURN
- p AS path
关于净化处理
单节点漏洞规则
- 下面是一条单节点规则,用于识别actuator配置不当
- MATCH
- (sinkNode:YmlKeyValue|PropertiesKeyValue)
- WHERE
- sinkNode.name = 'management.endpoints.web.exposure.include' AND (sinkNode.value = '*' OR sinkNode.value CONTAINS 'heapdump' )
- RETURN
- sinkNode AS path
- 下面是一条单节点规则,用于识别fastjson版本问题
- MATCH
- (sinkNode:PomDependency)
- WHERE
- sinkNode.groupId = 'com.alibaba' AND sinkNode.artifactId = 'fastjson' AND sinkNode.version < '1.2.83'
- RETURN
- sinkNode AS path
-
- 当然也可以使用正则,或前缀/后缀匹配,类似下边这样(pom.xml中的依赖组件版本号如果使用了${},铲子会自动识别并替换成真实版本号)
- MATCH
- (sinkNode:PomDependency)
- WHERE
- sinkNode.groupId = 'org.apache.shiro' AND sinkNode.artifactId = 'shiro-core' AND sinkNode.version =~ '1\\.(1|2|3|4|5|6|7|8|9|1[0-1]|12)\\..*'
- RETURN
- sinkNode AS path
-
- MATCH
- (sinkNode:PomDependency)
- WHERE
- sinkNode.groupId = 'org.apache.struts' AND sinkNode.artifactId = 'struts2-core' AND sinkNode.version STARTS WITH '2.'
- RETURN
- sinkNode AS path
-
加载自定义规则
规则完整结构
- MATCH
- (sourceNode:DubboServiceArg|ThriftHandlerArg|SpringControllerArg|JspServiceArg|WebServletArg|WebXmlServletArg|WebXmlFilterArg|JaxrsArg|HttpHandlerArg)
-
- MATCH
- (sinkNode)
- WHERE
- 'setByteStream' IN sinkNode.selectors OR
- ( 'read' IN sinkNode.selectors AND 'SAXReader' IN sinkNode.receiverTypes) OR
- ( 'parse' IN sinkNode.selectors AND 'XMLReader' IN sinkNode.receiverTypes) OR
- ( 'build' IN sinkNode.selectors AND 'SAXBuilder' IN sinkNode.receiverTypes) OR
- ( 'parse' IN sinkNode.selectors AND 'SAXParser' IN sinkNode.receiverTypes) OR
- ( 'parse' IN sinkNode.selectors AND 'DocumentBuilder' IN sinkNode.receiverTypes) OR
- ( 'parse' IN sinkNode.selectors AND 'Digester' IN sinkNode.receiverTypes) OR
- ( 'parseText' IN sinkNode.selectors AND 'DocumentHelper' IN sinkNode.receiverTypes) OR
- ( 'unmarshal' IN sinkNode.selectors AND 'Unmarshaller' IN sinkNode.receiverTypes)
- MATCH
- p = (sourceNode)-[*..30]->(sinkNode)
- RETURN
- p AS path
-
- /*
- Chanzi-Separator
- <h5>漏洞描述</h5>
- XXE(XML外部实体攻击,XML External Entity Attack)漏洞是一种影响XML处理器的安全漏洞。当XML文档允许引用外部实体时,如果没有得到正确处理,攻击者可以利用这个漏洞来读取服务器上的文件、执行拒绝服务攻击(DoS),甚至在某些情况下执行远程服务器的攻击。以下是XXE漏洞的基本原理:
- XML和DTD:XML文档可以使用DTD(文档类型定义)来定义合法的文档结构。DTD可以是内部定义的,也可以引用外部定义。
- 外部实体引用:在DTD中,可以定义外部实体,这些实体可以引用外部资源,如文件系统中的文件或网络上的资源。
- 漏洞触发:如果XML解析器配置不当,允许引用外部实体,攻击者可以构造特殊的XML输入,其中包含对外部实体的引用。
- 文件读取:攻击者可以利用XXE漏洞尝试读取服务器上的敏感文件,例如配置文件、源代码等。
- 拒绝服务攻击:攻击者可以构造一个指向大型文件或无限循环的外部实体引用,导致XML解析器消耗大量资源,从而实现拒绝服务攻击。
- 远程服务器攻击:如果允许通过网络引用外部资源,攻击者可以利用这一点来发起远程服务器攻击,例如尝试读取远程服务器上的文件。
- 配置不当的XML解析器:很多XML解析器默认允许处理外部实体,如果应用程序没有正确配置解析器,就可能受到XXE攻击。
- 防御不足:如果应用程序没有实施足够的安全措施来防止XXE攻击,就可能容易受到攻击。
- Chanzi-Separator
- <h5>修复建议</h5>
- 修复Java中XXE(XML外部实体攻击)漏洞需要开发者采取以下步骤和策略:
- 禁用外部实体处理:确保XML解析器配置为禁用对外部实体的解析。这可以通过设置XML处理器的属性来完成。
- 使用安全的解析器:选择不容易受到XXE攻击的XML解析器,例如使用不支持外部实体解析的解析器。
- 输入验证:对所有传入的XML数据进行严格的验证,确保它们不包含对外部实体的引用。
- 使用白名单:如果应用程序需要引用外部资源,使用白名单来限制可引用的资源,只允许特定的、已知安全的资源被引用。
- 限制DTD使用:避免在XML文档中使用DTD(文档类型定义),或者确保DTD是安全的,不包含对外部实体的引用。
- 错误消息处理:确保错误消息不会泄露有关XML解析器配置或文件路径的信息。
- 使用安全的库:使用成熟的库来处理XML数据,避免使用可能容易受到XXE攻击的旧库。
- 使用安全的XML处理API:在Java中,使用如javax.xml.parsers.DocumentBuilder时,确保禁用外部实体的解析,例如通过设置DocumentBuilderFactory的setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)。
- 配置安全的XML解析器:如果使用SAX解析器,确保配置它以避免解析外部实体,例如使用setEntityResolver方法来返回一个自定义的EntityResolver。
- 使用 json 代替 xml:针对用户的输入,通常建议优先考虑使用 json 格式代替 xml 格式,有更高的安全性,xml 由于其复杂的 dtd、scheme 等机制更易受到攻击。
- Chanzi-Separator
- */
-