以前DYBOY就发布过关于Emlog6.0的代码审计文章,其中就有分析道emlog文章编辑器的XSS漏洞,如果有些含有会员系统的EMLOG网站,就可能会遭到此漏洞攻击,严重可导致盗取管理员cookie,最后网站被黑客入侵拿下webshell。
当然,我这里不会教大家如何去入侵,而是讲一讲如何防御EMLOG的编辑器XSS攻击。关于XSS漏洞的原理,暂时也不讲了,感兴趣的可以去我的博客:DYBOY看看。
Emlog后台使用的编辑器是kindeditor,由于版本较低,对于HTML语法也是直接解析渲染,如果编辑器内的代码有JavaScript代码,也会正常执行。
当管理员查看到含有黑客插入的恶意JavaScript代码的文章时,恶意代码就会执行并获取管理员的cookie,然后将cookie发送给黑客的远程服务器。
在B/S架构中,依靠cookie来鉴别用户身份,cookie就是钥匙,管理员有了cookie,才可以在网站上使用管理员才可以使用的功能。
倘若cookie泄露给黑客,黑客就能拿着你的cookie,打开你网站的门,进行管理员的操作,严重的可导致服务器被入侵,你的网站就再也不是你的了。
从上述我们知道,XSS就是一些JavaScript代码执行并获取cookie。那么我们有什么办法阻止JavaScript代码获取Cookie呐?
答案是HTTPONLY。
httponly是cookie属性之一,当httponly的设置值为 TRUE 时,使得JavaScript无法获取到该值,有效地防御了XSS盗取管理员的 cookie
来到“include\lib\loginauth.php”文件第134行的setAuthCookie函数:
我们将其改为如下代码:
/**
* 写用于登录验证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之四两拨千斤》