LOADING

首次加载会比较慢,果咩~

请打开缓存,下次打开就会很快啦

Java做题笔记

#Java逆向解密

程序员小张不小心弄丢了加密文件用的秘钥,已知还好小张曾经编写了一个秘钥验证算法,聪明的你能帮小张找到秘钥吗? 注意:得到的 flag 请包上 flag{} 提交
  附件给了class文件,用jd-gui反编译得到以下源码:

import java.util.ArrayList;
import java.util.Scanner;

public class Reverse {
  public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    System.out.println("Please input the flag );
    String str = s.next();
    System.out.println("Your input is );
    System.out.println(str);
    char[] stringArr = str.toCharArray();
    Encrypt(stringArr);
  }
  
  public static void Encrypt(char[] arr) {
    ArrayList<Integer> Resultlist = new ArrayList<>();
    for (int i = 0; i < arr.length; i++) {
      int result = arr[i] + 64 ^ 0x20;
      Resultlist.add(Integer.valueOf(result));
    } 
    int[] KEY = { 
        180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 
        133, 191, 134, 140, 129, 135, 191, 65 };
    ArrayList<Integer> KEYList = new ArrayList<>();
    for (int j = 0; j < KEY.length; j++)
      KEYList.add(Integer.valueOf(KEY[j])); 
    System.out.println("Result:");
    if (Resultlist.equals(KEYList)) {
      System.out.println("Congratulations);
    } else {
      System.err.println("Error);
    } 
  }
}

  根据加密算法可知,先将明文+64后与0x20(即32)异或获得密文。则编写解密算法即可得到明文:

KEY = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65 ]
for i in KEY:
    print(chr((i^32)-64),end='')
# This_is_the_flag_!

#[RoarCTF 2019]Easy Java

  进入环境,是一个登录页面

  先试试help,发现有报错回显,且url为http://1e576dd1-0f8d-43fb-86bc-dd4ab442fcbf.node5.buuoj.cn:81/Download?filename=help.docx

java.io.FileNotFoundException:{help.docx}

  原本怀疑会有ssti(因为存在{}并且有把参数回显),但是查了一圈发现不太对劲。查了一下报错,发现这个java.io.FileNotFoundException是因为文件路径错误、文件不存在、权限问题和磁盘空间不足导致的问题。但是又试了一圈又没啥用,只好查查wp(
  结果发现竟然要post请求才能得到文件(能想到的都是神人了)。然后发现有WEB-INF/web.xml泄露漏洞这么个玩意。

WEB-INF主要包含以下内容:

  • /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。可以利用这里的信息得到各个class文件的路径,得到网页源码。
  • /WEB-INF/classes/:包含所有的 Servlet 类和其他类文件,类文件所在的目录结构与他们的包名称匹配。
  • /WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
  • /WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
  • /WEB-INF/database.properties:数据库配置文件。
      众所周知,配置文件大多是很有价值的,我们直接看看这个WEB-INF/web.xml里是什么
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>Index</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>IndexController</servlet-name>
        <servlet-class>com.wm.ctf.IndexController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>IndexController</servlet-name>
        <url-pattern>/Index</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>LoginController</servlet-name>
        <servlet-class>com.wm.ctf.LoginController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginController</servlet-name>
        <url-pattern>/Login</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>DownloadController</servlet-name>
        <servlet-class>com.wm.ctf.DownloadController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DownloadController</servlet-name>
        <url-pattern>/Download</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>FlagController</servlet-name>
        <servlet-class>com.wm.ctf.FlagController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FlagController</servlet-name>
        <url-pattern>/Flag</url-pattern>
    </servlet-mapping>
</web-app>

  从这里我们就能知道FlagController.class这个文件的路径是/WEB-INF/classes/com/wm/ctf/FlagController.class,加之存在的文件读取漏洞,就能够得到这个class文件,反编译后会发现其中存在base64的flag了。