CTFSHOW-WEB入门

坚持、沉淀、成长 / 2024-10-12 / 原文

使用工具:dirbsearch、
php随机数下载链接:https://www.openwall.com/php_mt_seed/php_mt_seed-4.0.tar.gz

靶场链接:

爆破

web21


BP抓包跑字典这边加载了三个自定义载荷,有效载荷处理,取消有效载荷编码,使用的狙击模式,

web22


这关就是爆破子域名,里面有一个vip.ctf.show,页面名称里面就有flag{ctf_show_web}

web23

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 11:43:51
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);  // 禁止显示错误报告,防止泄露敏感信息

include('flag.php');  // 包含 'flag.php' 文件,通常在该文件中会定义一个 $flag 变量(表示 CTF 挑战的目标)

// 检查是否通过 GET 请求提供了 'token' 参数
if (isset($_GET['token'])) {
    
    // 对提供的 token 进行 MD5 哈希运算,生成 32 字节的哈希值
    $token = md5($_GET['token']);
    
    // 条件 1:检查哈希值中第 2 位、15 位和 18 位字符是否相同
    // substr($token, 1,1) 取出哈希的第 2 个字符
    // substr($token, 14,1) 取出第 15 个字符
    // substr($token, 17,1) 取出第 18 个字符
    if (substr($token, 1,1) === substr($token, 14,1) && substr($token, 14,1) === substr($token, 17,1)) {
        
        // 条件 2:将第 2、15、18 位字符转为整数并相加,除以第 2 位的整数,结果需等于哈希的最后一位字符的整数
        // intval() 用于将字符转换为整数
        if ((intval(substr($token, 1,1)) + intval(substr($token, 14,1)) + substr($token, 17,1)) / substr($token, 1,1) === intval(substr($token, 31,1))) {
            
            // 如果条件 1 和条件 2 都满足,输出 $flag
            echo $flag;
        }
    }
} else {
    // 如果没有提供 'token' 参数,显示当前文件的源代码
    highlight_file(__FILE__);
}

?>

这个代码通过对输入的 token 进行 MD5 哈希运算,并对特定字符进行判断,条件满足后会输出 CTF 的 flag,使用python脚本进行爆破

import hashlib  # 导入 hashlib 模块,用于生成 MD5 哈希值

# 定义字符集合,包含数字和字母的组合
a = "0123456789qwertyuiopasdfghjklzxcvbnm"

# 使用双重循环遍历字符集合中的每个字符组合(两位)
for i in a:
    for j in a:
        # 将两个字符拼接成字符串,然后编码为字节格式(用于 MD5 哈希)
        b = (str(i) + str(j)).encode("utf-8")

        # 生成字符串 b 的 MD5 哈希,并将哈希结果转换为 32 位的十六进制字符串
        m = hashlib.md5(b).hexdigest()

        # 检查 m 的特定位置上的字符是否都是数字
        if m[1:2].isdigit() and m[14:15].isdigit() and m[17:18].isdigit() and m[31:32].isdigit():
            # 条件 1:哈希值中第 2 位(索引 1)字符、 第 15 位(索引 14)字符、 第 18 位(索引 17)字符必须相同
            if m[1:2] == m[14:15] and m[14:15] == m[17:18]:

                # 条件 2:这几个字符的整数和除以第 2 位字符的整数结果必须等于哈希值的最后一位字符的整数
                if ((int(m[1:2]) + int(m[14:15]) + int(m[17:18])) / int(m[1:2])) == int(m[31:32]):
                    # 如果条件都满足,输出满足条件的字符组合(原始的两个字符字节形式)
                    print('结果为:',b)
#结果为:3j

GET token=3j即可出flag

web24

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 13:26:39
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 13:53:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);  // 禁止显示错误报告,防止泄露敏感信息

include("flag.php");  // 包含 'flag.php' 文件,通常在该文件中会定义一个 $flag 变量(表示 CTF 挑战的目标)

// 检查是否通过 GET 请求提供了 'r' 参数
if (isset($_GET['r'])) {
    $r = $_GET['r'];  // 获取 GET 请求中的 'r' 参数
    
    mt_srand(372619038);  // 设置随机数生成器的种子,确保生成的随机数可预测
    
    // 将 'r' 参数转换为整数,并与生成的随机数进行比较
    if (intval($r) === intval(mt_rand())) {
        // 如果相等,输出 $flag
        echo $flag;
    }
} else {
    // 如果没有提供 'r' 参数,显示当前文件的源代码
    highlight_file(__FILE__);
    
    // 显示服务器操作系统版本信息
    echo system('cat /proc/version');
}

?>

利用 Python 或其他编程语言模拟 PHP 的随机数生成器,使用相同的种子,生成随机数,并用它与 r 进行比较。构造 GET 请求,通过请求中带上正确的 r 参数来获取 flag

<?php
mt_srand(372619038); 
//赋值给$a,intval — 获取变量的整数值
$a = intval(mt_rand());
echo $a;
//1155388967

最后拿到flag

web25

题目代码如下

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 14:00:00
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 14:30:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

include("flag.php");  // 包含一个 PHP 文件,其中包含 $flag 的值

if (isset($_GET['r'])) {  // 检查 GET 请求中是否有 'r' 参数
    $r = $_GET['r'];  // 获取 'r' 参数的值

    // 使用 $flag 的 MD5 哈希值的前8个字符来设置随机数种子
    // hexdec() 将 MD5 的子串转换为十六进制数
    mt_srand(hexdec(substr(md5($flag), 0, 8)));

    // 生成一个随机数 mt_rand(),并将 'r' 参数与生成的随机数进行比较
    // 如果两者相等,$rand 的值应为 0
    $rand = intval($r) - intval(mt_rand());

    if ((!$rand)) {  // 如果 $rand 为 0,则意味着 'r' 与生成的随机数相等
        // 检查 Cookie 中的 'token' 值是否等于两个 mt_rand() 随机数的和
        if ($_COOKIE['token'] == (mt_rand() + mt_rand())) {
            echo $flag;  // 如果条件满足,输出 flag
        }
    } else {
        // 如果 'r' 参数不匹配生成的随机数,输出 $rand 的值(用于调试或提示)
        echo $rand;
    }
} else {
    // 如果 'r' 参数未设置,显示当前文件的源代码并输出系统版本信息
    highlight_file(__FILE__);  // 高亮显示当前 PHP 文件的源代码
    echo system('cat /proc/version');  // 输出系统版本信息
}

?>