某部落格乙個XSS漏洞的修復

2021-12-29 22:00:58 字數 1935 閱讀 6093

幾天前看到余弦大牛發微博說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漏洞 上次也提到,解決這個問題的根本在於杜絕不合法的函式在頁面內執行。上次透...