ctfshow-web-爆破(21-24)

内容参考

https://blog.csdn.net/Myon5/article/details/139389453?ops_request_misc=%257B%2522request%255Fid%2522%253A%25225B0217A0-312F-451C-BE04-0B0FFCC4E2BB%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=5B0217A0-312F-451C-BE04-0B0FFCC4E2BB&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-139389453-null-null.142^v100^pc_search_result_base6&utm_term=ctfshow%E7%88%86%E7%A0%B4&spm=1018.2226.3001.4187

web21

本题是一个登录窗口,首先第一步就是先输入用户名为:admin(一般没有额外提示就这么猜),密码随便输(此处输入123456),然后登录。这一过程的目的是为了抓包查看爆破点:
image
看到有一串base64解密,解密后为admin:123456,得到爆破格式。
发到攻击模块进行爆破,设置爆破的位置:
image
有限载荷选择自定义迭代器,因为它这里的用户名和密码合并在了一起,使用冒号隔开的,如果是相互独立的参数,多个参数我们会采用其他的攻击模式而不是使用狙击手。
设置位置一:用户名(其实一般我们猜都是猜 admin )
image
设置位置二:冒号。
image
设置位置三:密码,用题目给的附件密码。
image
之后我们需要对 payload 进行base64 编码:
image
注意这里需要将 URL 编码取消掉:
image
查看结果,看长度不同的:
image
进行解码得到结果:
image
输入账号密码,得到flag。
image

web22

题目提示:域名也可以爆破的,试试爆破这个ctf.show的子域名
过程如下:
用子域名挖掘机或Oneforall工具,挖掘子域名,有:
bbs.ctfshow.com
db.ctfshow.com
www.ctfshow.com
vip.ctfshow.com
source.ctfshow.com
wp.ctfshow.com
在vip.ctfshow.com的tag中,发现flag,为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');
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__);

}
?>

根据代码提示

GET型传入一个token参数
对token进行md5加密
token的第二位等于第十五位等于第十八位
token的第二位加上第十五位加上第十八位除第二位等于第三十二位

注意:编程里是从0开始计算的
写一个脚本

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")  # 如果所有组合都不符合条件,输出消息

image
构造payload:?token=ZE,得到flag。
image

web24

一段php代码,需要传入参数r,在做判断
image
代码审计:

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

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

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

image
image

posted @   淡云晨光  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示