修復了博客的一個XSS漏洞

分類:
標簽:
分享到:

幾天前看到余弦大牛發微博說SCANV升級新版,就去注冊了一下,結果檢測到這個博客存在一個XSS漏洞,導致最后安全評分只有可憐的65分。

這樣可不行,于是搬出《白帽子講Web安全》,開始修復博客的漏洞……

XSS問題出在搜索框里,根據SCANV的提示,如果請求
http://www.503809.live/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.503809.live/2013/04/23/Fixed-An-XSS-Vulnerability-of-Doodle-Blog
原創文章如轉載,請注明鏈接: 轉自HCocoa的博客
你可能還會對下列文章感興趣:

广西快3基本走势一定牛