靶场/来源: ctfshow
web21
题目:
题目提供了一个密码字典,下载即可
解题过程:
分析抓包,发现根据输入登录用户与密码得不同,Authorization都不同,分析其值 MTExOjIyMg== ,判断其为base64编码,对其解码,得到刚才111:222(登录账户:密码),使用burp对其进行爆破,设置如下:
在有效载荷处理处使用前缀名admin:(猜测用户名为admin),然后进行base64编码
爆破成功:
知识点:
web23
题目:
<?php
error_reporting(0);
include('flag.php');
if(isset($_GET['token'])){ #使用get请求传入一个token
$token = md5($_GET['token']); #对token进行md5加密
#加密后得md5要符合下面一大堆规则,还是使用爆破吧
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__);
}
?>
解题过程:
抓包
设置规则,使用蛮力破解(因为没有规则可以用)
最后爆破出来为3j
知识点:
web24
题目:
解题过程:
对代码进行审计,发现mt_srand(),百度其用法,发现其如果设置了播种值,mt_rand()每次生成的随机数会相同(伪随机数),所以使用echo mt_rand()对其生成的值进行输出
得到其生成的值
再构造url:地址?r=1155388967得到flag
知识点:
mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机数。 提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数因此不需要播种,并且如果设置了 seed参数生成的随机数就是伪随机数,意思就是每次生成的随机数是一样的
web25
题目:
<?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; #如果rand不等于0则输出rand
}
}else{ #如果未定义r则输出此文件的源代码
highlight_file(__FILE__);
echo system('cat /proc/version');
}
?>
解题过程:
通过分析代码,这里可以令r等于0,从而求出mt_rand()的值(第7行),注意去除负号
得出mt_rand()为424485486
接下来就是解决token问题,这里需要对利用生成的随机数对种子进行破解
#使用php_mt_seed4.0 我们在linux下面使用gcc编译
gcc php_mt_seed.c -o php_mt_seed
#之后运行脚本添加随机数
./php_mt_seed 424485486
可以看到爆出了多个可能的种子,然后用php对其进行一一尝试
<?php
error_reporting(0);
include("flag.php");
$data=array(2842768692,119863145,1188895974,1439248936,2480548275,3087409991,4059342533,4224933991);
for ($i=0; $i < count($data); $i++) {
mt_srand($data[$i]);
mt_rand();
echo mt_rand()+mt_rand();
echo "/";
}
?>
运行php得到下列值
再对其一一尝试
得到flag
知识点:
php_mt_seed下载地址:https://github.com/openwall/php_mt_seed
mt_rand()面对同一种子在一个函数多次调用的值都不相同,所以不能将mt_rand()+mt_rand()单纯看作mt_rand()*2
知识点汇总:
mt_scrand(seed)与mt_rand()伪随机数生成
mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机数。 提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数因此不需要播种,并且如果设置了 seed参数生成的随机数就是伪随机数,意思就是每次生成的随机数是一样的
php_mt_seed下载地址:https://github.com/openwall/php_mt_seed
mt_rand()面对同一种子在一个函数多次调用的值都不相同,所以不能将mt_rand()+mt_rand()单纯看作mt_rand()*2