1 | 文章首发于安全客 https://www.anquanke.com/post/id/198479 |
Codegate 还是有很多国际强队参加的,这里记录两道 Codegate Web题。
CSP
分析
题目给了 api.php 的代码:
1 |
|
题目的 CSP 的策略是 default-src 'self'; script-src 'none'; base-uri 'none';
,这基本给堵死了,直接打 cookie 不可能了。
index.php 可以给一个API,得到签名,但是不支持一次多个API,我们没有 key,这里明显是一个哈希长度扩展攻击的考点,采用 salt+msg
的方式进行哈希。
接着 api.php,发现可以设置 header,设置 cookie,输出内容。设置 header做了一定过滤,无法覆盖 CSP 设置。body 这部分过滤没啥用,preg_match 的 . 不匹配 \n。
关键在于使 CSP 失效,可以设置 HTTP 状态码为 102 使 CSP 失效,同时可以执行js。为了验证我本地写了个 php:
1 |
|
我用 nimmis/apache-php7 这个镜像起了个 docker,发现 chrome 是不可以的:
开始以为 chrome 版本问题,试了旧版本还是不行。
我用 mac 自带的 apache 和 php 环境试了一下,发现是可以的。。。
这与 server 还有关系?感兴趣的师傅可以研究解答一下…
这道题的环境也是可以的,我们随便拿到一个签名,然后用哈希扩展攻击得到想要的签名。
exp
1 | import requests |
访问,发现可以弹窗:
改变 xss payload 为打 cookie的,提交给 bot,可以打到cookie:
Render
Description
1 | It is my first flask project with nginx. Write your own message, and get flag! |
下载可以得到 settings/run.sh:
1 |
|
以及 docker file:
1 | FROM python:2.7.16 |
我们能从中得到的主要是目录结构,结合题目描述 nginx,应该存在 nginx 目录遍历。
http://110.10.147.169/static../src/uwsgi.ini
,可以下到文件。
获取源码
读源码:
http://110.10.147.169/static../src/app/__init__.py
:
1 | from flask import Flask |
读routes:
``http://110.10.147.169/static../src/app/routes.py`
1 | from flask import Flask, render_template, render_template_string, request, redirect, abort, Blueprint |
分析
可以发现我们 flag 在 config 中,想到 SSTI。
题目还提供了一个类似 SSRF 的功能,让服务器帮我们去请求,这里用的是 urllib2.urlopen(url)
,这里存在 http 头注入的问题。
再看一下 admin 接口,会把 rip,也就是 xff 头写到日志里,我们可以通过 /admin/ticket 接口来访问日志(当然我们有了目录遍历,也可以直接下载)
如何才能 SSTI 呢,当访问 /admin/ticket 接口时会把日志结果用 render_template_string
渲染,所以我们的思路很清楚了:把 SSTI payload 先放到 xff 头里,访问 admin 接口把 payload 写到日志里,再去访问 /admin/ticket 接口实现 SSTI,头部控制可以利用 urllib 的 HTTP 注入。
exp
首先请求 /admin:
得到 ticket,再请求 /admin/ticket:
参考: