CTFshow web21-web28 做题笔记

web21

先把所给的字典下下来

 用工具扫了一下目录,没发现什么线索

抓包,随便输如用户名和密码

发现了用户名:密码的形式

 而题目只给了我们后台密码的字典,所以我们爆破一下密码

用户名,没有提示,习惯用admin

而我们只需要爆破密码,前缀的admin:可以不用动了

使用自定义迭代

添加payload位置

 第一个位置admin

 

 第2个位置:

 第三个位置使用题目提供的字典也就是密码本

在修改编码方式,可以查看原来的抓包会把我们所发的用户名 :密码base64编码

所以我们也需要进行base64编码

 URL编码去掉勾选,避免base64编码解码错误

 开始爆破,找到最长或者最短的响应包,拿到flag

web22

域名失效了,扩展域名,搜索域名可以在鹰图、fofa上进行信息收集

web23

error_reporting(0);

include('flag.php');
if(isset($_GET['token'])){
    $token = md5($_GET['token']);
    if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
        if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
            echo $flag;
        }
    }
}else{
    highlight_file(__FILE__);

}
?>

 第一个if条件

  • substr($token, 1,1): 取 md5($_GET['token']) 索引 1 处的字符
  • substr($token, 14,1): 取 索引 14 处的字符
  • substr($token, 17,1): 取 索引 17 处的字符
  • 这三个字符必须 相等

第二个if条件

  • (intval(X) + intval(X) + X) / X = intval(substr($token, 31,1))
  • 简化:

(2 \times intval(X) + X) / X = intval(substr($token, 31,1))

  • intval(X) = N,则:

(2N + N) / N = intval(substr($token, 31,1))

  • 进一步化简:

3 = intval(substr($token, 31,1))

  • 结论:哈希的 第 31 位字符必须是 3,且 X 需要是一个 数字字符

写一个脚本进行爆破

求解符合条件的 MD5 输入

我们需要找到一个字符串,使得 md5 哈希值的:

  1. 1、14、17 位字符相同。
  2. intval(substr($token, 31,1)) == 3
import hashlib

for i in range(1000000):  # 试 0 到 999999 作为 token 值
    test_token = str(i)
    hashed = hashlib.md5(test_token.encode()).hexdigest()

    if (hashed[1] == hashed[14] == hashed[17]) and (hashed[31] == '3'):
        print(f"Found token: {test_token}")
        print(f"MD5 Hash: {hashed}")
        break

 

web24

include("flag.php");
if(isset($_GET['r'])){
    $r = $_GET['r'];
    mt_srand(372619038);
    if(intval($r)===intval(mt_rand())){
        echo $flag;
    }
}else{
    highlight_file(__FILE__);
    echo system('cat /proc/version');
} 
  • mt_srand(372619038); 设定一个固定的随机种子 372619038
  • 生成一个随机数 mt_rand() 并与 intval($r) 进行比较。
  • 如果 intval($r) === mt_rand(),输出 flag
<?php
mt_srand(372619038);
echo mt_rand(); // 计算出正确的 r 值
?>

 

 知道r之后

 方法一:

import requests

# 目标 URL
url = "http://example.com/index.php"

# 已计算出的正确 r 值
r_value = 123456789  

# 发送请求
params = {"r": r_value}
response = requests.get(url, params=params)

# 打印服务器响应
print(response.text)

 

方法二

 

web25

.......

web26

 访问是这个界面

点击安装

方法一

先按照他的例子填写

开始安装,抓包,开始爆破密码

 方法二:

直接抓包,放到重发器直接发送也能得到flag

web27

点击录取名单,下载一个表格,再点击查询系统,突破口就来了

 我们先抓包,把表格上的信息输进去,由于我们不知道身份证,所以我们选择爆破身份证

写一个脚本用来枚举符和其前缀和后缀的18位身份证号

import itertools


def calculate_checksum(id_number):
    """ 计算身份证校验码 """
    weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    check_codes = "10X98765432"

    total = sum(int(id_number[i]) * weights[i] for i in range(17))
    return check_codes[total % 11]


def generate_ids():
    """ 枚举所有可能的身份证号码 """
    prefix = "621022"
    birth_years = [str(y) for y in range(1950, 2025)]  # 合理的出生年份
    months = [str(m).zfill(2) for m in range(1, 13)]
    days = [str(d).zfill(2) for d in range(1, 32)]

    possible_birthdays = [y + m + d for y, m, d in itertools.product(birth_years, months, days)]

    valid_ids = []
    for birth in possible_birthdays:
        for seq in range(1000):  # 顺序码 000-999
            base_id = prefix + birth + str(seq).zfill(3)
            checksum = calculate_checksum(base_id)
            full_id = base_id + checksum
            if full_id.endswith("5237"):  # 过滤符合条件的身份证
                valid_ids.append(full_id)

    return valid_ids


# 生成身份证号并写入文件
valid_id_cards = generate_ids()
with open("valid_id_cards.txt", "w") as f:
    for id_card in valid_id_cards:
        f.write(id_card + "\n")

print("所有符合条件的身份证号已保存到 valid_id_cards.txt")

 写进一个文档里,作为爆破省份证的字典,这样比爆破18位数字快多了

 开始爆破

 得到学号和密码就能登录进去拿到flag了

web28

平常查看源代码等步骤不行,但是发现了这个两个目录,会不会二进制🤔

输入/1/0/3.txt

 算了算了把2.txt删了

 403 文件存在,但是不允许访问

/6/1/,也是这种情况,所以能猜到大概是目录爆破

bp抓包,后面的2.txt就不要了

不要把1后面的/删了

 

 过滤响应码为200,就能得到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剁椒排骨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值