web21
打开网站弹出登录窗口
用burpsuite抓包
网站采用的是Basic认证,详细参考https://www.cnblogs.com/rinack/p/7595232.html
输入的用户名和密码以base64的形式传输
使用burpsuite的intruder功能
payloads选择Cutom iterator
position1
position2
使用本题提供的字典
添加base64加密
取消特殊符号的编码,因为base64加密后可能会出现‘=’。
爆破成功
web22
用Layer进行子域名爆破
找到flag.ctfer.com
web23
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-03 11:43:51 # @Last Modified by: h1xa # @Last Modified time: 2020-09-03 11:56:11 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ 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代码分析
对传入的token进行md5,并且需要满足一系列的条件
直接用burpsuite爆破,不用分析逻辑==
自定义真好用
先试下三位,应该够了
每个位置选择a-z,A-Z,0-9
这样爆破唯一坏处就是有点慢,服务器可能处理不过来。==
太慢了,放弃了
还是自己写脚本来判断吧。
给的php代码,那肯定写php脚本了
<?php error_reporting(0); $string = '0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'; for($a=0;$a<strlen($string);$a++){ for($b=0;$b<strlen($string);$b++){ for($c=0;$c<strlen($string);$c++){ $flag = $string[$a].$string[$b].$string[$c]; $token = md5($flag); 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."\n"; } } } } } ?>
跑出来很多匹配的
随便传一个,得到flag
web24
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-03 13:26:39 # @Last Modified by: h1xa # @Last Modified time: 2020-09-03 13:53:31 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ 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_srand即种子被确定后,后面生产的随机数都可以计算出来。
很简单。
web25
分析代码
<?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'); }
$flag不知道,所以种子也不知道,==
但是当判断不正确时,会输出$rand,尝试反推出mt_srand。
利用工具:https://github.com/Al1ex/php_mt_seed
显然计算出mt_rand=1899588896
种子可能的数据有几个。
先试一下最后一个:2864159902
成功拿到flag
web26
字典就用web21给的那个就可以。
web27
录取名单下载下来瞧一瞧
出生年月被隐藏了。
这儿刚好可以用姓名和身份证号登录
用burpsuite爆破
这里抓包的时候第一个抓到的不是我们需要的包,drop掉,第二个才是
要爆挺久的
unicode解码,得到帐号和密码
登录,得到flag
web28
看提示,让我们爆破目录,
有一个200的目录,打开发现flag