/img/avatar.jpg

Luc1f3r

Java 反序列化学习

Java 反序列化学习

Java 反序列化基础

共同条件 继承Serializable
入口类 source(重写readObject 调用常见的函数 参数类型宽泛 最好jdk自带)
调用链 gadget chain 相同名称 相同类型
执行类 sink (rce ssrf 写文件等等)最重要!!!

可能形式:
1、入口类的 readObject 直接调用危险方法。
2、入口类参数中包含可控类,该类里面有危险方法,readObject 时调用。
3、入口类参数中包含可控类,该类又调用有其他有危险方法的类,readObject 时调用。

SHCTF2024 WriteUP

Week1——Web

1zflask

  • 根据题目描述,查看 robots.txt 发现以下内容。
User-agent: *
Disallow: /s3recttt
  • 访问该路径,浏览器会自动下载文件 app.py
import os
import flask
from flask import Flask, request, send_from_directory, send_file

app = Flask(__name__)
  
@app.route('/api')
def api():
    cmd = request.args.get('SSHCTFF', 'ls /')
    result = os.popen(cmd).read()
    return result
    
@app.route('/robots.txt')
def static_from_root():
    return send_from_directory(app.static_folder,'robots.txt')
    
@app.route('/s3recttt')
def get_source():
    file_path = "app.py"
    return send_file(file_path, as_attachment=True)
    
if __name__ == '__main__':
    app.run(debug=True)
  • 阅读上述代码,可知通过 /api 路径去用 GET 通过变量 SSHCTFF 传递需要执行的命令,即可获取 flag。

MD5 Master

  • 题目
<?php  
highlight_file(__file__);  
  
$master = "MD5 master!";  
  
if(isset($_POST["master1"]) && isset($_POST["master2"])){  
    if($master.$_POST["master1"] !== $master.$_POST["master2"] && md5($master.$_POST["master1"]) === md5($master.$_POST["master2"])){  
        echo $master . "<br>";  
        echo file_get_contents('/flag');  
    }  
}  
else{  
    die("master? <br>");  
}
?>
  • 很明显,这是一个 MD5 的强类型判断,且前面还拼接了一个特定的字符串。
  • 我们可以使用 fastcoll 工具来进行 MD5 的爆破,该工具的爆破是在原字符后接上其他内容,从而使拼接后的字符串的 md5 的值相等。
<?php 
function  readmyfile($path){
    $fh = fopen($path, "rb");
    $data = fread($fh, filesize($path));
    fclose($fh);
    return $data;
 }
 echo '⼆进制md5加密:'.md5( (readmyfile("1_msg1.txt")));
 echo 'url编码:'.urlencode(readmyfile("1_msg1.txt"));
 echo '⼆进制md5加密:'.md5( (readmyfile("1_msg2.txt")));
 echo 'url编码:'. urlencode(readmyfile("1_msg2.txt"));
 ?>

ez_gittt

  • 一个简单的 git 泄露。
  • 可以用 GitHack 工具解决。

jvav

  • 该题要求写一个可以执行任意系统命令的 Java 程序。
  • 示例代码(如下)
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ShellExecutor {

    public static void main(String[] args) {
        try {
            // 定义要执行的shell命令
            String command = "cat /flag";
            
            // 使用 Runtime.exec() 方法执行命令
            Process process = Runtime.getRuntime().exec(command);

            // 获取命令的输出流
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            // 读取输出流中的每一行并打印
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 关闭流
            reader.close();

            // 等待命令执行完成
            int exitCode = process.waitFor();
            System.out.println("Command execution completed with exit code: " + exitCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

poppopop

  • 要根据 php 代码构建出 pop 链。
<?php
class SH {
    public static $Web = false;
    public static $SHCTF = false;
}

class C {
    public $p;
    public function flag()
    {
        ($this->p)();
    }
}

class T{
    public $n;
    public function __destruct()
    {
        SH::$Web = true;
        echo $this->n;
    }
}

class F {
    public $o;
    public function __toString()
    {
        SH::$SHCTF = true;
        $this->o->flag();
        return "其实。。。。,";
    }
}

class SHCTF {
    public $isyou;
    public $flag;
    public function __invoke()
    {
        if (SH::$Web) {
            ($this->isyou)($this->flag);
            echo "小丑竟是我自己呜呜呜~";
        } else {
            echo "小丑别看了!";
        }
    }
}
if (isset($_GET['data'])) {
	highlight_file(__FILE__);
	unserialize(base64_decode($_GET['data']));  
} 
else {
	highlight_file(__FILE__);  
    echo "小丑离我远点!!!";  
}
?>
  • 首先寻找入口点,这里是 __destruct 方法,在该方法中,最后存在 echo 即可以回显由 __toString 转化的特定内容的字符串。
  • F 类中的 o 想要调用 flag 函数,所以要将含有 flag 函数的 C 类传给 o
  • 最终在 flag 函数中调用 SHCTF 类中的 __invoke 魔术方法。

Payload 如下:

BaseCTF 2024 新生赛 WriteUP

Web

1、[Week1] md5 绕过诶


  • 题目源码
<?php   
highlight_file(__FILE__);
error_reporting(0);
require 'flag.php';
if (isset($_GET['name']) && isset($_POST['password']) && isset($_GET['name2']) && isset($_POST['password2']) {
	$name = $_GET['name'];
	$name2 = $_GET['name2'];
	$password = $_POST['password'];
	$password2 = $_POST['password2'];
	if ($name != $password && md5($name) == md5($password)){
		if ($name2 !== $password2 && md5($name2) === md5($password2)){
			echo $flag;
			}
		else {
			echo "再看看啊,马上绕过嘞!";
		}       
	}
	else {
		echo "错啦错啦";
	}
}    
else {
	echo '没看到参数呐';   
}   
?>

本题考察了对 md5 加密的绕过,而 md5 绕过大体上有 3 种绕过的方法,对应不同的情况使用。

CTFHub之HTTP协议

1、请求方式

  • 将请求方式由 GET 改为 CTFHUB 即得到 Flag。

2、302 跳转

  • 301 和 302 都有重定向的作用,而 301 是永久性重定向(旧的内容已失效),302 是暂时性重定向(旧的内容还在,临时跳转到新的内容上)。
  • 向旧的内容发起 GET 请求,能得到旧的内容的 Response 从而得到 Flag。

3、Cookie 欺骗、伪造、认证

  • 打开控制台,查看网络请求,发现存在 cookie,将 admin 的值设置为 1,即得到 Flag。

4、基础认证

  • 打开控制台发现是 GET 请求,下载附件(字典)。
  • 使用 hydra 进行暴力破解,用户名大概率为 admin 所以先试 admin。
  • 在终端输入 hydra -L user_name.txt -P dir.txt http-get://xxx/flag.html,经过比对之后即得 Flag。

5、响应包源代码

  • 打开控制台,查看 Response 代码,即得 Flag。