写一个小CTF平台
0x00.前言
协会要举办信息安全大赛了,初赛的web+crypto+misc主要由我来出题,注册、比赛的平台也都要由我来写
上周日完成了注册页面的后端(前端由另一个女生写的),前天下午大概完成了比赛平台的所有基本功能(前端也是由我写的...)
独立写完比赛平台,有些收获打算写在这里,先留个坑,等比赛完了再填坑
后端:PHP
数据库:MySQL
0x01.登录页面
登录界面的前端是直接找的一个比较简朴的框架。
后端检验用户的输入,队伍名是只允许出现中英文、数字及下划线的,我用的preg_match()进行正则匹配
if(!preg_match('/^(?!_)[A-Za-z0-9_\x{4e00}-\x{9fa5}]+$/u',$_POST['team'])) {
echo "<h2 align='center'><font color='#FF00000'>队名只能包含中英文、数字及下划线!</h2>";
}
验证合法后,连接MySQL,采用php里mysqli扩展的预编译执行SQL语句(防注入),查询队伍是否存在
//数据库连接
$con = new mysqli('localhost',username,password,database);
if ($con->connect_error) {
die("连接失败: " . $con->connect_error);
}
// 预处理及绑定
$stmt = $con->prepare("SELECT team,pwd FROM teams WHERE team=? AND pwd=?");
$stmt->bind_param("ss", $team,$pwd);
// 执行成功
if($stmt->execute()){
$stmt->store_result(); //取回结果
if(($stmt->num_rows())==1){
$_SESSION['team'] = $team; //记录一个Session
header("Refresh:0;url=index.php"); //登陆成功跳转至主页
}else{
echo "<h2 align='center'><font color='#FF00000'>队名或密码错误!</h1>";
}
}
0x02.功能框架
思考:一个CTF平台应该具备些什么基础的功能?
1.发公告的首页
2.队伍得分的排行榜
3.比赛做题的界面(重点)
4.注销
以上四点是我觉得一个CTF平台应具备的最基础的功能
另外可扩展的功能有比如:*查看队伍信息(包括成员、做题情况等),*后台管理页面等
由于时间较紧迫,初赛比较小型,所以就没写那么多,以后有时间再多扩展些功能
平台的前端也是找的一个比较清新的导航界面框架
上面的导航栏可以随鼠标向下滑动而上移
0x03.数据库及身份认证
数据库存了队伍的队名、密码、队长+成员、得分、各个题是否已做的信息。由于怕自己写的平台有漏洞,就没有把flag放在数据库中。
值得注意的是,得分的那一个字段需要定义为int类型,不能定义为varchar类型,否则后面按得分排名时会出错
对队伍的身份认证采用Session会话管理,用session记录队名,并且在做题页面中,会先查询队伍做题情况并记入session中。已做的题就会在题旁边显示已做,并且不允许再重复提交flag
平台上的每个界面一开始都要检查用户是否已登录
session_start();
if(!isset($_SESSION['team'])){
$login = false;
}else{
$login = true;
}
在每个功能页面都包含这段代码,检查$login的值就行
若已登录,导航栏是这样的
未登录是这样的
0x04.排行榜
排行榜比较简单,查询数据库按分数排名,循环打印出来
$sql = "SELECT team,leader,member1,member2,score FROM teams ORDER BY score DESC";
if($res = mysqli_query($con,$sql)){
$num = 1;
while($row = mysqli_fetch_assoc($res)){
echo "
<tr>
<td class='a'>".$num."</td>
<td class='b'>".$row['team']."</td>
<td class='c'>".$row['leader']." ".$row['member1']." ".$row['member2']."</td>
<td class='d'>".$row['score']."</td>
</tr>";
$num++;
}
}
0x05.答题页面
由于前端不太会..js也不太会,不知道怎么写出ctfd那样的效果,只好用table来装各个题了...
效果是这样的
因为没写后台,所以这些题都是直接在源代码里添加修改
在题目旁边会检查队伍是否已做出该题
if(@$_SESSION['web1']=='1'){
echo ' <font color="#32CD32">已解决√';
}
验证flag时,我是将flag以及题目的分值放在一个配置文件里,提交flag时将其包含
检验flag代码如下
if(isset($_POST['web1submit'])){
if(!empty($_POST['web1flag'])){
if($_SESSION['web1']==0){
if(@$_POST['web1flag']===$web1flag){
require("mysqlcon.php");
// 查询队伍当前分数
$sql = "SELECT score FROM teams WHERE team='".$_SESSION["team"]."'";
if($res = mysqli_query($con,$sql)){
while($row = mysqli_fetch_assoc($res)){
$score = $row['score'];
}
}
// 加分
$score += $web1score;
// 更新分数
$sql = "UPDATE teams SET score='".$score."' WHERE team='".$_SESSION["team"]."'";
if(mysqli_query($con,$sql)){
// 更改web1列记录已做
$sql = "UPDATE teams SET web1=1 WHERE team='".$_SESSION["team"]."'";
if(mysqli_query($con,$sql)){
echo '<br><font color="#32CD32">正确√';
}
}
mysqli_close($con);
}else{
echo '<br><font color="#FF00000">错误×';
}
}else{
echo '<br><font color="#FF00000">请勿重复答题!';
}
}
}
0x06.细节
1.【单双引号】
通过这次写这个平台,才了解到php中单双引号的使用还是有很大区别的,主要区别在于单引号会把【引号内完全当字符解析】,而双引号会【解析引号内的简单变量】,更厉害的是花括号{}——可以解析更复杂的变量
0x07.缺陷
缺陷就有很多了,比如,
代码冗长,无后台管理界面,对队伍相关信息的操作修改也不方便,出新题也不方便等等,这些也就只有慢慢优化改善这个平台了
写一个小CTF平台的更多相关文章
- Python之小测试:用正则表达式写一个小爬虫用于保存贴吧里的所有图片
很简单的两步: 1.获取网页源代码 2.利用正则表达式提取出图片地址 3.下载 #!/usr/bin/python #coding=utf8 import re # 正则表达式 import urll ...
- 用android去写一个小程序
前言: 软工的一个小作业:实现"黄金分割小游戏", 需要结对编程,队友:陈乐云 共用时两天. 早期思路设计: 采用键值对的形式,以Map作为存储结构.优点:能够将数据与用户对 ...
- 用Python写一个小爬虫吧!
学习了一段时间的web前端,感觉有点看不清前进的方向,于是就写了一个小爬虫,爬了51job上前端相关的岗位,看看招聘方对技术方面的需求,再有针对性的学习. 我在此之前接触过Python,也写过一些小脚 ...
- 写一个小demo过程中遇到的各种问题 学生管理考勤系统(网页模拟)
添加与新增一些小玩意的1.0.3版本:传送门 各位带哥,这不是你们要的c++.java.c#作业哈 课上要求做个小作业,学生管理考勤系统,原本想着是个练手的好机会,结果只证实了我还是个弟中弟. 设想的 ...
- 写一个小程序实现win系统定时锁屏
貌似很久没写程序了,随便用C语言实现吧 #include<stdio.h> #include<stdlib.h> int main(){ system("rundll ...
- 01)原生php写一个小网站
PHP留言板说明 1.帮朋友做一个毕业设计,本科大学生,都不知道框架是什么...只能原生PHP写了. 2.这里主要是做一个学习笔记. 3.项目开始会杂乱无章,慢慢整理. 需求 (1)用户注册:用户实现 ...
- 用c写一个小的聊天室程序
1.聊天室程序——客户端 客户端我也用了select进行I/O复用,同时监控是否有来自socket的消息和标准输入,近似可以完成对键盘的中断使用. 其中select的监控里,STDOUT和STDIN是 ...
- 下载eclipse 配置eclipse 新建Java项目 写一个小程序 运行
为了更好的学习java,我打算下载个eclipse 地址:https://www.eclipse.org/downloads/packages/ 我们需要下载的版本是Eclipse IDE for J ...
- 【Java】一个小程序,计算它包含的代码所需的耗时
写一个小程序,用来计算它包含的代码所需的耗时.虽然简单,测试代码是否耗时还是有点用的,不用重新写嘛~ import java.util.Date; import java.util.concurren ...
随机推荐
- 关于springboot2.x 的 RedisCacheManager变化
springboot配置缓存过期时间,大部分是使用ReidsCacheManager来进行自定义的配置 以下是大部分网上的代码(这也是基于springboot1.x的版本可以使用的) @Beanpub ...
- windows旋转屏幕快捷键配置
1.打开屏幕分辨率 2.高级设置 3.英特尔核心显卡控制板 4.图形属性 5.选项和支持 6.管理快捷键(启用.禁用)
- 菲律宾Globe/TM卡最省钱的上网方案
基本技能点 1:发送SURFALERT ON到8080,这样就关掉了余额扣费的上网方式,防止因为套餐耗尽后疯狂扣话费. 2:用Coins.ph充个15Pisos(也就2元人民币),或则充多点钱都可以. ...
- Linux设置虚拟内存教学和实战
介绍 在我们自己的购买的服务器环境中,一般是买的1g的内存,但是当服务器里面的东西装的比较多的时候就会导致内存不够用了,本文将模拟一个真实的内存不够用的情况下,如何通过修改虚拟内存来让系统正常运行,我 ...
- List Leaves
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...
- 菜鸟的java代码审计之旅-0之java基础知识
前言: 对于java的代码审计我就是一个小白,没有代码基础(不会java),从0开始记录我的java漏洞的审计学习之旅.对于java来说是一门很难的语言,但是不去学习就永远不会.对于一门很复杂的语言如 ...
- Tomcat中acceptCount,maxConnections、maxThreads的含义及关系
个人对tomcat连接器3个属性maxConnections.maxThreads.acceptCount的理解: 先摘取官网对这3个属性的描述: acceptCount The maximum qu ...
- Go语言 并发编程
Go语言 并发编程 作者:Eric 微信:loveoracle11g 1.创建goroutine // 并行 是两个队列同时使用两台咖啡机 // 并发 是两个队列交替使用一台咖啡机 package m ...
- 适用于移动设备弹性布局的js脚本(rem单位)
背景介绍 目前,随着移动设备的普及和4G网络的普及,web在移动端的占比已经远远超过PC端,各种H5页面推广页面,H5小游戏热度火爆.以前简单的使用px单位(没有弹性)的时代已经无法满足各位设计师和用 ...
- dotnet core调试docker下生成的dump文件
最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...