DAY66WEB 攻防-Java 安全SPEL 表达式SSTI 模版注入XXEJDBCMyBatis 注入
知识点:
1、Java安全-SQL注入-JDBC&MyBatis
2、Java安全-XXE注入-Reader&Builder
3、Java安全-SSTI模版-Thymeleaf&URL
4、Java安全-SPEL表达式-SpringBoot框架
JavaSec搭建
使用java8运行jar文件
登录账号密码均为admin
Hello-Java-Sec搭建
项目下载地址:https://github.com/j3ers3/Hello-Java-Sec
java -jar javasec-1.11.jar
登录账号密码均为admin
Java安全-SQL注入-JDBC&MyBatis
Java操作数据库的三种方式:JDBC,MyBatis,Hibernate
-Hibernate
Hibernate是一个Java持久化框架,它提供了一种将对象映射到关系数据库表的机制。通过Hibernate,开发人员可以使用面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。
-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语言连接数据库操作
updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
将一个波浪符(~)与当前用户的用户名拼接起来,并将该值作为XML节点的新值更新到XML文档中。
括号中的concat(0x7e,(SELECT user()),0x7e)表示将波浪符与当前用户的用户名连接起来。
0x7e是一个十六进制数,表示的是一个特定的 ASCII 字符,即波浪符(~)。
方式二:PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。
这种方式不能避免SQL语句的拼接
DBCTemplate是Spring对JDBC的封装,如果使用拼接语句便会产生注入
安全写法:SQL语句占位符(?) + PrepareStatement预编译
事实证明,最框架的不安全使用会造成SQL注入漏洞
大型网站不用想,小型网站有测试的价值
MyBatis( mybatis是一个优秀的基于java的持久层框架,它内部封装了 jdbc)
MyBatis支持两种参数符号,一种是#,另一种是$,#使用预编译,$使用拼接SQL。(造成注入原因也是因为使用了$进行拼接)
order by 造成SQL注入:由于使用#{}会将对象转成字符串,形成order by “user” desc造成错误,因此很多研发会采用${}来解决,从而造成注入
这个SQL语句的目的是将0x7e以及当前用户的用户名插入到指定的XML字段中,从而执行恶意操作或泄露敏感信息。
第一个参数是要更新的XML字段
第二个参数是XPath表达式 ~admin
第三个参数是要更新的新值。
在这个例子中,使用了concat函数来拼接字符串,包括特殊字符0x7e(波浪符)以及查询当前用户的子查询select user()。
like 注入:模糊搜索时,直接使用’%#{q}%’ 会报错,部分研发图方便直接改成’%${q}%'从而造成注入.
in注入:in之后多个id查询时使用 # 同样会报错,从而造成注入.
白盒审计
在真实情况下,需要先分析源码里用了那种方式操作数据库(JDBC还是MyBatis),然后在针对性看代码写法,JDBC如果没用到安全写法,那么就容易出现问题。MyBatis看代码用了$还是#,#号就可以不用看了,$符号就看是不是在order by、like、in里面,在就恭喜了
代码审计案例:inxedu后台MyBatis注入
1、配置安装源码
直接把整个请求数据包放到txt给sqlmap跑即可
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外部实体解析
全局搜索关键类的名字,看看有没有参数可控
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/
/doc/xxxx,xxxx会被匹配到存储进入document,然后就被模板引擎解析,就会造成RCE
payload:__${T(java.lang.Runtime).getRuntime().exec("open -a Calculator")}__::.x
漏洞代码 - url作为视图
返回的字符串实际上是一个相对路径,会被Thymeleaf引擎解析为对应的模板文件路径。根据约定,默认情况下,Thymeleaf会在src/main/resources/templates目录下查找对应的模板文件。
因此,如果存在src/main/resources/templates/lang/en.html文件,Thymeleaf引擎会对该模板文件进行处理,并将处理结果返回给客户端。如果该文件不存在,可能会导致异常或返回一个默认的错误页面。
白盒角度测试Thymeleaf SSTI
先确定thymeleaf的版本,漏洞利用版本:3.0.0 至 3.0.11 版本
正则表达式搜索特征:正则表达式在线测试 | 菜鸟工具
思路一:全局搜索 return "
Java安全-SPEL表达式注入-SpringBoot框架
SpEL ( Spring Expression Language )表达式注入 , 是一种功能强大的表达式语言、用于在运行时查询和操作对象图,由于未对参数做过滤可造成任意命令执行。
1、Spring表达式
2、Spring反射绕过
参考:https://www.freebuf.com/vuls/197008.html
Spring表达式
漏洞原理:参数可控,standarEvaluationContext包含上下文对象,可以提供对象,函数,类等信息给Spel表达式,getValue()执行表达式
Spring反射绕过(黑名单过滤)
原有注入手段失效
SPEL表达式注入思路
1、通过maven,全局搜索一下 org.springframework.expression.spel.standard
2、搜索关键字 SpelExpressionParser 创造SPEL表达式对象的
3、再看看有没getValue(),SPEL表达式执行函数
4、有没有可控参数