WEB21
hint:爆破什么的,都是基操
出现弹窗要输用户名密码,随便输入比如admin | 123.cim登录,抓包如下
这里面会多了一个认证头:Authorization
用burp自带解密发现账户名和密码之间用冒号隔开
尝试爆破(题目给了一个压缩包,里面是后台密码字典)
方法:
在这串base64字符两边加入§,选择payloads——Load载入字典
这里面有几个参数需要配置一下
①首先在payload processing(payload加工)——Add(add prefix加一个前缀)前缀固定好是“admin:”,
②然后再加一个编码payload processing——Add(encode选择base64)
③取消payload Ecoding中URL-encode these character前面的对号√(因为它有等于号,编码以后会造成那边解码失败)不能选这个,选了就失败了!
④Options——Grep-Match,把flag格式输进去:ctfshow(flag出来就停止爆破)
其他就不需要配置了,开启爆破
401状态码:状态码 401 Unauthorized 代表客户端错误,指的是由于缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。 这个状态码会与 WWW-Authenticate 首部一起发送,其中包含有如何进行验证的信息。 这个状态类似于 403 , 但是在该情况下,依然可以进行身份验证。
爆破成功:
解码后发现:admin:shark63
burpsuite另外一种模块的使用:https://www.cnblogs.com/NPFS/p/13797431.html
base64解密,可以发现账号密码的形式为 账号:密码,这里我们采用 Custom iterator进行爆破
使用方法可参考:Custom iterator的使用(自定义迭代器)
WEB22
hint:域名也可以爆破的,试试爆破这个ctf.show的子域名
子域名爆破,所示子域名挖掘机,或者使用phpinfo.me/domain/在线子域名查询
可以看到vip.ctf.show等公开页面(也可以在源码中发现flag)
flag{ctf_show_web}
这就是一个思路,有时候你看到一个站群,它有时候隐藏的一些子域名,我们是可以去通过这个工具来爆破的!
WEB23
hint:还爆破?这么多代码,告辞!
<?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__);
}
?>
/*
函数了解:substr函数格式 (俗称:字符截取函数)
格式1: substr(string string, int a, int b);
格式2:substr(string string, int a) ;
解析:
格式1:
1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
3、b 要截取的字符串的长度
格式2:
1、string 需要截取的字符串
2、a 可以理解为从第a个字符开始截取后面所有的字符串。
*/
/*
函数intval() 函数用于获取变量的整数值。intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值
*/
就是爆破token的md5之后的值,满足条件返回flag
写个PHP脚本,上面的源码其实都可以抄
<?php
for($i; $i<10000; $i++){
$token=md5($i);
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 'token='.$i.' md5='.$token;
}
//满足第一个条件就把i的值返回,再把它i的md5值返回
//将第二个if加入后:同时满足两个条件
}
}
?>
第一个if,访问网页:出现 好多值,这些值都满足将第二个if加入后:同时满足两个条件
我们可以随便用token=1202试一下
WEB24
hint: 爆个🔨
考点:PHP伪随机数
打开网页:
<?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');
}
?> Linux version 5.4.0-80-generic (buildd@lcy01-amd64-030) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021 Linux version 5.4.0-80-generic (buildd@lcy01-amd64-030) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021
/*
mt_srand() 函数:播种 Mersenne Twister 随机数生成器。
提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数。
mt_rand() 函数:使用 Mersenne Twister 算法生成随机整数。
提示:该函数是产生随机值的更好选择,返回结果的速度是 rand() 函数的 4 倍。
提示:如果您想要一个介于 10 和 100 之间(包括 10 和 100)的随机整数,请使用 mt_rand (10,100)。
语法:
mt_rand();
or
mt_rand(min,max);
*/
我们会发现当种子不变时,实际上生成的随机数是固定的。而这就是伪随机数漏洞,部分ctf题便以此为考点
直接用题目的代码就可以帮我们跑脚本了:
<?php
mt_srand(372619038);
echo intval(mt_rand());//输出它的第一个随机值(1155388967)试着提交
?>
如果提交不对也是很正常,这个和版本也有关系,我们调整为PHP7重新生成、提交、得到flag
考点:
同一个种子生成的随机数序列是一样的序列,它不和机器无关,虽然它是在服务器生成,我是在我本机生成,但是只要种子,设置的种子是一样的,那么他生成的随机数序列也就是一样的,我们在日常开发中,一般不设置固定值,作为一个随机数,它不要设置固定值的种子,在新版本中也不要手动设置随机数种子,建议要设置的话和时间相关,这样的话,生成的话可以确保更加随机一点!
WEB25
hint:爆个🔨,不爆了
<?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;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
Linux version 5.4.0-88-generic (buildd@lgw01-amd64-008) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #99-Ubuntu SMP Thu Sep 23 17:29:00 UTC 2021 Linux version 5.4.0-88-generic (buildd@lgw01-amd64-008) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #99-Ubuntu SMP Thu Sep 23 17:29:00 UTC 2021
和WEB24的区别是,他没有明确给出种子,这个种子是需要我们来爆破的,推荐使用php_mt_seed这个工具(网站:https://www.openwall.com/php_mt_seed/),这个需要我们自己去编译。
我们来看一下这个逻辑,$rand = intval($r)-intval(mt_rand());这个是第一个随机数种子,如果我们给r值为0的话,那么$rand的值就是负的第一次的随机数,负值的话会输出$rand
那么 718414783 就是我们第一个随机数
用php_mt_seed进行逆推,得到种子
可以通过time ./php_mt_seed 718414783这个命令来生成,生成的话会有几个版本根据web24我们可知道是PHP7,我们选择seed = 0xcae510c2 = 3404009666 (PHP 7.1.0+)
<?php
mt_srand(0xcae510c2);
mt_rand();//这是第一次生成的随机数
echo mt_rand()+mt_rand();//返回第二次随机数和第三次随机数之和:2234607657
//写入cookie(直接利用开发者工具写入)
?>
写入后直接刷新是没有反应的,为什么呢?因为我们还没有r参数,
任意给r=1(第二个判断又过不了)
让第二个判断中rand值为0,取反的话就是非0,就能进去
这样我们就把第一个随机数拿出来后赋给r值,r值减去第一个随机数后,那么他就会变为0,取反就不为0,就可以进入后面的判断了,那我们就可以拿到最终的flag。
主要就是我们只要能拿到随机数序列中的某个值,就可以有概率反推它的种子,这个就是我们的考点!
归纳总结:
1、首先通过传入/?r=0,获得第一次产生的随机数值;
2、工具第一次产生的随机数值去反推mt_strand中的种子(里面是十六进制)
3、计算mt_rand()+mt_rand(),也就是第二次和第三次产生的随机数的和,将其作为token,插入cookie
4、url中传入r=第一次的随机数,这样$rand=intval($r)-intval(mt_rand())=0,if((!$rand)),if 非0进入循环,获得flag!
WEB26
是让我们去爆破数据库的连接信息,这里其实跟我们web21爆破用户名密码是类似的
输入资料后 发现安装不了,查看网页源代码,其中感觉挺关键的js代码如下:
url后加checkdb.php
以POST方式提交数据:
a(数据库地址localhost)
p(端口:3306)
d(数据库:ctf)
u(用户名:root)
pass(密码:123456)
填写内容,但是是error,不填写内容就出现flag:
至于为什么啥也不填就可以连接成功,这应该是出题目的时候代码逻辑的问题,造成了没有连接成功也返回了正确的标志,所以返回了flag!
WEB27
发现有个录取名单:
发现身份证号但是缺少中间隐藏的日期,写一个PHP脚本爆破(也可以用bp加前后缀,这里为了锻炼代码编写能力,还是用PHP写个脚本进行合法身份证验证,这样就会减少很多爆破时间)
<?php
$card=array();
//生成所有的从1990年到2000年的身份证号码
for($y=1990;$y<2000;$y++){
for($m=1;$m<13;$m++){
if($m<10){
$m='0'.$m;
}
for($d=1;$d<32;$d++){
if($d<10){
$d='0'.$d;
}
array_push($card,'621022'.$y.$m.$d.'5237');
}
}
}
//这个函数是根据身份证最后面1位的校验位来算是否是合法身份证,如果不是合法身份证可以通过这个函数来剔除
function checkCard($c){
$list=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];//定义一个数组里面有不同的权值,这个是每一个位数的权重,顺序是不能乱的
$crc=[1,0,'X',9,8,7,6,5,4,3,2];//有一个校验码,每个人身份证的最后一位就是在十一个数字之内
$ca=str_split($c);//接收到c,将c拆分为数组
$sum=0;
for($i=0;$i<count($ca);$i++){
$sum+=$ca[$i]*$list[$i];//每个数组拿出来以后,和它的权重相乘,比如身份证第一位*7...,两两相乘求和
}
$crc_ =$sum%11;//取余之后得到最后一位的值,和传入的身份证最后一位进行比较,如果相等说明校验通过,否则false
if($ca[count($ca)-1]==$crc[$crc_]){
return true;
}else{
return false;
}
}
//被刚才所有的身份证号进行校验和的验证,拿到合法的身份证号码
foreach($card as $c){
if(checkCard($c)){
echo $c.'<br>';
}
}
?>
用校验和的话可以清除好多非法身份证号,提高爆破速度
或者用dates模块:
爆破出身份证为 高先伊 | 621022199002015237
知道学号为02015237 初始密码: 621022199002015237,登录
ctfshow{c15b0c4f-f9cd-4286-b86f-c42a68fc10ce}
WEB28
这里0和1比较可疑,url后面不管输入什么都会跳转到/0/1/2.txt这个页面
txt文件是固定的,改的话不好改,作为一个靶场环境肯定是动态环境,我们可以把2.txt删除,访问默认文件index.php
Burp Suite中intruder爆破模块四种模式的区别
选择集束炸弹Cluster bomb,爆破从0-100的数字
也可以自己写个脚本生成字典:
<?php
for($i=0;$i<101;$i++){
echo $i.'<br>';
//生成1-100
}
?>
加入结束符:flag出来就结束
把线程改小一点