与南航的暑期联合训练WP

  1. Web
    1. read-data
    2. rce_me

Web

read-data

这题考了对nodejs代码的基本理解

//app.js
const express = require('express')

const app = express();
const port = 3000;
const fs = require('fs')


try {
    const inputD = fs.readFileSync('table.txt', 'utf-8');
    text = inputD.toString().split("\n").map(e => e.trim());
} catch (err) {
    console.error("读取文件出错:", err);
    process.exit(1);
}

app.get('/', (req, res) => {
    if (!req.query.name) {
        res.send("你查询了吗? XD")
        return;
    }
    let goodLines = []
    text.forEach( line => {
        if (line.match(req.query.name)) {
            goodLines.push(line)
        }
    });
    res.json({"查询结果":goodLines})
})

app.get('/:id/:firstName/:lastName', (req, res) => {
    
    res.send("FLAG")
})

app.listen(port, () => {
    console.log(`App server listening on ${port}. (Go to http://localhost:${port})`);
    

关键代码就看app路由get那段,需要填三个值,分别是id,firstName,lastName,填对了就给你flag

查询name值有哪些,进行模糊匹配

可以看到在第51个id值看到了Flag Holder字眼,说明flag就在这,然后按照刚刚的格式填一下就行,id数一下是51,firstName是Flag,lastName是Holder

payload: /51/Flag/Holder

rce_me

//题目源码
<?php
error_reporting(0);

highlight_file(__FILE__);

function is_safe($input) {
  $blacklist = [
    '\.\.',
    '(php|file|glob|data|tp|zip|zlib|phar):',
    'flag'
  ];
  $pattern = '/' . implode('|', $blacklist) . '/i';
  return !preg_match($pattern, $input);
}

$requestBody = file_get_contents('php://input');
$parsedJson = json_decode($requestBody, true);

if (is_safe($requestBody) && isset($parsedJson) && isset($parsedJson['pages'])) {
  $pageUrl = $parsedJson['pages'];
  $pageContent = file_get_contents($pageUrl);
  if (!$pageContent || !is_safe($pageContent)) {
    $pageContent = "<p>not found</p>\n";
  }
} else {
  $pageContent = '<p>invalid request</p>';
}

$pageContent = preg_replace('/flag\{.+\}/i', 'flag{123}', $pageContent);
echo json_encode(['content' => $pageContent]);
?>

这题考察Unicode编码绕过+伪协议读取

burp抓个包

{“page”:”1”},这是json基本传输数据的格式

file_get_contents这个函数是可以触发 php://filter 的,所以考虑使用伪协议读取,对 php 的过滤使用 Unicode 绕过即可

最终payload:{“pages”:”\u0070\u0068\u0070://filter/convert.base64-encode/resource=/\u0066\u006c\u0061\u0067”}({“pages”:”php://filter/convert.base64-encode/resource=/flag”})

成功读取出base64数据流的flag,解码即可

剩下的题目链接