2025XYCTF部分wp
Mash1r0 CTF 270浏览 · 2025-04-10 00:20

Misc

问卷

通过访问https://www.wjx.cn/vm/r8BpK59.aspx填写即可

图片加载失败


XGCTF

https://www.cnblogs.com/LAMENTXU/p/18691608

找到年终总结

图片加载失败


然后找博客。

https://dragonkeeep.top/category/CISCN%E5%8D%8E%E4%B8%9C%E5%8D%97WEB-Polluted/

页面源码中有flag。

图片加载失败


flag{1t_I3_t3E_s@Me_ChAl1eNge_aT_a1L_P1e@se_fOrg1ve_Me}

会飞的雷克萨斯

图片加载失败


地图查找

图片加载失败


对比附件建筑,确定是这里。

图片加载失败


图片加载失败


结合一下。

flag{四川省内江市资中县春岚北路中铁城市中心内}

曼波曼波曼波

txt很像base64,但是解码不了,发现等号在最前面,进行逆序,然后再base64解码,是一张图片。

随波逐流发现有文件在里面,Binwalk提取。

图片加载失败


解压压缩包,提示密码为XYCTF2025,继续解压,得到一张图片。

结合前面的一张图片,双图片盲水印。

梭哈。

图片加载失败


图片加载失败


XYCTF{easy_yin_xie_dfbfuj877}

MADer也要当CTFer



MADer也要当CTFer



MADer也要当CTFer



MADer也要当ctfer

mkv文件,打开发现播放长度不同

题目提示为调整视频,但经过简单调整颜色位置大小等并没收获,放在工具中也并也发现隐写

用网上的小网站提取一下字幕流ass,

图片加载失败


使用脚本将二进制文件提出16进制,然后转成文件再读取

瞎读,看见了一堆乱码里不太一样的东西

图片加载失败


Web

ezsql(手动滑稽)

时间盲注,首先在测试过程中发现一个页面。

即可触发。

图片加载失败


逐步测试发现过滤了空格,逗号等,但是sleep存在,编写脚本。

图片加载失败


后续逐步跑脚本,下面是拿key的脚本。

图片加载失败


key:

dtfrtkcc0czkoua9S

进来之后rce。

图片加载失败




源码里面有提示,不过有一些waf。

图片加载失败


Signin

首先源文件里面给了一个python源码

这里存在两个路由,一个是download,这个路由是用来实现任意文件读取的操作,而/secret路由是获取对应cookie字段值的,在获取字段值时存在pickle反序列化,前提是读取secret.txt

这里进行了waf,绕过waf可以通过 ./.././../secret.txt来进行读取

图片加载失败


接下来通过原来的函数来实现伪造pickle反序列化流即可,再读取文件即可

图片加载失败


图片加载失败


图片加载失败


ez_puzzle

view-source://访问页面源代码,然后f12,调试,但是好像不行。直接ctrl+s保存源码,从网络里面把图片脱下来,本地部署项目。

图片加载失败


js题一般通过alert来进行弹出flag,然后改条件判断。

图片加载失败


根据题目描述两秒内解决问题,猜测if进入弹出的是flag,修改为1不做判断进入if语句。

本地部署完成拼图即可。

图片加载失败


出题人已疯

修改源码进行调试,这个\不知道是禁什么,这里无法进行换行绕过,估计就是需要短的payload进行flag的读取,题目明确说明flag在/flag。

{{open('/flag').read()}}接近25,尝试用一些特殊字符绕过。

https://www.lddgo.net/string/full-half-width-converter

这里全角好像字符会超。

https://symbl.cc/cn/unicode-table/#latin-1-supplement

这里面有很多短的。

图片加载失败


00是省略的,我们直接用他的BA就行了,URL编码%BA。

/attack?payload={{%BApen(%27/flag%27).read()}}

图片加载失败


flag{L@men7XU_d0es_n0t_w@nt_t0_g0_t0_scho01}

fate

题目附件给了两个附件,一个为app.py,还有一个为init_db.py

app.py信息如下

这里可以很明显看到/proxy里面有一个ssrf的点,但是它过滤了所有的字符,所以我们得绕过

思路就是先绕过本地的限制,因为再/1337需要为本地访问才可以,下面就是满足/1337的两层要求,最后就是sql注入获取flag

这里的ssrf点,通过将我们传入的url参数进行拼接到http://lamentxu.top后面,我们可以通过@0:8080来绕过使前面的url无效,下面就是满足/1337的条件

这里需要传入第一个参数为abcdefghi,但是不能出现字母,但是requests.get方法在访问时会将起url进行解码,通过这一点我们就可以想到通过二次url编码绕过,这里是将所有字符二次编码

/proxy?url=@0:8080/1337?0=%2561%2562%2563%2564%2565%2566%2567%2568%2569

在往后,这里获取第二个参数,对其进行特殊处理,实现通过分段,每八位为一组,后面又是通过件二进制数转字符串拼接,处理后通过json的方式来进行解析

所以这里的思路就是通过8位二进制数来进行绕过,这里通过c语言代码来实现

最后就是获取flag的绕过,如果我们直接传{"name":"LAMENTXU"}这里的name长度就大于6了会触发waf

图片加载失败


这里就得通过json在处理非字符串的差异来实现绕过,下面是一个类似环境的脚本,可以查看最后的走到sql语句时拼接后的语句是什么,下面的脚本的用法

由于是本地,我们可以直接访问/1337?0=abcdefghi&1=二进制数

若我们传入的name类型为一个字典类型时,及{"name":{"')":"a"}},此时name就是{"')":"a"},字典的长度是其键的个数,这里的键为 ') ,只有一个所以长度为1。这里有一个注意点,我们的键为 ') ,但是没有触发waf的原因如下:在黑名单检测中如果name为字符串就检查它是否包含有 ' 和 ( ,但是我们如果是字典类型的话,它就转为查看是否字典中的键存在以 ' 或者 ( 命名,而 ') 就不满足该条件,所以这里就可以绕过黑名单,如下图

我们可以看到在传入字典后,这里的')可以用来闭合语句,如果键值为{"name":{"')))))) -- a":"a"}}这样的话就可以注释后面的闭合前面的,这个就满足我们的union查询的条件了

图片加载失败


如下图,通过闭合和union注入,最后的payload需要有变通,因为最后的name="LAMENTXU"这里必需为双引号,导致我们传入的时它会将对应用来闭合的符号都改为单引号,所以我们前面的 ' 就省了,如下图测试结果

图片加载失败


图片加载失败


图片加载失败


出题人又疯

跟之前没什么区别

{{%BApen(%27/flag%27).re%aad()}}

flag{L@men7XU_d0es_n0t_w@nt_t0_t@ke_@ny_f**king_exams}

图片加载失败


不过很多双字节的字母用不了。

图片加载失败


https://symbl.cc/cn/unicode-table/#arabic

Now you see me 1

战了三天的题目。

禁了很多关键点,就不一一列举了。注意request有残余。

request.mimetype - Content-Type

request.origin - Origin

request.referrer - Referer

request.endpoint - 代码函数有关

然后可以利用索引去取到一些字符。例如代码中有函数 r3al_ins1de_th0ught 。

request.endpoint.4 即为下划线 _。虽然这个不可控,但是另外三个我们可以随便控制,也就是可以进行任意字符串的构造,按理来说直接一行把用得到的字符丢进去然后随便取就行了,我这里测试的时候按需取得,所以有点麻烦。

下线之后再上线的题目有点变化,题目环境的waf和给出的源码有些不一样,例如refer,setattr,g|a这种还是存在的,我们可以直接构造config的链子。

我们先利用 request.endpoint.4 拼接一个下划线。

图片加载失败


写了个小脚本,原本打算自动化的,还是半自动保险一些。

主要用到了mystrs_这个函数,根据变量名,变量内容,起始索引生成对应的数据。

利用上述生成的 class 。

图片加载失败


并在 Content-Type 里面补上 class 。然后尝试获取 config 的 class。

图片加载失败


然后依次操作可以获取到对应的 builtins 。原始链子如下:

{%print(config|attr('__class__')|attr('__init__')|attr('__builtins__'))%}

图片加载失败


然后里面有 eval 我们能够取到,这里应该算非预期了,题目删除的模块限制不了这边的 eval 环境。

图片加载失败


构造链如下,对于不需要双下划线的 eval 可以调我前面脚本中的 mystrs 函数。

{%print(config|attr('__class__')|attr('__init__')|attr('__builtins__')|attr('__getitem__')('eval'))%}

然后利用这个 eval 方法去执行 python 代码了。注意前面是一个整体,然后调用它的参数,要加上括号包裹。然后这里执行代码的部分没有使用拼接了,采用 request.origin 方便我们随便构造。

图片加载失败


可以看到能够直接执行命令了。链子如下。

{%print((config|attr(aa)|attr(bb)|attr(cc)|attr(dd)(ff))(request.origin))%}

{%print((config|attr('__class__')|attr('__init__')|attr('__builtins__')|attr('__getitem__')('eval'))("__import__('os').popen('id').read()"))%}

然后去读flag

图片加载失败


flag不像是文本文件,并且很大,压缩之后也会很大。机器中有nc,wget等一系列命令,但是好像是不出网的,静态污染也没成功,直接base64也不行,只能分块进行base64.

base64 /flag_h3r3 | cut -c1-50 # 读前50字符

base64 /flag_h3r3 | cut -c51-100 # 接着读

dd if=/flag_h3r3 bs=1 count=50 2>/dev/null | base64

dd if=/flag_h3r3 bs=1 skip=50 count=50 2>/dev/null | base64

ai 给了好几种,第一个整体 base64 之后再取字节明显效率不高,根据第二种编写脚本。

生成之后 010 看一下,其实就直接出了。

图片加载失败


很明显的 flag 字段,但看着是个 wav 可以丢 DeepSound 里面看。

图片加载失败


图片加载失败


flag{N0w_y0u_sEEEEEEEEEEEEEEE_m3!!!!!!}

拿到最终的 flag 。中间还试过了应该是预期解的部分,不过没成功。构造出如下链子:

{%print(().__class__.__base__.subclass()[104].load_module("sys").modules['eval']("__import__('importlib').reload(__import__('os'))"))%}

这里是可以加载到 os 的,然后依次把被修改的三个模块全部加载,然后进行命令执行。

图片加载失败


好像还是被 waf 了。然后除了 config ,还有 request 、setattr 等去拿 eval 也可以。

图片加载失败


图片加载失败


Reverse

WARMUP

得到的结果是一个rc4加密脚本,给出了密钥

输出结果为:Decrypted Flag: flag{We1c0me_t0_XYCTF_2025_reverse_ch@lleng3_by_th3_w@y_p3cd0wn's_chall_is_r3@lly_gr3@t_&_fuN!}

根据题目提示转为:XYCTF{5f9f46c147645dd1e2c8044325d4f93c}

Dragon

图片加载失败


用file检查时发现是LLVM

直接在win的vs环境中使用clang将bc编译

clang Dragon.bc -o Dragon.exe

但是这里出了点问题,所有我先将他编译成汇编.s然后再编译成exe

图片加载失败


Moon

直接看pyd

图片加载失败


图片加载失败


猜测是一个异或的加密,有随机数种子和密文

外部调用pyd的crypt函数,进行解密即可

Crypto

Division

脚本直接生成

图片加载失败


PWN

Ret2libc' Revenge

程序有个无限制的溢出,因此我们就要想办法去寻找有没有其他的gadget可用,因为是无限的溢出,所以我们可以随便跳回来,难点主要是泄露libc,有了libc,就有了各种gadget和函数

泄露libc肯定是用puts函数,也就是说,我们要想办法让rdi的值为一个地址,这个地址中存放的是一个libc相关的地址

发现了这个两个gadget

0x0000000000401180 : mov rdi, rsi ; ret

只需要让rbp+0x20的位置存放的是5,让rsi5,然后再把rsi赋值给rdi就行了

图片加载失败


DT_STRTAB:字符串表,d_ptr是字符串表地址

d_tag位置刚好为5

那我们就能泄露libc了

注意我们还要使得rsi和rdx为0,使用libc里的gadget很容易就能做到这点

girlfriend


0 条评论
某人
表情
可输入 255

没有评论