首页 > 其他分享 >攻防世界ez_curl

攻防世界ez_curl

时间:2023-07-08 09:55:05浏览次数:31  
标签:攻防 ch admin req headers ez curl true

点进去就是一个代码审计:

<?php
highlight_file(__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;

题目给的附件是一个app.js:

const express = require('express');

const app = express();

const port = 3000;
const flag = process.env.flag;

app.get('/flag', (req, res) => {
    if(!req.query.admin.includes('false') && req.headers.admin.includes('true')){
        res.send(flag);
    }else{
        res.send('try hard');
    }
});

app.listen({ port: port , host: '0.0.0.0'});

先看一下php代码,有一个file_get_contents('php://input'),这是一个文件包含,当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据是一致的。

然后会$headers = (array)json_decode($input)->headers把post过去的数据解码成数组,很明显post的内容就是http请求里的headers,写post数据的时候要写成json的形式。像这样:

{"headers": ["admin:true"]}

看一下nodejs的判断条件:

 if(!req.query.admin.includes('false') && req.headers.admin.includes('true')){
       res.send(flag);
   }

要求admin传参不包含'false'并且headers请求头里的admin字段包含'true',由于express的parameterLimit默认为1000,即参数最大限制为1000,写脚本请求加上1000个参数就能成功把拼接的&admin=flase挤掉,

后一个条件,要求headers里的admin字段包含'true'就行了,可以是'xtrue',这里根据RFC 7230(HTTP/1.1协议的定义)的规定,规定了 field-name 是由一个或多个打印的 ASCII 字符组成,不包括分隔符,包括空格。因此,如果一个 field-name 的第一个字符是空格,那么这个 HTTP header 是非法的,应该被服务器或客户端忽略或拒绝,然而,Node.js 在处理这类情况时通常是宽容的。

最终的post的内容:

{"headers": ["admin: x", " true: y"]}

这样写可以绕过php代码中的die("try hard")

该headers在nodejs解析的时候,会得到如下数据:

{
  "admin": "x true y"
}

经nodejs解析后admin字段包含‘true’,满足条件。

本机代理有点问题,脚本无法给靶机发送数据,解决后再附上脚本。

标签:攻防,ch,admin,req,headers,ez,curl,true
From: https://www.cnblogs.com/hackerone/p/17536668.html

相关文章

  • Linux | curl命令详解
    curl是一个命令行访问URL的计算机逻辑语言的工具,发出网络请求,然后得到数据并提取出,显示在标准输出“stdout”上面,可以用它来构造httprequest报文,curl(CommandLineUniformResourceLocator),即在命令行中利用URL进行数据或者文件传输。在Linux中curl是一个利用URL规则在命令行......
  • 华为超算平台git、cmake、wget、curl报错:SSLv3_client_method version OPENSSL_1_1_0
    最近在使用超算平台时报错,不管是git、cmake、wget、curl中的哪个都报错,大致错误: /usr/bin/cmake3:relocationerror:/usr/lib64/libcurl.so.4:symbolSSLv3_client_methodversionOPENSSL_1_1_0notdefinedinfilelibssl.so.1.1withlinktimereference  参考网......
  • P8182 「EZEC-11」雪的魔法 / NOIP 模拟赛 20230706 D 思考--zhengjun
    引用:这是一道非常棒的思维题,可以说没有用到任何高深的知识点,却极大地考验了做题人的思维能力和创造性。本题分为两步。根据线性规划对偶或贪心,转化题意。对\(m\)根号分治,然后分别进行分治。\(m\le\sqrt{n}\)分治比较好想,\(m>\sqrt{n}\)的根号分治比较难想。这......
  • JSON中,java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
    使用JSON,在SERVLET或者STRUTS的ACTION中取得数据时,如果会出现异常:java.lang.NoClassDefFoundError:net/sf/ezmorph/Morpher是因为需要的类没有找到,一般,是因为少导入了JAR包,使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-bean......
  • Clonezila备份Linux并恢复
    Clonezila备份Linux并恢复一、使用工具Tuxboot制作U盘镜像:tuxboot-0.8.2.exe镜像版本:clonezilla-live-2.7.3-19-amd62.4.zip二、操作步骤2.1、使用Tuxboot制作U盘镜像​ 制作完成后需在U盘中新建目录用于存放镜像2.2、电脑BIOS设置U盘启动​ 不同品牌的主板设置U盘......
  • linux 安装bluez并编写小demo运行
    之前学了DBus并成功实现简单的通信,现先安装bluez试试,看看能否也可以实现bluez的c语音编程实现广播或者接收等功能第一步:前往官网下载bluez最新版http://www.bluez.org/download/. 第二步:下载成功后进行解压tarxvfbluez-5.66.tar.xz第三步:安装bluez首先执行以下指令......
  • php通过Curl给接口上传文件。
    在PHP中使用cURL上传文件至接口,你可以通过CURLOPT_POSTFIELDS选项来设置文件的内容。以下是一个示例:functionuploadFile($url,$filePath,$fieldName){$ch=curl_init($url);$postData=array($fieldName=>newCURLFile($filePath));c......
  • WP CTF-Web 攻防世界 GFSJ0475 get_post
    「场景」进入场景后提示请用GET方式提交一个名为a,值为1的变量「思路」根据提示在url后加上?a=1,回车发送请求。出现新提示。请再以POST方式随便提交一个名为b,值为2的变量打开brupsuite,配置本地代理为brupsuite中proxy的地址和端口号,刷新浏览器页面,brupsuite捕获到请求......
  • WP CTF-Web 攻防世界 GFSJ0474 view_source
    「场景」题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。「思路」进入场景,右键无法使用,按F12,打开开发者工具,切换到ELements标签页,发现flag...「工具」「知识拓展」......
  • curl -I 192.168.74.128 拒绝连接
     查看直接的linuxweb服务器信息 curlwww.baidu.com都是正常的,唯独curl本机的ip地址就一直报错 由于使用的yum安装的nginx,nginx的一些模块依赖一些lib库,所以在安装nginx,也必须先安装这些lib库,这些依赖库主要有g++、gcc、openssl-devel、pcre-devel和zlib-devel所以执......