ctfshow web入门 爆破 21-28
web21
刚进去就要求我们登录,这里题目给了我们一个字典,就是这个字典为什么他那么多数字中 就一个字母的密码还不明显吗。
这里我们使用burp拦包,这里没有发现登录的账号密码,但是有一串可疑的字符串,尝试base64解密
这我们就得到了,我们测试用的账号密码了,这里将包移到Intruder中准备爆破
设置burp,添加payload位置到这里
这里有三个步骤,首先从文件加载我们选择给我们的字典文件,下面添加我们需要添加两个一个是前缀,一个是base64加密,最下面我们把url编码取消掉
然后我们开始爆破,选择长度不一样的包,我们就获得了flag
web22
域名失效了呃呃呃
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__);
}
?>
这里分析一下代码,他会检查md5值的第二、十五、十八个字符是否相等。如果它们相等,那么它会将这三个字符转换为整数并计算它们的和,然后将这个和除以哈希值的第一个字符,判断这个结果是否等于哈希值的第三十一个字符。
第一种方法
肯定还是选择爆破
第二种方法
我们写脚本跑出来
import hashlib
text = '0123456789qazwsxedcrfvtgbyhnujmikolp'
for i in text:
for j in text:
t = str(i) + str(j)
md5_text = hashlib.md5(t.encode("utf-8")).hexdigest()
if md5_text[1:2] == md5_text[14:15] and md5_text[14:15] == md5_text[17:18]:
print(t)
web24
这里他已经告诉种子是什么了,我们直接在本地输出下一次的值就可以了
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:26:39
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 13:53:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
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');
}
get传输r=1155388967
web25
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:56:57
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
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');
}
分析一下代码,这里虽然我们无法确定种子值了,但是我们可以获得他随机值,这里随便传入一个值,我们根据值爆破他的种子
爆破工具 初次使用需要用make编译一下
$rand = intval($r)-intval(mt_rand());
我们获取的是rand的值,所以我们通过r传入1,那么我们获得的值就要加1,传入0不用改
这里我们先通过f12拦包,获得环境的php版本
因为这里所以rand必须为零所以我们需要传入我们获得到的随机值,因为rand上面赋值的时候已经使用过一次mt_rand,所以我们要的是让第二和第三次的值相加
if((!$rand)){ if($_COOKIE['token']==(mt_rand()+mt_rand())){ echo $flag; } }
<?php mt_srand(3486625448); //这个种子值要看自己的 echo mt_rand().PHP_EOL; echo mt_rand()+mt_rand();
web26
按照他的提示,填写,没有按照成功,怀疑是密码的问题,这里去爆破一下,没有爆破出来,这里去看看别人的,发现是7758521,这个。。太大了吧,根本爆破不出来
web27
这里有两个一个录取名单,还有一个查询系统,查询系统需要身份证号,但是录取名单里面只有一部分,这里分析一下。
这里一部分是出生年月,这样我们就好爆破了,我的建议还是写脚本方便一点,也可以使用burp
用谷歌拦查询系统的包,然后将身份证中间的进行爆破
解密得到 恭喜您,您已被我校录取,你的学号为02015237 初始密码为身份证号码
登录获得flag
web28
这个题目的目录很不对劲,这里我们爆破目录看看,第一次爆破没有什么东西,这里我们将2.txt去掉,重新爆破,发现flag