文章目录
- web21
- web22
- web23
- python脚本
- php脚本
- web24
- web25
- web26
- web27
- web28
web21
进入网站,提示要登陆,妥爆破
抓包
注意到最下行的base64编码
发现就是刚刚输入的账号密码
因此这里就是要选择爆破的地方了
发给inruder,添加爆破位
载入题目给的字典,并且添加爆破的规则
爆
web22
略
web23
代码审计
<?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__);
}
?>
题目很简单,只要能满足以上条件即可输出flag
但是仍需要一定的编写代码能力
ctf里,能够用工具解决的都是简单题,所以编写代码的能力是很重要的,希望大家别做脚本小子,多亲自写写,相信一定会有不同的感悟和提升
这里我给出两种方法
python脚本
import requests
import string
strings=string.ascii_lowercase+string.digits
for i in strings:
for j in strings:
url = "http://08945b13-a3f3-425d-a7c5-ae238e8ec15a.challenge.ctf.show/?token="+str(i)+str(j)
res = requests.get(url=url)
if 'ctf' in res.text:
print(res.text)
exit()
这种方法比较慢,但更简单更容易理解,推荐新手使用
php脚本
<?php
error_reporting(0);
$a="qwertyuiopasdfghjklzxcvbnm0123456789";
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))){
print $a[$i].$a[$j];
exit(0);
}
}
}
}
?>
这个脚本优点是速度更快,但需要一定的php基础
以上两种方式都是可以的
web24
源码:
<?
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');
}
?>
这里搜索一下mt_strand()函数:
即生成随机数
其实说是随机数,但并不是真正的随机,这里其实生成的是伪随机数
如何理解?
首先我们要知道,计算机不能产生绝对的随机数,只能产生伪随机数。伪就是有规律的意思。伪随机数就是说计算机产生的随机数是有规律的。那么计算机是怎么产生随机数的?当然是通过算法,这个算法是有映射关系的,如我放进1234,他会出来一个特定的数。
而系统实现随机数是把当前的系统时间放进去,每次时间都不一样,所以可以实现每次出来的数都不一样。如果你每次都放进一样的种子,生成的随机数列就是一样的了。
也就是说,你在不同的电脑上输入同样的种子(比如1234),输出的随机数是一致的
也就是说这道题里产生的随机数其实是固定的
自己电脑上生成一下
这里还要注意一个细节,你所使用的php版本要和服务器的一样,生成的伪随机数才能一致
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=0的值,则得到的rand为伪随机一次的相反数
爆破seed,由php的版本,选取7.1以上的进行尝试
尝试可能的seed即可
web26
对数据库密码进行爆破
web27
进入靶场,页面是登陆系统,可以下载附件查看相关考生信息
身份证号不全,需要完整身份证号进行查询,因此对身份证号爆破
unicode转中文:
登陆得到flag:
web28
对目录进行爆破
两个位置均设置好爆破规则即可