CTFSHOW-WEB入门
使用工具:dirbsearch、
php随机数下载链接:https://www.openwall.com/php_mt_seed/php_mt_seed-4.0.tar.gz
靶场链接:
爆破
web21
BP抓包跑字典这边加载了三个自定义载荷,有效载荷处理,取消有效载荷编码,使用的狙击模式,
web22
这关就是爆破子域名,里面有一个vip.ctf.show,页面名称里面就有flag{ctf_show_web}
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'); // 包含 'flag.php' 文件,通常在该文件中会定义一个 $flag 变量(表示 CTF 挑战的目标)
// 检查是否通过 GET 请求提供了 'token' 参数
if (isset($_GET['token'])) {
// 对提供的 token 进行 MD5 哈希运算,生成 32 字节的哈希值
$token = md5($_GET['token']);
// 条件 1:检查哈希值中第 2 位、15 位和 18 位字符是否相同
// substr($token, 1,1) 取出哈希的第 2 个字符
// substr($token, 14,1) 取出第 15 个字符
// substr($token, 17,1) 取出第 18 个字符
if (substr($token, 1,1) === substr($token, 14,1) && substr($token, 14,1) === substr($token, 17,1)) {
// 条件 2:将第 2、15、18 位字符转为整数并相加,除以第 2 位的整数,结果需等于哈希的最后一位字符的整数
// intval() 用于将字符转换为整数
if ((intval(substr($token, 1,1)) + intval(substr($token, 14,1)) + substr($token, 17,1)) / substr($token, 1,1) === intval(substr($token, 31,1))) {
// 如果条件 1 和条件 2 都满足,输出 $flag
echo $flag;
}
}
} else {
// 如果没有提供 'token' 参数,显示当前文件的源代码
highlight_file(__FILE__);
}
?>
这个代码通过对输入的 token 进行 MD5 哈希运算,并对特定字符进行判断,条件满足后会输出 CTF 的 flag,使用python脚本进行爆破
import hashlib # 导入 hashlib 模块,用于生成 MD5 哈希值
# 定义字符集合,包含数字和字母的组合
a = "0123456789qwertyuiopasdfghjklzxcvbnm"
# 使用双重循环遍历字符集合中的每个字符组合(两位)
for i in a:
for j in a:
# 将两个字符拼接成字符串,然后编码为字节格式(用于 MD5 哈希)
b = (str(i) + str(j)).encode("utf-8")
# 生成字符串 b 的 MD5 哈希,并将哈希结果转换为 32 位的十六进制字符串
m = hashlib.md5(b).hexdigest()
# 检查 m 的特定位置上的字符是否都是数字
if m[1:2].isdigit() and m[14:15].isdigit() and m[17:18].isdigit() and m[31:32].isdigit():
# 条件 1:哈希值中第 2 位(索引 1)字符、 第 15 位(索引 14)字符、 第 18 位(索引 17)字符必须相同
if m[1:2] == m[14:15] and m[14:15] == m[17:18]:
# 条件 2:这几个字符的整数和除以第 2 位字符的整数结果必须等于哈希值的最后一位字符的整数
if ((int(m[1:2]) + int(m[14:15]) + int(m[17:18])) / int(m[1:2])) == int(m[31:32]):
# 如果条件都满足,输出满足条件的字符组合(原始的两个字符字节形式)
print('结果为:',b)
#结果为:3j
GET token=3j即可出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"); // 包含 'flag.php' 文件,通常在该文件中会定义一个 $flag 变量(表示 CTF 挑战的目标)
// 检查是否通过 GET 请求提供了 'r' 参数
if (isset($_GET['r'])) {
$r = $_GET['r']; // 获取 GET 请求中的 'r' 参数
mt_srand(372619038); // 设置随机数生成器的种子,确保生成的随机数可预测
// 将 'r' 参数转换为整数,并与生成的随机数进行比较
if (intval($r) === intval(mt_rand())) {
// 如果相等,输出 $flag
echo $flag;
}
} else {
// 如果没有提供 'r' 参数,显示当前文件的源代码
highlight_file(__FILE__);
// 显示服务器操作系统版本信息
echo system('cat /proc/version');
}
?>
利用 Python 或其他编程语言模拟 PHP 的随机数生成器,使用相同的种子,生成随机数,并用它与 r 进行比较。构造 GET 请求,通过请求中带上正确的 r 参数来获取 flag
<?php
mt_srand(372619038);
//赋值给$a,intval — 获取变量的整数值
$a = intval(mt_rand());
echo $a;
//1155388967
最后拿到flag
web25
题目代码如下
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 14:00:00
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 14:30:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
include("flag.php"); // 包含一个 PHP 文件,其中包含 $flag 的值
if (isset($_GET['r'])) { // 检查 GET 请求中是否有 'r' 参数
$r = $_GET['r']; // 获取 'r' 参数的值
// 使用 $flag 的 MD5 哈希值的前8个字符来设置随机数种子
// hexdec() 将 MD5 的子串转换为十六进制数
mt_srand(hexdec(substr(md5($flag), 0, 8)));
// 生成一个随机数 mt_rand(),并将 'r' 参数与生成的随机数进行比较
// 如果两者相等,$rand 的值应为 0
$rand = intval($r) - intval(mt_rand());
if ((!$rand)) { // 如果 $rand 为 0,则意味着 'r' 与生成的随机数相等
// 检查 Cookie 中的 'token' 值是否等于两个 mt_rand() 随机数的和
if ($_COOKIE['token'] == (mt_rand() + mt_rand())) {
echo $flag; // 如果条件满足,输出 flag
}
} else {
// 如果 'r' 参数不匹配生成的随机数,输出 $rand 的值(用于调试或提示)
echo $rand;
}
} else {
// 如果 'r' 参数未设置,显示当前文件的源代码并输出系统版本信息
highlight_file(__FILE__); // 高亮显示当前 PHP 文件的源代码
echo system('cat /proc/version'); // 输出系统版本信息
}
?>