当前位置: 首页 > article >正文

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}


http://www.kler.cn/a/441239.html

相关文章:

  • qt-C++笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别
  • Java实现.env文件读取敏感数据
  • Win11下帝国时代2无法启动解决方法
  • 240. 搜索二维矩阵||
  • jEasyUI 转换 HTML 表格为数据网格
  • 计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设
  • 基于单片机智能鱼缸的设计
  • Windows 系统如何高效搭建 Linux 开发环境,一步步解锁内核源码
  • linux从frame buffer中将qt界面拷贝出来放到u盘的操作方法
  • wrk如何测试post请求
  • LabVIEW在国家项目中的应用与开发要求
  • 如何设计高效的商品系统并提升扩展性:从架构到实践的全方位探索
  • 【大数据】-- 读放大和写放大
  • 【$25000】利用Zendesk Nday获取漏洞赏金
  • 基于STM32设计的粮食仓库(粮仓)环境监测系统_284
  • Flutter:ListView实现一个可左右滑动的商品列表
  • 【Unity功能集】TextureShop纹理工坊(二)图层(上)
  • 单词谜(详解版)
  • python —— 常用命令行的命令
  • JS逆向--反调试(SoJson为例)
  • 从构想到实现:EasyOne 多模态 AI 产品开发历程
  • 集成自然语言理解服务,让应用 “听得懂人话”
  • 解决Linux 虚拟机网段与虚拟机配置网段不一致
  • IP6822为智能手机提供无线充电方案的无线充电发射微控制SOC芯片
  • Day25 C++ 文件和流
  • SLM510A系列——24V,15到150mA单通道可调电流线性恒流LED驱动芯片