CTFshow-Web入门模块-爆破
by 故人叹、
web21
考察点:burpsuite使用、自定义迭代器使用
题目提供了字典,要求登录并提示了爆破,使用burpsuite抓包并操作:
(1)用户名一般为admin,密码随意输,抓包并发送给爆破模块。
可以看到Basic后有一段base64编码,解码得到 用户名:密码 的格式,证明我们之后的payload在此处,并且格式要与此一致。
(2)在爆破模块选择单点爆破,设置新的payload位置。
(3)在payload设置中,选择 自定义迭代器 模式,并为位置1、2、3分别设置用户名admin、符号:、题目提供的密码字典。
(3)因为原始payload为base64加密形式,则我们的payload编码形式也必须是base64编码,并设置不需要url编码,因为base64编码中可能含有“=”,如果设置了url编码形式则“=”会被编码,导致爆破不成功。
(4)点击开始攻击,根据返回页面字符长短找到爆破的结果。
web22
考察点:子域名爆破
题目提示爆破子域名“ctf.show”,理论上可以使用Layer子域名爆破工具爆破出来,但查看wp得知有flag的子域名失效,访问该子域名失败,还是直接拿flag吧。
web23
考察点:爆破
题目源码:
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__);
}
代码解析:
- 通过GET传参传入一个token值
- 对传入的token值进行md5加密
- 对于加密后的字符串,如果第2个字符等于第15个字符,且第15个字符等于第18个字符,通过第一层检测
- 如果上述条件为真,则将md5字符串的第2、15、18位字符的整数值和与第2位字符的整数值相除,结果与第32位字符的整数值进行比较,相同则输出flag
思路:使用php代码,根据题目要求的条件进行爆破,爆破集可用数字集或字符集。
//爆破符合条件的数字
<?php
for($i = 0;$i<=100000;$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 $i;
}
}
}
?>
422
也可用python对字符集进行爆破。
import hashlib
str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789"
for i in range(62):
for j in range(62):
for k in range(62):
temp = str[i]+str[j]+str[k]
token = hashlib.md5(temp.encode("utf-8")).hexdigest()
if token[1:2] == token[14:15] and token[14:15] == token[17:18]:
if (ord(token[1:2])) >= 48 and ord(token[1:2]) <= 57 and (ord(token[14:15])) >= 48 and ord(token[14:15]) <= 57:
if (ord(token[17:18])) >= 48 and ord(token[17:18]) <= 57 and (ord(token[31:32])) >= 48 and ord(
token[31:32]) <= 57:
if (int(token[1:2]) + int(token[14:15]) + int(token[17:18])) / int(token[1:2]) == int(token[31:32]):
print(temp)
aDp
a6e
为token传参符合条件的值即可得到flag。
web24
考察点: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');
}
代码解析:
- GET传参给变量r
- 设置随机数种子
- 对传入的r和根据指定种子生成的随机数进行比较,相同则获得flag
思路:指定伪随机数的种子,就可以生成相同的随机数,我们在本地php设定与题目中相同的随机数种子,并生成一个随机数,再将随机数传参给r,拿到flag。
<?php
mt_srand(372619038);
echo mt_rand();
?>
1155388967
web25
考察点: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');
}
代码解析:
- 通过GET传参,传入一个变量r
- 将flag的md5值的前8位转为十进制数,作为随机数的种子
- 定义变量rand,其值为传入的r与第一次生成的随机数的差
- 对rand取非,如果为true则比较cookie中的token的值与第二、三次生成的随机数的和,相等则输出flag;否则会输出变量rand
由上题得知,在种子确定的情况下,每次生成的随机数会相同(在每一次程序运行时,单次运行第一次生成的和第二次生成的不一定相等),所以我们有以下思路:
(1)传入参数r,通过相减后输出的结果rand推出第一次生成的随机数。
(2)通过该随机数逆推出当前程序所使用的随机数种子(Web题为动态flag,此题种子根据flag来生成,每次创建题目实例都会变),此处使用一个根据随机数爆破种子的脚本 php_mt_seed,该工具可以爆破出各个php版本下的随机数种子,推荐选择php版本7.0+的种子。
工具地址:https://github.com/Al1ex/php_mt_seed
首先进入脚本所在文件夹,make命令创建可执行文件,后使用 time ./php_mt_seed [随机数] 命令开始爆破。
(3)选择的种子必须符合第一次生成的随机数等于作为爆破条件的随机数,可在本地php环境中尝试。
<?php
mt_srand(4251928444);
echo mt_rand()."\n";
echo mt_rand()+mt_rand();
?>
2010035246
3113214722
确认了种子,输出第二、三次生成的随机数的和,传值给cookie中的token,用于比较。
(4)进行比较的条件是 !rand == true,则此时我们给变量r传值第一次生成的随机数,使rand的值为0,经过非运算符变为1(php中,非0值在if判断中解析为true,0解析为false),通过if选择,拿到flag。
web26
考察点:源码审计、爆破
题目打开是一个安装系统:
在源代码中发现一段:
通过ajax异步请求,在checkdb.php页面使用POST传5个参数,如果五个参数符合要求,输出flag。
进入checkdb.php界面POST传参。
web27
考察点:日期爆破
进入一个教务管理系统登录页面,登录需要学号和密码,目的很明确:登录拿flag。
点击录取名单,可以看到部分学生信息:
通过学籍查询系统应该可以获得学号,下一步我们就需要爆破身份证号中被隐去的部分,正好是生日部分,则爆破日期。
选择日期范围,日期格式为“yyyyMMdd”,爆破第一个人的生日。
爆破出来后使用其姓名和身份证号登录,有弹窗信息:学号,密码为身份证号,直接登录即可。
web28
考察点:目录爆破
拿到题目看到一句话:
可以看到url处有 /0/1 字样,结合这一题提示爆破,猜测为爆破目录,访问正确的目录就能拿到flag。
使用burpsuite,抓包并发送给攻击器,设置集束炸弹模式,在目录名处设置两个payload位置。
为两个payload分别设置内容和范围。
最终爆破出正确的目录是 /72/20,在响应页面可以看到flag。
标签:Web,爆破,入门,rand,flag,token,CTFshow,随机数,php From: https://www.cnblogs.com/yuspace/p/18133144