据统计,全球29%的网站使用的都是wordpress。由于wordpress的使用非常广泛,使得wordpress插件的安全问题成为了网络犯罪分子们关注的焦点。一般来说,第三方提供的插件其安全等级肯定没有wordpress核心插件的安全等级高,因此它们对于攻击者来说,绝对是极具吸引力的攻击目标。为了入侵目标wordpress站点,攻击者需要利用插件中的安全漏洞,那么静态代码分析技术能检测到这些漏洞吗?
在这篇文章中,我们将会对2017年影响最为严重的插件漏洞进行分析。除此之外,我们还会跟大家介绍静态代码分析工具如何才能检测到这些漏洞。
二、漏洞选取
我们选取公开已知插件漏洞的条件如下:
发布于2017年
受影响的插件安装量非常大
漏洞影响严重
不需要认证或对服务器有任何要求(例如wp statistics插件的sqli漏洞)
不会影响非开源的商业插件
rips可以对非wordpress核心插件进行代码分析,接下来,我们会对wordpress的相关功能进行分析,并介绍如何对插件进行深入的代码分析。
1. loginizer 1.3.5-sql注入漏洞(cve-2017-12650)
目前,总共有55万wordpress站点安装了loginizer插件。这款插件的作用理应是通过屏蔽暴力破解攻击、启用双因素身份验证、以及recaptcha验证码机制来给wordpress的登录功能增加安全性。但是在今年八月份,研究人员在loginizer的登录程序中发现了一个sql注入漏洞,而这个漏洞反而会让原本需要得到保护的管理员凭证处于安全风险之中。
接下来,我们一起看一看包含漏洞的代码,并且跟大家解释静态代码分析工具(以下简称sast工具)如果想要检测到这类漏洞的话,需要什么样的要求。在接下来的分析过程中,我们给大家提供的只是简单的代码段,而实际的分析会更加复杂。
(1) 第一步:识别自定义的sql封装器
首先,sast工具最基本的就是要识别出该插件中用户自定义的函数lz_selectquery(),这个函数可以利用wordpress的数据库驱动器来执行sql语句。当这个函数被调用的时候,它需要对第一个参数进行sql注入检测。
modules/emails/detailview.php
functionlz_selectquery($query,$array=0){
global$wpdb;
$result=$wpdb->get_results($query,'array_a');
}
(2)第二步:识别输入来源
对于sast工具而言,另一种基本功能就是它必须能够识别出php中所有常见的和不常见的用户输入来源。但攻击者可以修改用户自定义函数lz_getip()所返回的http请求头,因此该函数所返回的值就是不可信的了,所以整个数据流必须进行精准跟踪。
modules/emails/detailview.php
functionlz_getip(){
global$loginizer;
if(isset($_server["remote_addr"])){
$ip=$_server["remote_addr"];
}
if(isset($_server["http_x_forwarded_for"])){
$ip=$_server["http_x_forwarded_for"];
}
return$ip;
}
(3)第三步:分析wordpress的action和filter
wordpress允许我们定义各种不同的action来调用自定义函数,为了跟踪插件的控制流程,sast工具必须要了解这些回调的运行机制。在下面给出的代码段中,我们可以看到loginizer_load_plugin()函数是通过action调用的,这个函数可以从lz_getip()函数中获取用户输入,并将其存储再全局数组$loginizer之中,然后再通过wordpress filter来调用另一个自定义函数loginizer_wp_authenticate()。因此,除了wordpress action之外,sast工具还需要了解wordpress filter的工作机制。
modules/emails/detailview.php
functionloginizer_load_plugin(){
global$loginizer;
$loginizer['current_ip']=lz_getip();
add_filter('authenticate','loginizer_wp_authenticate',10001,3);
}
add_action('plugins_loaded','loginizer_load_plugin');
(4)第四步:分析全局变量
虽然下面这段代码对于我们人类来说可以轻易看懂,但是对于sast工具来说分析起来可就非常复杂了。它需要通过多个函数调用来分析全局数组$loginizer的数据流,只有这样它才能够检测到lz_getip()函数传递给loginizer_can_login()函数(为对sql语句中的拼接内容进行数据过滤)的用户输入信息。其中的sql语句是通过自定义的sql函数lz_selectquery()实现的,虽然wordpress可以通过模拟magic_quotes来防止注入,但是来自http头中的恶意用户输入数据并不会受此影响。
modules/emails/detailview.php
functionloginizer_wp_authenticate($user,$username,$password){
global$loginizer,$lz_error,$lz_cannot_login,$lz_user_pass;
if(loginizer_can_login()){
return$user;
}
}
functionloginizer_can_login(){
global$wpdb,$loginizer,$lz_error;
$result=lz_selectquery("select*from".$wpdb->prefix."loginizer_logs
whereip='".$loginizer['current_ip']."';");
}
由于rips的分析算法主要针对的是php语言,因此它对wordpress的分析会比较到位,因此它能够识别出wordpress复杂的数据流,并成功检测出插件中的sql注入漏洞。
2. ultimate form builder lite 1.3.6-sql注入漏洞(cve-2017-15919)
ultimate form builder插件目前的安装量已经超过了5万,它允许我们使用拖拽的形式来创建联系表单。在今年十月份,研究人员在该插件中发现并报告了一个严重的sql注入漏洞,而该漏洞将允许攻击者接管目标wordpress网站。
接下来,我们会分析代码中存在的问题,以及sast工具如何才能检测到这个安全漏洞。
(1)第一步:识别上下文环境
首先,插件要执行的所有sql语句都需要被分析,虽然wordpress数据库驱动跟插件代码无关,但它所使用的方法(例如get_rwo())是可以被rips引擎识别的(搜索潜在的sql注入漏洞)。
modules/emails/detailview.php
classufbl_model{
publicstaticfunctionget_form_detail($form_id){
global$wpdb;
$table=ufbl_form_table;
$form_row=$wpdb->get_row("select*from$tablewhereform_id=$form_id");
return$form_row;
}
}
在这里,引擎可以分析sql语句以识别注入环境。一般来说,这种地方的安全漏洞是很难被发现的。如果它读取的是form_id=’$form_id’而不是form_id=$form_id,那么这条语句就没有安全问题了,因为wordpress可以对用户的输入进行甄别。因此,只有那些上下文环境敏感的sast工具才能够感知到这种隐蔽的安全问题。
(2)第二步:跟踪用户输入数据流
这一步相对来说比较简答,你可以从在下面的代码中看到,如果工具无法分析到$form_id的潜在隐患,那么受污染的数据将有可能扩散到其他功能函数中。
modules/emails/detailview.php
classufbl_lib{
publicstaticfunctiondo_form_process(){
$form_data=array();
foreach($_post['form_data']as$val){
if(strpos($val['name'],'[]')!==false){
$form_data_name=str_replace('[]','',$val['name']);
if(!isset($form_data[$form_data_name])){
$form_data[$form_data_name]=array();
}
泉州到东海物流专线
新站SEO要怎么做?如何让优化排名突飞猛进?
南京网站建设-网站通用的技术维护
千万不要拿对手网站来判定网站优化效果
温州到桂阳物流专线
北京哪些行业开发小程序更好?
网站优化之seo思维的探索
北京网站建设中图片优化技巧