WEB21

hint:爆破什么的,都是基操
出现弹窗要输用户名密码,随便输入比如admin | 123.cim登录,抓包如下
图片.png
这里面会多了一个认证头:Authorization
用burp自带解密发现账户名和密码之间用冒号隔开
尝试爆破(题目给了一个压缩包,里面是后台密码字典)
方法:
在这串base64字符两边加入§,选择payloads——Load载入字典
这里面有几个参数需要配置一下

①首先在payload processing(payload加工)——Add(add prefix加一个前缀)前缀固定好是“admin:”,
②然后再加一个编码payload processing——Add(encode选择base64)
③取消payload Ecoding中URL-encode these character前面的对号√(因为它有等于号,编码以后会造成那边解码失败)不能选这个,选了就失败了!
图片.png
④Options——Grep-Match,把flag格式输进去:ctfshow(flag出来就停止爆破)
图片.png
其他就不需要配置了,开启爆破

  1. 401状态码:状态码 401 Unauthorized 代表客户端错误,指的是由于缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。 这个状态码会与 WWW-Authenticate 首部一起发送,其中包含有如何进行验证的信息。 这个状态类似于 403 但是在该情况下,依然可以进行身份验证。

爆破成功:
图片.png
解码后发现:admin:shark63

burpsuite另外一种模块的使用:https://www.cnblogs.com/NPFS/p/13797431.html
base64解密,可以发现账号密码的形式为 账号:密码,这里我们采用 Custom iterator进行爆破
使用方法可参考:Custom iterator的使用(自定义迭代器)
图片.png
图片.png图片.png图片.png
图片.png

WEB22

hint:域名也可以爆破的,试试爆破这个ctf.show的子域名
子域名爆破,所示子域名挖掘机,或者使用phpinfo.me/domain/在线子域名查询
图片.png
可以看到vip.ctf.show等公开页面(也可以在源码中发现flag)
图片.png
flag{ctf_show_web}
这就是一个思路,有时候你看到一个站群,它有时候隐藏的一些子域名,我们是可以去通过这个工具来爆破的!

WEB23

hint:还爆破?这么多代码,告辞!

<?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__);

}
?> 

/*
函数了解:substr函数格式   (俗称:字符截取函数)
格式1: substr(string string, int a, int b);
格式2:substr(string string, int a) ;
解析:
    格式1:
        1、string 需要截取的字符串
        2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
        3、b 要截取的字符串的长度
    格式2:
        1、string 需要截取的字符串
        2、a 可以理解为从第a个字符开始截取后面所有的字符串。
*/

/*
函数intval() 函数用于获取变量的整数值。intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值
*/

就是爆破token的md5之后的值,满足条件返回flag
写个PHP脚本,上面的源码其实都可以抄

<?php
for($i; $i<10000; $i++){
  $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 'token='.$i.' md5='.$token;
        }
    //满足第一个条件就把i的值返回,再把它i的md5值返回
    //将第二个if加入后:同时满足两个条件
  }  
}
 ?>

第一个if,访问网页:出现 好多值,这些值都满足图片.png将第二个if加入后:同时满足两个条件
图片.png
我们可以随便用token=1202试一下
图片.png

WEB24

hint: 爆个🔨
考点:PHP伪随机数
打开网页:

<?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');
}

?> Linux version 5.4.0-80-generic (buildd@lcy01-amd64-030) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021 Linux version 5.4.0-80-generic (buildd@lcy01-amd64-030) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021

/*
mt_srand() 函数:播种 Mersenne Twister 随机数生成器。
提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数。

mt_rand() 函数:使用 Mersenne Twister 算法生成随机整数。
提示:该函数是产生随机值的更好选择,返回结果的速度是 rand() 函数的 4 倍。
提示:如果您想要一个介于 10 和 100 之间(包括 10 和 100)的随机整数,请使用 mt_rand (10,100)。
语法:
mt_rand();
or
mt_rand(min,max);
*/

图片.png
我们会发现当种子不变时,实际上生成的随机数是固定的。而这就是伪随机数漏洞,部分ctf题便以此为考点

直接用题目的代码就可以帮我们跑脚本了:

<?php
  mt_srand(372619038);
    echo intval(mt_rand());//输出它的第一个随机值(1155388967)试着提交

  ?>

图片.png
如果提交不对也是很正常,这个和版本也有关系,我们调整为PHP7重新生成、提交、得到flag
考点:

    同一个种子生成的随机数序列是一样的序列,它不和机器无关,虽然它是在服务器生成,我是在我本机生成,但是只要种子,设置的种子是一样的,那么他生成的随机数序列也就是一样的,我们在日常开发中,一般不设置固定值,作为一个随机数,它不要设置固定值的种子,在新版本中也不要手动设置随机数种子,建议要设置的话和时间相关,这样的话,生成的话可以确保更加随机一点!

WEB25

hint:爆个🔨,不爆了

 <?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');
}
Linux version 5.4.0-88-generic (buildd@lgw01-amd64-008) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #99-Ubuntu SMP Thu Sep 23 17:29:00 UTC 2021 Linux version 5.4.0-88-generic (buildd@lgw01-amd64-008) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #99-Ubuntu SMP Thu Sep 23 17:29:00 UTC 2021

和WEB24的区别是,他没有明确给出种子,这个种子是需要我们来爆破的,推荐使用php_mt_seed这个工具(网站:https://www.openwall.com/php_mt_seed/),这个需要我们自己去编译。
我们来看一下这个逻辑,$rand = intval($r)-intval(mt_rand());这个是第一个随机数种子,如果我们给r值为0的话,那么$rand的值就是负的第一次的随机数,负值的话会输出$rand
图片.png
那么 718414783 就是我们第一个随机数
用php_mt_seed进行逆推,得到种子
可以通过time ./php_mt_seed 718414783这个命令来生成,生成的话会有几个版本
图片.png根据web24我们可知道是PHP7,我们选择seed = 0xcae510c2 = 3404009666 (PHP 7.1.0+)

<?php
  mt_srand(0xcae510c2);
    mt_rand();//这是第一次生成的随机数
    echo mt_rand()+mt_rand();//返回第二次随机数和第三次随机数之和:2234607657
//写入cookie(直接利用开发者工具写入)

?>

图片.png
写入后直接刷新是没有反应的,为什么呢?因为我们还没有r参数,
任意给r=1(第二个判断又过不了)

让第二个判断中rand值为0,取反的话就是非0,就能进去
这样我们就把第一个随机数拿出来后赋给r值,r值减去第一个随机数后,那么他就会变为0,取反就不为0,就可以进入后面的判断了,那我们就可以拿到最终的flag。
图片.png

主要就是我们只要能拿到随机数序列中的某个值,就可以有概率反推它的种子,这个就是我们的考点!
归纳总结:

1、首先通过传入/?r=0,获得第一次产生的随机数值;
2、工具第一次产生的随机数值去反推mt_strand中的种子(里面是十六进制)
3、计算mt_rand()+mt_rand(),也就是第二次和第三次产生的随机数的和,将其作为token,插入cookie
4、url中传入r=第一次的随机数,这样$rand=intval($r)-intval(mt_rand())=0,if((!$rand)),if 非0进入循环,获得flag!

WEB26

图片.png图片.png是让我们去爆破数据库的连接信息,这里其实跟我们web21爆破用户名密码是类似的

输入资料后 发现安装不了,查看网页源代码,其中感觉挺关键的js代码如下:
图片.png
url后加checkdb.php
以POST方式提交数据:
a(数据库地址localhost)
p(端口:3306)
d(数据库:ctf)
u(用户名:root)
pass(密码:123456)
图片.png
填写内容,但是是error,不填写内容就出现flag:
图片.png
至于为什么啥也不填就可以连接成功,这应该是出题目的时候代码逻辑的问题,造成了没有连接成功也返回了正确的标志,所以返回了flag!

WEB27

图片.png发现有个录取名单:
图片.png
发现身份证号但是缺少中间隐藏的日期,写一个PHP脚本爆破(也可以用bp加前后缀,这里为了锻炼代码编写能力,还是用PHP写个脚本进行合法身份证验证,这样就会减少很多爆破时间)

<?php
$card=array();
//生成所有的从1990年到2000年的身份证号码
for($y=1990;$y<2000;$y++){
    for($m=1;$m<13;$m++){
        if($m<10){
            $m='0'.$m;
        }
        for($d=1;$d<32;$d++){
            if($d<10){
                $d='0'.$d;
            }
            array_push($card,'621022'.$y.$m.$d.'5237');
        }
    }
}

//这个函数是根据身份证最后面1位的校验位来算是否是合法身份证,如果不是合法身份证可以通过这个函数来剔除
function checkCard($c){
    $list=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];//定义一个数组里面有不同的权值,这个是每一个位数的权重,顺序是不能乱的
    $crc=[1,0,'X',9,8,7,6,5,4,3,2];//有一个校验码,每个人身份证的最后一位就是在十一个数字之内
    $ca=str_split($c);//接收到c,将c拆分为数组
    $sum=0;
    for($i=0;$i<count($ca);$i++){
        $sum+=$ca[$i]*$list[$i];//每个数组拿出来以后,和它的权重相乘,比如身份证第一位*7...,两两相乘求和
    }
    $crc_ =$sum%11;//取余之后得到最后一位的值,和传入的身份证最后一位进行比较,如果相等说明校验通过,否则false
    if($ca[count($ca)-1]==$crc[$crc_]){
        return true;
    }else{
        return false;
    }

}

//被刚才所有的身份证号进行校验和的验证,拿到合法的身份证号码
foreach($card as $c){
    if(checkCard($c)){
        echo $c.'<br>';
    }
}


?>

图片.png
用校验和的话可以清除好多非法身份证号,提高爆破速度
图片.png
或者用dates模块:

图片.png
爆破出身份证为 高先伊 | 621022199002015237
图片.png
知道学号为02015237 初始密码: 621022199002015237,登录
图片.png
ctfshow{c15b0c4f-f9cd-4286-b86f-c42a68fc10ce}

WEB28

图片.png
这里0和1比较可疑,url后面不管输入什么都会跳转到/0/1/2.txt这个页面
txt文件是固定的,改的话不好改,作为一个靶场环境肯定是动态环境,我们可以把2.txt删除,访问默认文件index.php
Burp Suite中intruder爆破模块四种模式的区别
选择集束炸弹Cluster bomb,爆破从0-100的数字
图片.png
也可以自己写个脚本生成字典:

<?php
  for($i=0;$i<101;$i++){
    echo $i.'<br>';
    //生成1-100
  }

  ?>

加入结束符:flag出来就结束
图片.png
把线程改小一点
图片.png
图片.png

思维导图

image.png