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),然后登录。这一过程的目的是为了抓包查看爆破点:
看到有一串base64解密,解密后为admin:123456,得到爆破格式。
发到攻击模块进行爆破,设置爆破的位置:
有限载荷选择自定义迭代器,因为它这里的用户名和密码合并在了一起,使用冒号隔开的,如果是相互独立的参数,多个参数我们会采用其他的攻击模式而不是使用狙击手。
设置位置一:用户名(其实一般我们猜都是猜 admin )
设置位置二:冒号。
设置位置三:密码,用题目给的附件密码。
之后我们需要对 payload 进行base64 编码:
注意这里需要将 URL 编码取消掉:
查看结果,看长度不同的:
进行解码得到结果:
输入账号密码,得到flag。
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") # 如果所有组合都不符合条件,输出消息
构造payload:?token=ZE,得到flag。
web24
一段php代码,需要传入参数r,在做判断
代码审计:
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());
?>