ISCTF2025
本文最后更新于 2026年2月6日 下午
ezrce
1 | |
只允许使用字母和一部分符号,先找到flag的位置 在根目录
1 | |
数组但是用不了数字,而且只能返回文件名,所以先进入根目录再随机读取,多刷新几次就出来了
1 | |
flag?我就借走了
上来就是一个上传,还提示我会解压到目录,直接考虑软链接
1 | |

参考文献
b@by n0t1ce b0ard
考察CVE复现

查询漏洞库发现registration.php有漏洞,审计代码
1 | |
上传代码这里没有校验文件后缀名,直接上传一句话木马即可
难过的bottle
某人一个一个打包测试了一个多小时最后发现给了源码(QAQ)
注意注意!本题不是jinja2模版而是bottle,ssti注入有差别
1 | |
它对上传的文件解压后进行渲染,可以从这里注入
大部分字母全过滤了,刚好剩一个flag,关键字用全角绕过
也可以斜体绕过
补充——八进制绕过
1 | |
即:
参考文献
[♪(^∇^*)欢迎肥来!Python Bottle SSTI注入 | Jatopos的博客](https://jatopos.github.io/2025/10/05/Python Bottle SSTI注入/#python3-bottle框架斜体字引发的ssti模板注入)
来签个到吧
这种php反序列化还是第一次见
首先审计代码 index.php
1 | |
class.php
1 | |
api.php
1 | |
所以思路就是利用反序列化写入木马
1 | |
还有一种做法是url=/flag,然后用api.php读取结果,但是不是很理解为什么能读到
Bypass
1 | |
过滤实在太恐怖,没啥思路,贴一下wp
这里联想到creat_function,抓包看下php版本(create_function在php7.3中被废弃,在php8.0中被移除,所以php版本十分重要):
这里是php7.1,那就是这个方法了
我们先看看create_function的实现是怎么样的:
1 | |
从中我们可以看出,这个函数实际上是创建了一个匿名函数,放入eval中执行命令,这给了我们极大的构造空间
第一个参数可以不传,表示方法不需要传入值,第二个参数构造}闭合掉匿名函数,;开启下个命令,//注释掉后面的}”,就可以开始操作了
我们构造};system(‘ls /‘);//,但是这里对$b有过滤,我们使用8进制绕过(16进制也行,但是c会被waf,异或一下也能写)
1 | |
kaqiWeaponShop
又是知识盲区,考察SQLite数据库和order by盲注
首先测试注入位置
1 | |
也就是说SQL语句大概率是这样的
1 | |
怎样测是什么数据库?
1 | |
下面就是order by盲注了
1 | |
但是发现like和=被过滤了,那么就是二分法查询了
ezpop
1 | |
链子比较简单,md5弱比较写个小脚本也就跑出来了
1 | |
一开始我想到的payload是
1 | |
一定要注意 \ 转义或者内部使用单引号
mv_upload
考察mv操作符和恶意文件名构造
dirsearch扫一下目录,发现vim源码泄露

关键代码
1 | |

这里考察的是-S操作符,对于已经存在的文件,-S操作符会替换备份文件的后缀(可指定),从而达到构造恶意php文件,从而getshell
所以就要构造这样的命令
1 | |
先上传.t文件,内容是木马
再依次上传-S,php,t.的空文件即可
Who am I
没有系统学过原型链污染,照着wp做了一下
首先登录修改post中type的值进入管理员后台查看源码
分析源码,发现两处漏洞
1.原型链污染
1 | |
其中的globals()返回当前模块中所有全局变量的字典,在Flask应用中,最重要的全局变量通常是app.
pydash.set_():
pydash是Python版的lodash。lodash是JS里一个处理数据的第三方库,主打一个方便,其中_.get可以安全取值,_.set可以深层赋值,后者允许你用字符串路径来修改值。(这很夸张,比如写_.set(obj,'a.b.c','value'),他会自动找到a下面的b下面的c,再赋值)其中最著名的漏洞就是原型链污染(Prototype Pollution),你可以通过_.set传入__proto.isAdmin,修改所有对象的基类,让所有用户变成管理员。pydash的写法稍有不同:
从python本来的app.jinja_loader.searchpath = "/"到pydash.set_(app,'jinja_loader.searchpath','/')。他接收三个参数,以这题为例:
Username是对象,password是路径,confirm_password是值。
我们给username赋值app(app对象是由Flask(__name__)生成的实例,存着所有的配置),改app相当于在修改服务器的运行规则。

我们给password赋值jinja_loader.searchpath,再将value篡改为/,这样调用render_template()函数时,Flask就会默认去根目录找文件。
2.任意模版渲染
1 | |
那么前面已经到根目录了,这里可以直接渲染flag
1 | |
补充——WAF
