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、14、17 位字符相同。
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