web21
burp有一个功能叫做custom iterator(自定义迭代器)
具体用法可以参考这个
抓包后发现没找到username和password的字段,但是发现了一个奇怪的东西
把后面的东西拿去解码发现是账号密码的base64的编码形式
所以拿burp来拼接后再编码来爆破
这题是由三部分组成:
用户名:密码
把每一部分的字典加上去后就开始设置编码
选择encode和base64编码
再取消Palyload Encoding编码 因为在进行base64加密的时候在最后可能存在 == 这样就会影响base64 加密的结果
然后爆破就行
爆破很久以后终于出来结果
web 23
这题有些新学到的知识
- MD5加密可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
substr()
函数,可以有三个参数
intval()
函数,用来把变量变成整数
php代码分析
<?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__);
}
?>
变量token被md5加密,且它的第一位=第十四位=第十七位,化为整数后(第一位+第十四位+第十七位)/第一位=第三十一位
方法一:利用burp直接在url里爆破
方法二:写脚本,利用hashlib库直接判断出是哪个
import hashlib
dic = '0123456789qazwsxedcrfvtgbyhnujmikolp'
for a in dic:
t = str(a)
md5 = hashlib.md5(t.encode(encoding='utf-8')).hexdigest()
if md5[1:2] == md5[14:15] and md5[14:15]== md5[17:18]:
print(t)
结果只有8,但是提交上去不符合第二个条件,舍去,尝试两个拼接
出来好几个,每一个都提交试一下,发现3j是符合第二个条件的,出来flag
web 24
代码分析,出现了伪随机数,伪随机数的详解可以看这里涉及到mt_srand()和mt_rand()
简单来说就是通过这个函数
mt_srand()
来设定一个种子seed 再通过mt_rand()
来结合种子按照一定的规则得到一个随机数
这是一个线性的计算,每次请求得到的随机数都是不一样的,但是只要种子一样,得到的随机数都是像一个一次函数一样变化的,就像y=ax=b,x就是请求的次数,a和b就是由种子决定
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');
}
题目已经告诉了我们种子,所以我们可以直接写一个php脚本来得到随机数
<?php
mt_srand(372619038);
echo mt_rand();
?>
随机数出来了就可以构造payload/?r=1155388967
web 25
这个题需要使用工具php_mt_seed
分析代码,和上题一样是伪随机数的题目,通过分析可以得出如下思路
- 种子涉及到了flag,所以应该是不能直接求到的
if((!$rand))
要使这个为真就要让$rand=0
,而$rand = intval($r)-intval(mt_rand())
所以要得到随机数才行,让$r=$mt_rand()
就可以了if($_COOKIE['token']==(mt_rand()+mt_rand()))
这个可以知道要在cookie里写入一个token,值为两次随机数相加,而不是第一次的随机数直接翻两倍- 为什么每一次的mt_rand()+mt_rand()不是第一次的随机数相加?因为生成的随机数可以说是一个线性变换(实际上非常复杂)的每一次的确定的但是每一次是不一样的,所以不能 进行第一次*2就得到mt_rand()+mt_rand() ,但是只要我们得到种子就可以在本地请求两次获得自己想要的值
- 所以我们还要求得种子,这就要用到pho_mt_seed来逆推种子了
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');
}
先给r传值,r=0
,这样就会得到随机数的相反数,所以随机数是1024884789
下一步就是使用php_mt_seed来逆推爆破种子
这个工具的使用步骤
- 下载好工具后拉到kali里面,打开文件夹,运行终端,输入
make
- 输入
./php_mt_seed 随机数
就可以开始爆破
因为不知道是第几次得到这个随机数,所以爆破出了很多个
333458700
1393424143
3543501023
再写一个php的脚步来测试是哪个种子第一次就得到这个随机数,发现种子是1393424143
得到了种子,就可以请求两次并求和得到token的值了
要求的都求到了,接下来就是burp改一个包提交就行了
r=1024884789
token=1422233280
web 26
看代码
function check(){
$.ajax({
url:'checkdb.php',
type: 'POST',
dataType:'json',
data:{
'a':$('#a').val(),
'p':$('#p').val(),
'd':$('#d').val(),
'u':$('#u').val(),
'pass':$('#pass').val()
},
success:function(data){
alert(data['msg']);
},
error:function(data){
alert(data['msg']);
}
});
}
发现空的提交竟然连接成功
直接抓包得到flag
web 27
点了名单后得到一个表,加密的地方刚好是出生年月日,可以使用爆破的方式吧身份证爆破出来,可以写py脚本,也可以用burp,burp有一个dates模块刚好用来爆破这个日期,所以推荐使用burp
打开学籍管理系统后以第一个人为例,用burp抓包,比较新的版本里的爆破模块有一个dates模块,专门用来爆破日期信息的,把格式调好,就设定一个范围开始爆破
爆破发现身份证的日期信息应该是19900201,这样身份证就出来了,就直接登录进去拿到flag
web 28
看到了2.txt就想到改数字,改了以后url就一直在变化加一些0101,访问不进去,所以选择burp来爆破目录,暴力破解目录/0-100/0-100/看返回数据包
如果不去掉2.txt还是没有回显的,所以爆破的时候记得去掉2.txt
爆破成功