修复了博客的一个XSS漏洞

分类:
标签:
分享到:

几天前看到余弦大牛发微博说SCANV升级新版,就去注册了一下,结果检测到这个博客存在一个XSS漏洞,导致最后安全评分只有可怜的65分。

这样可不行,于是搬出《白帽子讲Web安全》,开始修复博客的漏洞……

XSS问题出在搜索框里,根据SCANV的提示,如果请求
http://www.hcocoa.com/search?keywords="><script>confirm(1503)</script>
就会形成XSS,可见原因是由于keywords变量未过滤。

在源代码里定位到这一段:
class SearchPage(UserHandler):
	def get(self):
		request = self.request
		GET = request.GET
		keywords = GET['keywords']
		if keywords:
			keywords = keywords.strip()
		if keywords:
			cursor = unquoted_cursor(GET['cursor'])
			articles, next_cursor = Article.search(keywords, None if request.is_admin else True, cursor)
			self.echo('search.html', {
				'title': '搜索结果',
				'articles': articles,
				'next_cursor': next_cursor,
				'keywords': keywords,
				'cursor': cursor,
				'page': 'search'
			})
		else:
			self.echo('message.html', {
				'page': 'message',
				'title': '请输入搜索关键字',
				'h2': '连关键字都没有,你搜索啥啊?',
				'msg': '填几个关键字再试试吧'
			})
可以看到keywords的确没有经过过滤,这就是产生XSS的根本原因。

下面着手解决这个问题(翻书ing……),白帽子P101提到了在地址中的XSS只需要URLEncode即可。经过翻找,发现Doodle博客使用了postmarkup这个模块,里面包含了quoted_string()这个函数,于是修改代码为
keywords = quoted_string(GET['keywords'])
再使用SCANV检测发现漏洞不存在了,评分升级到99分(扣掉的1分是误报,后文将会提到)。不过出现了新的问题:搜索功能失效了……

经过排查,得知是因为被编码后的keywords无法进行搜索操作。因为XSS仅仅是在展示页面的时候才会产生,于是继续修改代码,在产生HTML页面时再过滤:
'keywords': quoted_string(keywords),

本以为问题就这样解决了,谁知道又有了新的Bug:Google自定义搜索失效,原因还是因为keywords被编码……为了在Google自定义搜索时解码,找到postmarkup的如下代码:
def quoted_string(unicode, coding='utf-8'):
	return quote(unicode.encode(coding), '_.-+/=~,;&:!*$()')
发现其使用了quote()函数,那我们只需要在Google自定义搜索的时候unquote()就行了。但是经过修改后发现,虽然自定义搜索恢复了,随之而来的XSS漏洞也恢复了……只好输出时再增加了escape()函数,最后变成了这样:
customSearchControl.execute('#{escape(unquote(keywords).replace("\\", r"\\").replace("'", r"\'"))}');
所有功能恢复,并且解决了XSS问题。正在写这篇文章的时候突然想到,既然定位到了是由于Google自定义搜索产生的XSS,那么直接在自定义搜索的时候escape()一下不就可以了?

经过试验,上面的猜想是正确的:仅仅需要在google_search.html里修改一行代码(加上escape)即可:
customSearchControl.execute('#{escape(keywords.replace("\\", r"\\").replace("'", r"\'"))}');

由此便完成了XSS漏洞的修补,SCANV的评分也维持在了99分,唯一扣掉的一分是因为SCANV认为这篇博文《从WordPress错误日志里发现SQL注入扫描攻击》泄漏了数据库信息。好吧,那不是俺的数据库,只不过是一段样例代码,已经报告给余弦牛了,希望可以尽快将给俺加到100分。

本篇文章的内容其实很简单,HCocoa作为小菜鸟在修复漏洞的过程中走了不少弯路,记录一下也算是学习历程吧。今天余弦牛发布了《知道创宇研发技能表》,里面的东西值得好好学一下;另外《白帽子讲Web安全》也在桌子上摆了很久了,这本书介绍的相当详细,一定要争取看完。最后希望明天的腾讯实习生面试顺利!


本文地址:http://www.hcocoa.com/2013/04/23/Fixed-An-XSS-Vulnerability-of-Doodle-Blog
原创文章如转载,请注明链接: 转自HCocoa的博客
你可能还会对下列文章感兴趣: