Midnight-Sun-CTF-2025-WEB
寒影和寒风萧 发表于 广东 CTF 158浏览 · 2025-05-21 16:41

Hackchan

Condition of getting flag

在views.py中看见了得到flag的条件

即当当前用户的balance大于999_999_999的时候就可以得到flag,所以要看一下逻辑。

bot处理流程

在bot.js中处理problem中的url的过程,这个地方就可以构造路由让admin去访问。

然后和balance有关的函数只有

然后我们现在要找到一个地方去得到balance,于是翻看源码 这里用了TF-IDF,将question转换为了数值向量

然后我们主要看到处理fac这里。

所以我们只需要找一个label匹配到我们的.swp文件(题目故意留的,可以嵌入xss,but我利用vim -r 看不出来是什么问题,所以等wp吧,再补上)
Pasted image 20250519161036.png
因为是.开头的文件,所以在文件系统里面会放在最前面,再回顾我们的fac内容,这里只贴出部分
Pasted image 20250519161335.png
我们只需要匹配其中的media即可,他就会将.swap文件渲染出来。 所以我们只需要让action=fac&question={text}的text内容与对应的question对应上即可
Pasted image 20250519161539.png
playload: https://hackchan-mjk2mpay.ctf.pro/?action=faq&question=How can I get in touch with your PR department for collaboration?<script>alert('hacked by dt')</script>
Pasted image 20250519161735.png
即可触发xss,那么接下来就很简单了,记得我们前面的bot吗,只需要控制这个xss让bot给我们转钱即可。 所以让bot访问: http://web:8000/?action=create-transaction9然后post过去 recipient=deletee&amount=9999999999
Pasted image 20250519170734.png
但是一次最多只能转10块钱,所以还得看一下逻辑,然后注意到处理的时候是分两块的
Pasted image 20250519191140.png
看到这里confirmed_transactions = Transaction.query.filter(Transaction.status == 'confirmed').all()所以我们可以在confirm_transaction之后的间隙将订单的status更改一次为confirmed即可完成转账,也就是race condition 最后的playload:

用的<img src=x onerror="eval(atob('playload'))"/>注意下编码问题即可,最后再次感谢HighDex 用英文说一遍:



Pasted image 20250520131501.png
Pasted image 20250520131550.png


Uselesscorp

扫了一下目录
Pasted image 20250518235452.png
看到class.phpmailer.php的日期找到对应版本为v5.2.17 https://github.com/PHPMailer/PHPMailer/blob/v5.2.17/class.phpmailer.php 打CVE 2016-10033,exp: https://github.com/opsxcq/exploit-CVE-2016-10033 但是发现打不通,说明环境可能和原本的不大一样。 原来是在这里:
Pasted image 20250521231016.png
debian系统一般会用到exim4的MTA,所以我们就去看doc: https://www.exim.org/exim-html-current/doc/html/spec_html/ch-string_expansions.html 发现了如下几个好玩的东西:

${readfile{}{}}可以读取文件然后将其中的换行符替换掉

${readsocket{...}{...}{...}{...}{...}}向本地或远程 socket 发送请求字符串,读取响应数据,并将其插入到当前字符串中。适用于与其他服务通信,如 Redis、Python 微服务、SMTP、HTTP 接口等。

{run,preexpand{option}}运行一个外部命令,将其标准输出作为变量 $value,并依据返回码决定使用哪个返回值。

所以我们可以构造一下sendmail的请求: 注意一下这里的email的格式,遵循RFC 3696,我们用来闭合前面的引号然后用-Ov来让后面的语句无效,这个是HighDex师傅告诉我的,基本上都适用,我们也可以用一个极短的例如@d

于是最后的exp:

Pasted image 20250522002419.png


其他playload(官方给的):

不过思路也是差不多的,只是一个直接read了我是弹shell

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