能够预防xml注入漏洞攻击(以下可以防止sql注入攻击的方式是)

http://www.itjxue.com  2023-02-23 10:02  来源:未知  点击次数: 

xmldecoder反序列化漏洞分析

java提供了很多xml文档解析的类库,包括dom4j,domj,SAX等库,可以进行xml文档的解析,这些库的使用不当,会导致XXE漏洞的发生,但是这些类库中,SAX库允许自己去定义整个xml文档处理的handler,可以在xml文档解析的过程中,对解析出来的节点进行一些操作

而为java反序列化定义的handler,会导致一些java反序列化的问题的发生

poc:

获取到文件内容之后,用XMLDecoder解析,在下面调用了readObject方法

进入readObject方法中

这里对文档进行了解析,而XMLDecoder.this.handler其实就是

DocumentHandler

这个handler很重要,所有反序列化的操作都是在这个类中进行的

之类通过SAXParserFactory实例化了一个SAXParser的实例,并且调用了其中的parse方法

复现过java XXE漏洞的师傅应该看见过SAXParser的用法,它允许用户自己去定义处理文档的handler

可以看到,用户可以将自己定义的Handler,只要这个类继承了DefaultHandler,可以看一下官网的例子:

自己的Handler可以在解析的不同阶段,进行不同的操作,这个特点就让xml文档成为了可以进行java序列化的载体,DocumentHandler这个handler就是处理xml文档反序列化的

接下来,调用SAXParser对xml文档进行解析,在对一些属性的设置以后,真正的解析流程在XML11Configuration这个类中的parse方法中开始

首先是对实体的解析:

因为我们的文档中并没有xml实体,所以这一步不用关注

之后进行文档的解析

进入到scanDocument函数中

这里通过next函数,解析了文档,并且返回当前解析的状态,整个文档的具体解析过程在XMLDocumentFragmentScannerImpl这个类的ContentDriver类中,里面的解析过程很复杂,具体的解析过程不要过于关注,重点在解析出来的结果的处理上

当发现当前的文档为根节点的时候,调用fContentDriver的next方法,在这里进行ROOT节点的解析

一直到XMLDocumentFragmentScannerImpl的scanStartElement方法中

在之类对文档进行解析,调用scanName解析出来第一个节点名为:java

之后寻找java节点的结束字符在哪,并且解析出来中间的所有属性

在解析结束以后,会将这个节点中的所有属性添加到fAttributes中

最后来到startElement函数中,可以认为fElementQName就是我们的节点名称,fAttributes就是这个节点中所有属性组成的一个字典

最后调用到DocumentHandler的startElement才到真正反序列化的地方

到这里,一个节点的解析就算结束了,头都看大了,先附上一张调用栈,再到DocumentHandler中看具体的反序列化过程

在最后,调用了DocumentHandler.startElement函数,我们进入看一下

在这里会根据不同的节点实例化不同的节点Handler

this.handlers中寻找java节点对应的handler,可以看一下this.handlers里面所有的handler都是什么,它是一个HashMap,在属性中有定义 private final MapString, Class? extends ElementHandler handlers = new HashMap();

在构造方法中,对handlers进行了赋值

这也就是XMLDecoder所有支持的节点类型,不同的节点会调用不同的ElementHandler进行处理,我们的java节点,应该是被JavaElementHandler处理的

回到startElement的方法中

在实例化JavaElementHandler类以后,调用了setParent将上一次的handler保存,这一步相当于将每一个节点的处理类串成了一个链

这一步获取到所有的节点属性,并且调用处理handler自己实现的addAttribute方法,可以看一下JavaElementHandler的addAttribute

这里通过我们设置的class属性的内容,获取了对应的类,也就是java.beans.XMLDecoder类的class

之后调用对应handler的startElement,而java的handler没有操作,所以进行下一个节点的解析

下一个节点是object,具体解析流程就不再分析

object对应的Handler为ObjectElementHandler,可以发现,startElement中的重点其实就是每个Handler的addAttribute方法和startElement方法

调用父类的addAttribute方法

这一步获得了ProcessBuilder的class

处理handler:ArrayElementHandler

addAttribute:

这里定义了数组元素的类型和数组大小

startElement:

这里实例化了一个数组元素,并且返回了一个ValueObject对象

void节点比较特殊,void节点其实是object节点的一个子类,它本身没有定义什么方法

我们可以不用过多的关注void节点的处理规则,只需要理解它的作用就是声明一个变量就可以,可以这么理解:

在一个节点处理结束以后,会由内向外依次调用每个节点的endElement方法

比如我们的poc

在解析完touch的string节点的之后,触发string的endElement,主要就是将将值设置为StringElementHandler的属性

之后向ArrayElementHandler中的数组添加进去这个String,对每个element都会调用getValueObject方法,而其中

void节点的endElement很有意思

看一下getContextBean方法

这里会获取上一个Handler的ValueObject的值,而这个ValueObject的value就是我们在属性中定义的对象,void节点的上一个节点是array节点,我们在array节点中定义了一个大小为2的String数组,所以获取到的ValueObject就为这个数组

因为我们只设置了void的属性为index="0",所以会进入到var4=set的条件中

最后的Express类,相当于是对var3这个对象调用其中的var4的方法,参数为var2,这样,就为这个String数组赋值了第一个值为touch

来到第二个void标签

当来到 void method="start"/

进入到getContextBean

在这里调用了parent的getValueObject方法,也就是object标签

获取了ObjectElementHandler中的ProcessBuilder对象

最后调用start执行命令

如何修改http请求才能触发xml注入漏洞?

xmlhttprequest就是ajax的基础方法,他就是向另一个类做请求的过程。举例说,A利用xmlhttprequest向B请求数据,请求的同时申明接收方法,B在回传的时候,由这个接收方法进行接收处理。现在你要用xmlhttprequest得到另一个页面传来的参数,这本身就不符合javascript的传统。xmlhttprequest本身是javascript的一部分,如果另一个页面传来的参数是用post的,javascript死活也得不到。或者你直接用ajax,到你说的另一个页面去取这参数倒是可以,让他接受恐怕不行。

xml的优点

XML具有以下特点:

(1) XML可以从HTML中分离数据。即能够在HTML文件之外将数据存储在XML文档中,这样可以使开发者集中精力使用HTML做好数据的显示和布局,并确保数据改动时不会导致HTML文件也需要改动,从而方便维护页面。

XML也能够将数据以“数据岛”的形式存储在HTML页面中,开发者依然可以把精力集中到使用HTML格式化和显示数据上。

(2) XML可用于交换数据。基于XML可以在不兼容的系统之间交换数据,计算机系统和数据库系统所存储的数据有多种形式,对于开发者来说,最耗时间的工作就是在遍布网络的系统之间交换数据。把数据转换为XML格式存储将大大减少交换数据时的复杂性,还可以使这些数据能被不同的程序读取。

(3) XML可应用于B2B中。例如在网络中交换金融信息, 目前XML正成为遍布网络的商业系统之间交换信息所使用的主要语言,许多与B2B有关的完全基于XML的应用程序正在开发中。

(4)利用XML可以共享数据。XML数据以纯文本格式存储,这使得XML更易读、更便于记录、更便于调试,使不同系统、不同程序之间的数据共享变得更加简单。

(5) XML可以充分利用数据。XML是与软件、硬件和应用程序无关的,数据可以被更多的用户、设备所利用,而不仅仅限于基于HTML标准的浏览器。其他客户端和应用程序可以把XML文档作为数据源来处理,就像操作数据库一样,XML的数据可以被各种各样的“阅读器”处理。

(6) XML可以用于创建新的语言。比如,WAP和WML语言都是由XML发展来的。WML(Wireless Markup Language,无线标记语言)是用于标识运行于手持设备上(比如手机)的Intemet程序的工具,它就采用了XML的标准。

XML 无所不在,XML 标准突飞猛进的开发进度,以及大批的软件开发商采用这个标准的日新月异的速度时,真的是不禁感叹这真是令人叹为观止。目前,XML 在 Web 中起到的作用不会亚于一直作为 Web 基石的 HTML。

XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

扩展资料:

XML 与 HTML 的主要差异:

1、XML 不是 HTML 的替代。

2、XML 和 HTML 为不同的目的而设计:

3、XML 被设计为传输和存储数据,其焦点是数据的内容。

4、HTML 被设计用来显示数据,其焦点是数据的外观。

5、HTML 旨在显示信息,而 XML 旨在传输信息。

XML的意思:

1、XML 指可扩展标记语言(EXtensible?Markup?Language)

2、XML 是一种标记语言,很类似 HTML

3、XML 的设计宗旨是传输数据,而非显示数据

4、XML 标签没有被预定义。您需要自行定义标签。

5、XML 被设计为具有自我描述性。

6、XML 是?W3C 的推荐标准

参考资料来源:百度百科-XML

Python常见的漏洞都有什么?

首先是解析XML漏洞。如果您的应用程序加载和解析XML文件,那么您可能正在使用XML标准库模块。有一些针对XML的常见攻击。大多数是DoS风格(旨在破坏系统而不是窃取数据)。这些攻击很常见,尤其是在解析外部(即不受信任的)XML文件时。一种这样的攻击是“十亿笑”,因为加载的文件包含许多(十亿)“笑”。您可以加载XML实体文件,当XML解析器尝试将此XML文件加载到内存中时,它将消耗许多GB的内存。

其次是SQL注入漏洞。SQL注入漏洞的原因是用户输入直接拼接到SQL查询语句中。在pythonweb应用程序中,orm库一般用于数据库相关的操作。例如,Flask和Tornado经常使用SQLAlchemy,而Django有自己的orm引擎。.但是如果不使用ORM,直接拼接SQL语句,就有SQL注入的风险。

再者是输入函数漏洞。在Python2的大量内置特性中,输入是一场彻底的安全灾难。一旦调用它,从标准输入读取的任何内容都会立即解析为Python代码,显然,除非脚本的标准输入中的数据完全可信,否则决不能使用输入函数。Python2文档建议将rawinput作为安全的替代方案。在Python3中,input函数等价于rawinput,一劳永逸地解决了这个陷阱。

要知道SSTI是ServerSideTemplateInjection,是Web开发中使用的模板引擎。模板引擎可以将用户界面和业务数据分离,逻辑代码和业务代码也可以相应分离,代码复用变得简单,开发效率也提高了。模板在服务器端使用,数据由模板引擎渲染,然后传递给用户,可以为特定用户/特定参数生成对应的页面。我们可以对比一下百度搜索,搜索不同词条得到的结果页面是不一样的,但是页面的边框基本是一样的。

(责任编辑:IT教学网)

更多

推荐网络赚钱文章