web21
先输入账号admin,密码随便输入,bp抓包
输入的账户名和密码被base64加密了,用burp自带解密发现账户名和密码之间用冒号隔开了
接下来可以爆破了
载入题目字典
加前缀
再加一个编码
这个应该取消掉,因为里面有=,会造成编码失败
把flag格式输进去
开始爆破
得到flag
web22
推荐使用这个网站
没有发现
输入其他地址也没有发现
在页面中输入vip.ctf.show,发现flag
web23
看代码
是爆破token md5后面的值
如果这个token满足后面的if条件则出现flag
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)
print('加密后字符串为:',m)
运行python脚本:打开cmd窗口中,输入python后,进入python交互式命令行。直接输入代码
得到b和3j
传参token=b
没有结果
传参token=3j,得到flag
web24
rand() 函数可以不加任何参数,就可以生成随机整数。如果要设置随机数范围,可以在函数中设置 min 和 max 的值。如果需要生成随机数的种子,使用 srand 函数配置。
mt_rand() 是使用 Mersenne Twister 算法返回随机整数,与 rand() 函数的主要区别是:
mt_rand()产生随机数值的平均速度比 libc 提供的 rand() 快四倍,并且播种函数使用mt_srand(),而不是srand()。虽然有这点区别,但是它们的使用方法还是相似的
说明:rand() 和 mt_rand() 两个函数生成的随机数都是整数,不会包含英文字母。
通过这个函数mt_srand()来设定一个种子seed 再通过mt_rand()来结合种子按照一定的规则得到一个随机数
这是一个线性的计算,每次请求得到的随机数都是不一样的,但是只要种子一样,得到的随机数都是像一个一次函数一样变化的,就像y=ax=b,x就是请求的次数,a和b就是由种子决定
根据代码分析
提交一个r,设置一个随机数种子,判断我和他的随机数种子是否一致,如果这个种子相同,生成值相同,得到flag
先写一个PHP脚本
<?php
mt_srand(372619038);
echo intval(mt_rand());
将1.php放在PHP study的www目录下,打开网站输入http://localhost/我的文件名,则可以运行PHP脚本
得到结果
运行得伪随机数1155388967
传递/?r=1155388967即可获取flag
web25
主要源码:
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;
}
}
由源码可以发现我们可以利用r=0得到mt_rand()的值
得到mt_rand()值后,我们需要回推出种子,利用php_mt_seed工具
php_mt_seed-PHP mt_rand()种子破解程序下载地址
https://www.openwall.com/php_mt_seed/
分析代码,和上题一样是伪随机数的题目,通过分析可以得出如下思路
1.种子涉及到了flag,所以应该是不能直接求到的
2.if((!$rand))要使这个为真就要让$rand=0,而$rand = intval($r)-intval(mt_rand())所以要得到随机数才行,让$r=$mt_rand()就可以了
3.if($_COOKIE['token']==(mt_rand()+mt_rand()))这个可以知道要在cookie里写入一个token,值为两次随机数相加,而不是第一次的随机数直接翻两倍
4.为什么每一次的mt_rand()+mt_rand()不是第一次的随机数相加?因为生成的随机数可以说是一个线性变换(实际上非常复杂)的每一次的确定的但是每一次是不一样的,所以不能 进行第一次*2就得到mt_rand()+mt_rand() ,但是只要我们得到种子就可以在本地请求两次获得自己想要的值
5.所以我们还要求得种子,这就要用到pho_mt_seed来逆推种子了
下载好工传递参数r=1469584721 token=2772329577,获得flag具后拉到kali里面,打开文件夹,运行终端,输入make
输入./php_mt_seed 随机数
就可以开始爆破
传递参数r=1469584721 token=2772329577,获得flag
将cookie改成token=2772329577,传参r=1469584721,即可得到flag
web26
打开此界面
查看源码得到
在checkdb.php页面POSTa=&p=&d=&u=&pass=
获得flag
web27
打开页面之后,发现有录取名单
点击下载名单,身份证中的生日被隐藏了
又找到学院录取查询页面,看到要输入姓名和身份证号,姓名已经有了,身份证有一部分,接下来只要爆破出生日期就行
构造payload
爆破出正确身份证号
解出响应包的Unicode编码,得到学号
输入学号和身份证号,获得flag
获得flag
web28
发现
将/2.txt去掉后进行爆破
开始爆破
观察结果得到flag