Emlog修復後臺編輯器存儲型XSS漏洞的方法

以前DYBOY就發佈過關於Emlog6.0的代碼審計文章,其中就有分析道emlog文章編輯器的XSS漏洞,如果有些含有會員系統的EMLOG網站,就可能會遭到此漏洞攻擊,嚴重可導致盜取管理員cookie,最後網站被黑客入侵拿下webshell。

xss防禦.jpg

當然,我這裏不會教大家如何去入侵,而是講一講如何防禦EMLOG的編輯器XSS攻擊。關於XSS漏洞的原理,暫時也不講了,感興趣的可以去我的博客:DYBOY看看。

一、XSS攻擊會帶來的風險?

Emlog後臺使用的編輯器是kindeditor,由於版本較低,對於HTML語法也是直接解析渲染,如果編輯器內的代碼有JavaScript代碼,也會正常執行。

當管理員查看到含有黑客插入的惡意JavaScript代碼的文章時,惡意代碼就會執行並獲取管理員的cookie,然後將cookie發送給黑客的遠程服務器。

在B/S架構中,依靠cookie來鑑別用戶身份,cookie就是鑰匙,管理員有了cookie,纔可以在網站上使用管理員纔可以使用的功能。

倘若cookie泄露給黑客,黑客就能拿着你的cookie,打開你網站的門,進行管理員的操作,嚴重的可導致服務器被入侵,你的網站就再也不是你的了。

二、如何防禦Emlog中的XSS攻擊?

從上述我們知道,XSS就是一些JavaScript代碼執行並獲取cookie。那麼我們有什麼辦法阻止JavaScript代碼獲取Cookie吶?

答案是HTTPONLY。

httponly是cookie屬性之一,當httponly的設置值爲 TRUE 時,使得JavaScript無法獲取到該值,有效地防禦了XSS盜取管理員的 cookie

三、Emlog內核改造

來到“include\lib\loginauth.php”文件第134行的setAuthCookie函數:

emlog設置用戶的cookie.jpg

我們將其改爲如下代碼:

/**
* 寫用於登錄驗證cookie
*
* @param int $user_id User ID
* @param bool $remember Whether to remember the user or not
*/
public static function setAuthCookie($user_login, $ispersis = false) {
if ($ispersis) {
$expiration = time() + 3600 * 24 * 30 * 12;
} else {
$expiration = null;
}
$auth_cookie_name = AUTH_COOKIE_NAME;
$auth_cookie = self::generateAuthCookie($user_login, $expiration);
setcookie($auth_cookie_name, $auth_cookie, $expiration,'/', '', false,true);
}

另外還需要將212行的genToken函數改爲:

/**
* 生成token,防禦CSRF攻擊
*/
public static function genToken() {
$token_cookie_name = 'EM_TOKENCOOKIE_' . md5(substr(AUTH_KEY, 16, 32) . UID);
if (isset($_COOKIE[$token_cookie_name])) {
return $_COOKIE[$token_cookie_name];
} else {
$token = md5(getRandStr(16));
setcookie($token_cookie_name, $token, 0, '/', '', false, true);
return $token;
}
}

這樣就給關鍵的cookie設置上了httponly檢查,如此JavaScript代碼無法執行,黑客也就無法獲取到任何用戶的cookie了!充分保證了網站的安全!

四、效果演示:

 

參考文章:《[XSS防禦]HttpOnly之四兩撥千斤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章