ctfshow web入门爆破

爆破

web21

先打开网页,用bp抓包,报文中有一个base64编码,解密一下,发现是用户名:密码

image-20210922184543519

使用custom iterator(自定义迭代器)模块,首先第一个放账号admin

image-20210922184644243

第二个放个:第三个放个字典就可以了!

然后再进行base64编码!

image-20210922184729818

image-20210922184806487

这个要取消勾选

最后进行爆破,得到账号密码

image-20210922184903002

账号密码是admin:shark63

web22

爆破长ctf.show的子域名,爆破网址:https://phpinfo.me/domain/

里面有一个vip.ctf.show,页面名称里面就有flag{ctf_show_web}

web23

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() 函数计算字符串的 MD5 散列。相当于加密
当要 判断一个变量是否已经声明的时候 可以使用 isset 函数
当要 判断一个变量是否已经赋予数据且不为空 可以用 empty 函数 
当要 判断 一个变量 存在且不为空 先isset 函数 再用 empty 函数
substr(string,start,length):
string 	必需。规定要返回其中一部分的字符串。
start 	
必需。规定在字符串的何处开始。
    正数 - 在字符串的指定位置开始
    负数 - 在从字符串结尾开始的指定位置开始
    0 - 在字符串中的第一个字符处开始
length 	
可选。规定被返回字符串的长度。默认是直到字符串的结尾。
    正数 - 从 start 参数所在的位置返回的长度
    负数 - 从字符串末端返回的长度
例:echo substr("Hello world",1,8)      ello wor
echo substr("Hello world",8,1);         r
intval ( mixed $var [, int $base = 10 ] )//[]中间的可有可无,会自动转换默认值
										//该语句就是将var转换为int10进制
    $var:这是一个必需参数,用作需要转换为整数值的变量。
    $base:转化所使用的进制。
    如果 base 是 0,通过检测 var 的格式来决定使用的进制:
    如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
    如果字符串以 "0" 开始,使用 8 进制(octal);否则,
    将使用 10 进制 (decimal)。
例:echo $var = '7.423';      7
echo intval(0x1A);           26       (1A的十进制就是26)

上脚本:

姿势一。PHP脚本
<?php 
error_reporting(0); 
 
$a="asdfghjklqwertyuiopzxcvbnm1234567890";
for($i=0;$i<36;$i++){
    for($j=0;$j<36;$j++){
        $token=$a[$i].$a[$j];    
        $token = md5($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 $a[$i].$a[$j];
                exit(0);
            } 
        } 
    }
} 
?> 

Kali中运行得到3j

image-20210922222010959

最后get传参:/?token=3j

image-20210922222142192

姿势二。python脚本
import hashlib

a = "0123456789qwertyuiopasdfghjklzxcvbnm"
for i in a:
    for j in a:
        b = (str(i) + str(j)).encode("utf-8")#
        m = hashlib.md5(b).hexdigest()
        if(m[1:2] == m[14:15] and m[14:15] == m[17:18]):
            if ((int(m[1:2]) + int(m[14:15]) + int(m[17:18])) / int(m[1:2])) == int(m[31:32]):
                print(b)
/*
substr() 函数返回字符串的一部分
intval() 函数用于获取变量的整数值。
*/

image-20210922222429228

web24

image-20210924182312762

先进行代码审计

image-20210924182355628

可以写一个简单的脚本

<?php
mt_srand(372619038); 
$a = intval(mt_rand());
echo $a;

image-20210924182649464

image-20210924182813263

web25

先审计代码

image-20210928205938310

hint:

mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机 数。 在之前自己还以为需要暴力破解cookie,最后师傅们给我介绍了一个脚本,专门用来跑mt_srand()种子和 mt_rand()随机数的 这里自己解释一下为什么每一次的mt_rand()+mt_rand()不是第一次的随机数相加?? 因为生成的随机数可以说是一个线性变换(实际上非常复杂)的每一次的确定的但是每一次是不一样的,所以不能 进行第一次*2就得到mt_rand()+mt_rand() 使用说只要我们得到种子就可以在本地进行获得自己想要的值 解题:通过随机数来寻找种子 我们让 ?r=0 得到随机数。这里我得到的是 183607393 每一次不一样(因为flag值在变化) 然后下载 php_mt_seed4.0 我们在linux下面使用 gcc进行编译 gcc php_mt_seed.c -o php_mt_seed 之后运行脚本添加随机数 ./php_mt_seed 183607393

找到对应的版本这里自己的运气好第一个出来的自己验证了一下发现就是这个 注:可能存在多个种子需要自己进行判断 通过种子找到第一个随机数就是上面的随机数。

payload: ?r=183607393 Cookie: token=794171094

https://www.openwall.com/php_mt_seed/       工具
https://www.cnblogs.com/zaqzzz/p/9997855.html  php伪随机数漏洞

因此如果给r传0的话,就会生成随机数,这个时候就可以逆序推出种子!

image-20210928212132410

先下载工具,hint里面有工具链接,下载完成后进行解压,放到kali中

image-20210928212538874

文件夹中有三个文件,Makefile文件是用来告诉make需要做什么

在Linux中执行 make  之前,需要一个命名为 Makefile  的特殊文件(本文的后续将使用Makefile 作为这个特殊文件的文件名)来告诉 make 需要做什么(完成什么任务),该怎么做。

image-20210928212828296

根据图中命令步骤进行,这就把工具弄好了

在Kali中进行逆推

image-20210928213300911

然后用脚本寻找token的值

<?php
mt_srand(1064029812);
echo mt_rand()."\n";
$result = mt_rand()+mt_rand();
echo $result;
?>

image-20210928213939103

最后进行传值r=995507831 token=2025179318 从而获得flag

image-20210928214007478

web26

按照框中的提示填入,并抓包

方法一:爆破

image-20210929220700524

从而获得flag

image-20210929220805166

方法二(有点不懂):直接post传参

查看源代码

image-20210929221057895

在checkdb.php页面POST即可

image-20210929221314862

我试了一下,这两个都可以
&a=&p=&d=&u=&pass=
a=&p=&d=&u=&pass=

web27

这题稍微有点离谱,一直爆破不出来

解题:

打开以后发现一个录取名单

image-20211014193200727

下载后打开,发现身份证信息不全

image-20211014193426286

又找到学生学籍信息查询系统,看到需要姓名和身份证号码

image-20211014193558320

所以需要将身份证不全的信息找到,所以要进行爆破

这里用火狐爆不出来,这里可以用谷歌浏览器

构造payload

在学院录取查询页面只对身份证号进行爆破,因为姓名知道

image-20211014194346212

爆出正确身份证号

image-20211014194930247

查看响应,解码响应包里的Unicode编码,得出学号

image-20211014195136626

获得flag

image-20211014195229932

web28

image-20211014200717981

看到0和1,尝试对它们进行爆破,爆破的时候需要将2.txt给删了

image-20211014200831670

clusterbomb的意思是自定义

先对payload1进行构造

image-20211014200929208

在对payload2进行构造

image-20211014201015663

开始爆

image-20211014201045480

flag就出来了!

posted @ 2022-03-08 13:35  森sen  阅读(684)  评论(0)    收藏  举报