幾天前看到余弦大牛發微博說scanv公升級新版,就去註冊了一下,結果檢測到這個部落格存在乙個xss漏洞,導致最後安全評分只有可憐的65分。
這樣可不行,於是搬出《白帽子講web安全》,開始修復部落格的漏洞……
xss問題出在搜尋框裡,根據scanv的提示,如果請求
">就會形成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', )
else:
self.echo('message.html', )可以看到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('#');所有功能恢復,並且解決了xss問題。正在寫這篇文章的時候突然想到,既然定位到了是由於google自定義搜尋產生的xss,那麼直接在自定義搜尋的時候escape()一下不就可以了?
經過試驗,上面的猜想是正確的:僅僅需要在google_search.html裡修改一行**(加上escape)即可:
customsearchcontrol.execute('#');
由此便完成了xss漏洞的修補,scanv的評分也維持在了99分,唯一扣掉的一分是因為scanv認為這篇博文《從wordpress錯誤日誌裡發現sql注入掃瞄攻擊》洩漏了資料庫資訊。好吧,那不是俺的資料庫,只不過是一段樣例**,已經報告給余弦牛了,希望可以盡快將給俺加到100分。
本篇文章的內容其實很簡單,hcocoa作為小菜鳥在修復漏洞的過程中走了不少彎路,記錄一下也算是學習歷程吧。今天余弦牛發布了《知道創宇研發技能表》,裡面的東西值得好好學一下;另外《白帽子講web安全》也在桌子上擺了很久了,這本書介紹的相當詳細,一定要爭取看完。最後希望明天的騰訊實習生面試順利!
Gmail的三個XSS漏洞
起這個名字完全有標題黨的嫌疑,相信會有很多人慕名而來。其實這是看到老外的一篇部落格cross site scripting in google mail有感而寫,關於gmail的xss,相信做這方面研究的人會有很多感觸。gmail的成功是諸多有才之士造就的,在攻與防的對立中gmail成長 了,安全研...
linux乙個漏洞的分析
程式最早是國外的大佬寫的。這個漏洞的原理非常簡單,就是利用coredump的時候,可以在 etc cron.d目錄下生成core檔案。而在 etc cron.d目錄下的檔案,crontab會定時以指定的使用者許可權來執行。如果在core檔案中,指定使用者許可權是root,那麼 就能夠以我們希望的方式...
乙個跨域請求的XSS續
之前討論過,在解決post跨域請求時,採用iframe 本域 頁的形式,相容性 當然是包括ie6啦 是最好的。上次提到,頁面的作用是 執行本域下的 函式。就是這個原因,給xss帶來了便利。詳細說明,請參考乙個跨域請求的xss漏洞 上次也提到,解決這個問題的根本在於杜絕不合法的函式在頁面內執行。上次透...