ctfshow web入门爆破
爆破
web21
先打开网页,用bp抓包,报文中有一个base64编码,解密一下,发现是用户名:密码

使用custom iterator(自定义迭代器)模块,首先第一个放账号admin

第二个放个:第三个放个字典就可以了!
然后再进行base64编码!


这个要取消勾选
最后进行爆破,得到账号密码

账号密码是admin:shark63
web22
爆破长ctf.show的子域名,爆破网址:https://phpinfo.me/domain/
里面有一个vip.ctf.show,页面名称里面就有flag{ctf_show_web}
web23
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__);
}
md5() 函数计算字符串的 MD5 散列。相当于加密
当要 判断一个变量是否已经声明的时候 可以使用 isset 函数
当要 判断一个变量是否已经赋予数据且不为空 可以用 empty 函数
当要 判断 一个变量 存在且不为空 先isset 函数 再用 empty 函数
substr(string,start,length):
string 必需。规定要返回其中一部分的字符串。
start
必需。规定在字符串的何处开始。
正数 - 在字符串的指定位置开始
负数 - 在从字符串结尾开始的指定位置开始
0 - 在字符串中的第一个字符处开始
length
可选。规定被返回字符串的长度。默认是直到字符串的结尾。
正数 - 从 start 参数所在的位置返回的长度
负数 - 从字符串末端返回的长度
例:echo substr("Hello world",1,8) ello wor
echo substr("Hello world",8,1); r
intval ( mixed $var [, int $base = 10 ] )//[]中间的可有可无,会自动转换默认值
//该语句就是将var转换为int10进制
$var:这是一个必需参数,用作需要转换为整数值的变量。
$base:转化所使用的进制。
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
如果字符串以 "0" 开始,使用 8 进制(octal);否则,
将使用 10 进制 (decimal)。
例:echo $var = '7.423'; 7
echo intval(0x1A); 26 (1A的十进制就是26)
上脚本:
姿势一。PHP脚本
<?php
error_reporting(0);
$a="asdfghjklqwertyuiopzxcvbnm1234567890";
for($i=0;$i<36;$i++){
for($j=0;$j<36;$j++){
$token=$a[$i].$a[$j];
$token = md5($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 $a[$i].$a[$j];
exit(0);
}
}
}
}
?>
Kali中运行得到3j

最后get传参:/?token=3j

姿势二。python脚本
import hashlib
a = "0123456789qwertyuiopasdfghjklzxcvbnm"
for i in a:
for j in a:
b = (str(i) + str(j)).encode("utf-8")#
m = hashlib.md5(b).hexdigest()
if(m[1:2] == m[14:15] and m[14:15] == m[17:18]):
if ((int(m[1:2]) + int(m[14:15]) + int(m[17:18])) / int(m[1:2])) == int(m[31:32]):
print(b)
/*
substr() 函数返回字符串的一部分
intval() 函数用于获取变量的整数值。
*/

web24

先进行代码审计

可以写一个简单的脚本
<?php
mt_srand(372619038);
$a = intval(mt_rand());
echo $a;


web25
先审计代码

hint:
mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机 数。 在之前自己还以为需要暴力破解cookie,最后师傅们给我介绍了一个脚本,专门用来跑mt_srand()种子和 mt_rand()随机数的 这里自己解释一下为什么每一次的mt_rand()+mt_rand()不是第一次的随机数相加?? 因为生成的随机数可以说是一个线性变换(实际上非常复杂)的每一次的确定的但是每一次是不一样的,所以不能 进行第一次*2就得到mt_rand()+mt_rand() 使用说只要我们得到种子就可以在本地进行获得自己想要的值 解题:通过随机数来寻找种子 我们让 ?r=0 得到随机数。这里我得到的是 183607393 每一次不一样(因为flag值在变化) 然后下载 php_mt_seed4.0 我们在linux下面使用 gcc进行编译 gcc php_mt_seed.c -o php_mt_seed 之后运行脚本添加随机数 ./php_mt_seed 183607393
找到对应的版本这里自己的运气好第一个出来的自己验证了一下发现就是这个 注:可能存在多个种子需要自己进行判断 通过种子找到第一个随机数就是上面的随机数。
payload: ?r=183607393 Cookie: token=794171094
https://www.openwall.com/php_mt_seed/ 工具
https://www.cnblogs.com/zaqzzz/p/9997855.html php伪随机数漏洞
因此如果给r传0的话,就会生成随机数,这个时候就可以逆序推出种子!

先下载工具,hint里面有工具链接,下载完成后进行解压,放到kali中

文件夹中有三个文件,Makefile文件是用来告诉make需要做什么
在Linux中执行 make 之前,需要一个命名为 Makefile 的特殊文件(本文的后续将使用Makefile 作为这个特殊文件的文件名)来告诉 make 需要做什么(完成什么任务),该怎么做。

根据图中命令步骤进行,这就把工具弄好了
在Kali中进行逆推

然后用脚本寻找token的值
<?php
mt_srand(1064029812);
echo mt_rand()."\n";
$result = mt_rand()+mt_rand();
echo $result;
?>

最后进行传值r=995507831 token=2025179318 从而获得flag

web26
按照框中的提示填入,并抓包
方法一:爆破

从而获得flag

方法二(有点不懂):直接post传参
查看源代码

在checkdb.php页面POST即可

我试了一下,这两个都可以
&a=&p=&d=&u=&pass=
a=&p=&d=&u=&pass=
web27
这题稍微有点离谱,一直爆破不出来
解题:
打开以后发现一个录取名单

下载后打开,发现身份证信息不全

又找到学生学籍信息查询系统,看到需要姓名和身份证号码

所以需要将身份证不全的信息找到,所以要进行爆破
这里用火狐爆不出来,这里可以用谷歌浏览器
构造payload
在学院录取查询页面只对身份证号进行爆破,因为姓名知道

爆出正确身份证号

查看响应,解码响应包里的Unicode编码,得出学号

获得flag

web28

看到0和1,尝试对它们进行爆破,爆破的时候需要将2.txt给删了

clusterbomb的意思是自定义
先对payload1进行构造

在对payload2进行构造

开始爆

flag就出来了!

浙公网安备 33010602011771号