web21
我们随便输入并使用bs抓包得

通过对这串进行base64解码得此处就是我们输入的账号与密码,形式为:账号:密码
我们使用BS中的测试器模块





开始攻击

得到flag
web 22
现在子域名无法爆破出来,直接查看hint得到flag
web 23
分析源码,我们可以知道token首先被md5进行加密,而且它的第一位=第14位=第17位,(第一位+第十四位+第十七位)/第一位=第三十一位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?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__);
} ?>
|
写一个简单的php爆一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php for($v1=0;$v1<10;$v1++) for($v2=0;$v2<10;$v2++) for($v3=0;$v3<10;$v3++){ $v=$v1.$v2.$v3; $token = md5($v); 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 $v; } } }
?>
|
结果是422
web 24
通过分析源代码我们可以知道
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
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随机数的漏洞:
由于mt_rand()的生成的随机数只跟seed和调用该函数的次数有关。举一个简单的例子来说明一下这个问题,假设使用· mt_srand(1111111)进行了一次播种操作,接下来调用mt_rand()函数,第一次生成的数值为a,第二次生成的为b,第三次生成的为c。任何一个人拿到这样的一串代码,所执行的结果都是跟刚刚描述的一样。所以当你的seed数值被他人知道后,就可以预测出你接下来的数值是多少,这就是该函数的一个问题,他并不能起到一个真随机数的作用。
唯一可能出问题的点就是PHP的版本,不同的版本在相同的种子下给的随机数也不同,因此PHP的大版本要相同,然后
1 2 3
| <?php mt_srand(372619038); echo intval(mt_rand());
|
web 25
一.涉及工具:
php_mt_seed下载地址
此脚本用于伪随机数漏洞,生成伪随机数是线性的,你可以理解为y=ax,x就是种子,知道种子和一组伪随机数不是就可以推y(伪随机数),当然实际上更复杂肯定。
我知道种子后,可以确定你输出伪随机数的序列。
知道你的随机数序列,可以确定你的种子。
用到的是爆破,已经有写好的C脚本了。
这里简单的介绍下这个脚本咋用
kali下,进入目录,make

使用 time ./php_mt_seed-main 随机数
来推出种子
二.解题思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?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()); //intval()用于获取变量的整数值 if((!$rand)){ //只有rand=0的时候才会执行以下语句,所以我们采用r =0; if($_COOKIE['token']==(mt_rand()+mt_rand())){ echo $flag; } }else{ echo $rand; } }else{ highlight_file(__FILE__); echo system('cat /proc/version'); }
|
1.分析php代码,可以先通过r=0 得到mt_rand()第一个值为644268232(每个人得到的数字不同)
2.之后我们进行逆推,推出种子

3.通过如下代码,我们知道要将两个随机数相加得token值
if($_COOKIE[‘token’]==(mt_rand()+mt_rand()))
通过响应头可知PHP的版本为7.311
4.经过尝试我们得到种子和token
1 2 3 4 5 6 7 8
| <?php mt_srand(2835652841); echo mt_rand()."\n"; echo mt_rand()+mt_rand();
644268232 2187070716
|

得到flag
web 26
在数据库页面发现代码,对传参没有要求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <script>
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']); }
}); }
</script>
|

得到flag
web 27
1.下载录取名单
2.通过查询系统爆破
3.可以发现中间正好少了出生年月日

4.成功后看回显,知道学号以及密码为身份证号码
5.登录得到flag
web 28
1.通过原始url知道爆破目录
爆破得到flag