ctfshow-爆破
web21
题目有提供字典
请求的数据包中存在认证,经过了base64编码
格式:
账号:密码
在bp中处理
web22
web23
#coding: utf-8
#啊韬
import hashlib
dic = '0123456789qazwsxedcrfvtgbyhnujmikolp'
md5 = hashlib.md5(dic).hexdigest()
for a in dic:
for b in dic:
t = str(a)+str(b)
md5 = hashlib.md5(t).hexdigest()
#print md5
#print md5[1:2]
#print md5[14:15]
#print md5[17:18]
if md5[1:2] == md5[14:15] and md5[14:15]== md5[17:18]:
print t
print md5
print md5[1:2]
print md5[14:15]
print md5[17:18]
利用到的python脚本
代码要求get传入的token经过md5加密后,第1位=第14位=第17位并且(第1位+第14位+第17位)/第1位=第31位,可以写一个python脚本跑一下,应该有很多种可能。
import hashlib
a = '0123456789abcdefghijklmnopqrstuvwxyz'
for i in a:
for j in a:
t = (str(i)+str(j)).encode('utf-8')
md5 = hashlib.md5(t).hexdigest()
if md5[1:2] == md5[14:15] == md5[17:18]:
if (int(md5[1:2])+int(md5[14:15])+int(md5[17:18]))/int(md5[1:2]) == int(md5[31:32]):
print(t)
输出结果3j和ZE,但是访问了以后发现ZE没有用
web24
题目:
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');
}
解题思路:
mt_srand() 函数播种 Mersenne Twister 随机数生成器。
提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数。
审计代码,当mt_srand(372619038)函数生成的随机数等于参数r时,得到flag
那么使用php代码运行查看mt_srand(372619038)运行结果
<?php
mt_srand(372619038);
echo(mt_rand());
?>
结果为:1155388967
mt_scrand()函数&mt_rand()函数
mt_scrand(seed)这个函数,是通过分发seed种子,然后有了种子后,利用mt_rand()生成随机数。
当种子不变时,产生的随机数是一样的,这就是伪随机数漏洞。
web25
php伪随机数,逆推种子
参考文章
https://blog.csdn.net/m0_73860001/article/details/131655542
https://www.openwall.com/php_mt_seed/
<?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');
}
Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023
这里的脚本最后一个是可以的
┌──(test㉿kali)-[~/桌面/php_mt_seed-4.0]
└─$ ./php_mt_seed 658026262
Pattern: EXACT
Version: 3.0.7 to 5.2.0
Found 0, trying 0x18000000 - 0x1bffffff, speed 6710.9 Mseeds/s
seed = 0x180b03d8 = 403375064 (PHP 3.0.7 to 5.2.0)
seed = 0x180b03d9 = 403375065 (PHP 3.0.7 to 5.2.0)
Found 2, trying 0xfc000000 - 0xffffffff, speed 6405.8 Mseeds/s
Version: 5.2.1+
Found 2, trying 0x12000000 - 0x13ffffff, speed 68.3 Mseeds/s
seed = 0x13b82f0c = 330837772 (PHP 5.2.1 to 7.0.x; HHVM)
Found 3, trying 0x28000000 - 0x29ffffff, speed 68.2 Mseeds/s
seed = 0x28d2ce04 = 684903940 (PHP 7.1.0+)
Found 4, trying 0x44000000 - 0x45ffffff, speed 68.1 Mseeds/s
seed = 0x4472130a = 1148326666 (PHP 5.2.1 to 7.0.x; HHVM)
seed = 0x4472130a = 1148326666 (PHP 7.1.0+)
Found 6, trying 0xfe000000 - 0xffffffff, speed 67.8 Mseeds/s
Found 6
https://www.openwall.com/php_mt_seed/ https://www.cnblogs.com/zaqzzz/p/9997855.html
解释一下就是下面的理解:
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
找到对应的版本这里自己的运气好第一个出来的自己验证了一下发现就是这个 注:可能存在多个种子需要自己进行判断 通过种子找到第一个随机数就是上面的随机数。
web26
类似第一题,直接bp暴力破解数据库密码,这里GitHub找个常用密码字典就好,慢慢爆破,根据长度不同,查看响应,拿到flag
web27
因为这个数据连接有问题
所以不得不手动访问,
web28
这一题其实听没有思路的,看了题目的提示
不理解为什么,这个要对目录进行爆破,以我目前的实力来看的话,主要是这个有两个目录,但是如果又要删除2.txt才可以,这一点就太难想到了,虽然说每个目录下的文件不同,这个是可以理解的
这个大海捞针挺像moectf的的大海捞针的
这里要跑挺久的,我就直接把结果写出来了
polctf_WEB-login
打开题目是一个登录框
除了登录框之外没有别的信息,但是查看源代码发现一个账号密码,所以用这个账号登录一下
登录回显一个f
这个登录的学号和密码很有特点,都是一样的
猜想:
由于已经回显了一个f,所以考虑是否存在通过用户名遍历信息,采用其他账号登录会回显其他flag
根据以上思路使用202002,202003,202004以及相同密码(即学号)得出完整wp
但是这里的靶场有点问题,没有回显出来
wp结果