thinkphp在国内来讲,不少站长以及平台都在使用这套开源的系统来建站,为何会这么深受你们的喜欢,第一开源,便捷,高效,生成静态化html,第二框架性的易于开发php架构,不少第三方的插件以及第三方的开发公司较多,模板能够自定义设计,在thinkphp的基础上能够开发不少大型的虚拟币平台,以及会员平台,商城系统,thinkPHP的官方在系统升级方面作的比较完善,及时更新与修复一些BUG。php
目前官方最新版本是ThinkPHP5.0.20版本,以前的ThinkPHP3.2,ThinkPHP3.一、ThinkPHP3.0都存在过网站漏洞,包括一些高危的远程代码执行漏洞,thinkphp sql注入漏洞,后台管理员XSS跨站漏洞,任意文件上传漏洞等等。目前咱们SINE安全于2018年9月5号,在平常的thinkphp网站安全检测当中,发现某客户使用的thinkphp系统存在着网站sql注入漏洞,危害性较高,一开始觉得客户使用的是较低版本:thinkphp 3.2.3,才会存在这种网站漏洞,可是在实际的安全检测当中发现不单单是这个版本,还包含了目前最新版本5.0.20,关于该网站漏洞的详情与poc利用,咱们一步一步来分析。html
网站安全检测thinkphp漏洞产生原理linux
产生网站漏洞的文件存在于library文件夹下的think文件,里面包含的db文件夹的sql
driver.class.php代码中的第677行开始,在order处理分析的时候发现分析参数里能够插入非法的thinkphp
字符,在key赋值的时候并无作严格的安全限制与过滤,致使攻击者可使用SQL注入语句进数据库
行构造查询数据库里的内容,包括能够查选数据库里的管理员帐号密码, 写入数据库等等的操做。windows
thinkphp 3.2.3漏洞代码以下:缓存
/**安全
* order分析服务器
* @access protected
* @param mixed $order
* @return string
*/
protected function parseOrder($order) {
if(is_array($order)) {
$array = array();
foreach ($order as $key=>$val){
if(is_numeric($key)) {
$array[] = $this->parseKey($val);
}else{
$array[] = $this->parseKey($key).' '.$val;
}
}
$order = implode(',',$array);
}
return !empty($order)? ' ORDER BY '.$order:'';
}
ThinkPHP 5.1.22漏洞代码存在于library文件夹下的think文件里的db/query.php
代码里的第1514行,代码以下:
/**
* 指定排序 order('id','desc') 或者 order
(['id'=>'desc','create_time'=>'desc'])
* @access public
* @param string|array $field 排序字段
* @param string $order 排序
* @return $this
*/
public function order($field, $order = null)
{
if (empty($field)) {
return $this;
} elseif ($field instanceof Expression) {
$this->options['order'][] = $field;
return $this;
}
if (is_string($field)) {
if (!empty($this->options['via'])) {
$field = $this->options['via'] . '.' . $field;
}
if (strpos($field, ',')) {
$field = array_map('trim', explode(',', $field));
} else {
$field = empty($order) ? $field : [$field => $order];
}
} elseif (!empty($this->options['via'])) {
foreach ($field as $key => $val) {
if (is_numeric($key)) {
$field[$key] = $this->options['via'] . '.' . $val;
} else {
$field[$this->options['via'] . '.' . $key] = $val;
unset($field[$key]);
}
}
从以上thinkphp 3.2.3 、thinkphp 5.0的代码里能够分析出来,当order在分析关联函数的时候会赋值于key值中,能够掺入sql注入语句执行攻击网站,并能够拼接方式绕过sql安全过滤,致使能够执行sql语句,查询数据库,操做数据库。
thinkphp漏洞利用详情:
thinkphp漏洞修复建议:
若是是低版本的thinkphp 3.*的系统,请尽快升级到thinkphp最高版本。
若是是高版本的thinkphp 5.*的系统,请尽快升级到thinkphp最高版本。
若是网站被攻击了,请尽快作好网站的安全备份,查找网站存在木马后门,对其代码里被篡改的代码进行修复,并作好网站安全加固,对一些缓存文件夹进行安全权限设置,若是对网站漏洞修复不是太懂的话能够找专业的网站安全公司去处理,国内SINE安全公司,绿盟安全,启明星辰都是比较专业的。若是网站使用的是单独服务器好比linux系统、windows系统,能够部署网站防火墙,来防止sql注入攻击。网站默认的管理员后台地址能够修改成比较繁琐的地址。