Codegate 2020 Web Writeup

一共2道Web题

CSP

题目一共三个页面view.php(API提交页面),api.php(通过验证输入的md5来加载自定义页面),report.php(提交url页面)都有相同的CSP:

完全禁用了javascript view.php输入参数提交name,p1,p2后会生成一个iframe来显示api.php
题目提供了api.php的源码:

其中api.phpq参数是base64(base64(name),base64(p1),base64(p2))后的值
sigmd5($salt."base64(name),base64(p1),base64(p2)")的值,如果验证成功则正常显示 可以看到代码中有个注释为//APIs Format : name(b64),p1(b64),p2(b64)|name(b64),p1(b64),p2(b64) ...
支持多个API输入,不过在view.php中我们只能输入产生一个API,所以先要构造能输入多个API的sig
这里需要用到hash拓展攻击来构造md5,这里用的工具是HashPump 首先在view.phpname,p1,p2都设置为空得到 /api.php?sig=7f104404b0d414d18ab3efb831e333d7&q=LCw=
这样q解base64为,,,而sig的值为md5($salt.',,')
由于我们暂时不知道$salt长度,为了验证
首先base64('hello')得到aGVsbG8=,于是构造,,|aGVsbG8=,,如果能显示Hello, World!则说明攻击成功 通过$ hashpump -s '7f104404b0d414d18ab3efb831e333d7' --data ',,' -a '|aGVsbG8=,,' -k 12 修改这里-k的参数(也就是salt长度)不断去尝试
发现-k设置为12时页面能正确返回

到这里我们可控一个返回页面的header(冒号前有长度限制),cookie,html(通过"%0a"绕过preg_match限制,如<script%0a>alert(1)</script%0a>) 接下来是要绕过CSP
通过php的header()设置的响应头,查看官方文档
通过404报错页面得知服务器版本:nginx/1.14.0 (Ubuntu)
不过源码header()中有个:不知是否影响,直接试一试 这样状态码就是可控的,而且http为某些状态码时可以发现响应包并无CSP
构造修改header的同时添加html:

可成功触发js弹窗 构造获取cookie再通过report发送即可
flag: CODEGATE2020{CSP_m34n5_Content-Success-Policy_n0t_Security}

renderer

题目描述是用nginxflask写的,且给了 Dockerfile:

和 run.sh:

存在文件读取漏洞 http://110.10.147.169/static../run.sh 最后找到源码

85行urllib存在CRLF漏洞 70行return render_template_string(log)存在模板注入漏洞 需要通过CRLF构造各种header并将模板注入代码写入log 由于rip可以由XFF伪造,而且将rip写入了log,故这里可任意写入

flag: CODEGATE2020{CrLfMakesLocalGreatAgain}